Wordpress导航菜单页面项目随机消失


Wordpress Nav Menu page items disappearing randomly

(很抱歉帖子太长,请参阅下面的结论)

我设置了一个WP多站点,有些站点处于生产模式(使用域别名),有些站点仍然没有"启动"。目前有五个站点在运行。

然而,我有一个非常奇怪的问题:一些wp-nav菜单项正在随机消失。只有页面项目消失了——自定义链接、类别等等仍然存在。页面仍然存在,它们只是从菜单中删除。这种情况大约每周发生一次。最初几次我一直在网站上工作,所以我认为是我做了一些事情。但最近,它发生在一个周末的半夜,当时我和我的客户都没有接触过这个网站。

通常这看起来像是某种连锁反应——当菜单项在一个网站上消失时,有时会在另一个网站消失,但并不总是如此——也不总是同时消失。例如,今天,其中两个网站上的菜单消失了(http://wasabicms.se)以及(http://womenswellness.se),所以我检查了其他的,它们都很好。然后,几分钟后,它在另一个网站上消失了。

服务器管理员已经查看了mysql、php和apache日志,没有发现任何异常。消失的菜单项已不在wp_posts中。不幸的是,我们无法激活mysql查询日志,因此我们无法确定它们是如何删除的。

安装并激活的插件有:

  • 高级自定义字段

  • 高级自定义字段:选项页面

  • 高级自定义字段:中继器字段

  • 博客复印机

  • 联系表格7

  • Jetpack

  • 新用户批准

  • 重定向(Urban Giraffe的重定向)

  • 简单301重定向

  • Wordpress进口商

  • Wordpress MU域映射

  • Wordpress SEO(由Yoast)

  • WP Instagram小工具(按代码为人民)

然而,除了新用户批准和Wordpress MU域映射之外,我一直在其他项目中使用它们,没有任何问题。我无法停用它们,因为所有网站都在使用它们,有些网站处于生产模式。


结论

WP导航菜单项(仅限页面)正在从多站点的菜单中消失。页面本身仍然存在,只有导航菜单链接消失。这种情况是随机发生的(每周一次),即使没有人处理代码或登录到管理员。没有从php、mysql或apache记录错误。


很抱歉帖子太长了,但我真的认为必须详细解释。有人认识这个问题吗?或者可以为我指明正确的方向?我觉得我什么都试过了。提前感谢您!

我在一个新设置的自定义主题中遇到过这种情况,这个问题与我在函数文件中注册几个菜单时的打字错误/重复有关。我创建了菜单,发现即使不在网站上工作,菜单也会在另一个时间随机消失,没有任何解释。考虑到尝试可能很快,可以考虑探索相同的选项,确保菜单正确注册,并完全重命名。

终于解决了!

我们有一些只有登录用户才能看到的页面。这是在postmeta/自定义字段(由ACF生成)中定义的。在header.php中,我们有一个if语句,如下所示,因此会提示用户登录,而不是只面对一个空白页面:

if ( ! is_user_logged_in() && get_field( 'show_page_logged_in_user' ) ) {
    // ... show login form
    get_footer();
    exit;
}

但为了防止页面出现在搜索结果和RSS提要中,我们还将此代码添加到functions.php:

function pre_hide_if_not_logged_in( $query ) {
    if ( ! is_user_logged_in() ) {
        $query->set( 'meta_query',
        array(
            'relation' => 'OR',
            array(
                'key'     => 'show_page_logged_in_user',
                'value'   => '%yes%',
                'compare' => 'NOT LIKE'
            ),
            array(
                'key'     => 'show_page_logged_in_user',
                'compare' => 'NOT EXISTS',
            )
        ) );
    }
}
add_action( 'pre_get_posts', 'pre_hide_if_not_logged_in' );

在应用了SQL记录器之后,我们发现这也适用于Wordpress cron作业。但当然,只有当cron作业为未登录的用户运行时,它才显得完全随机,但(几乎)是同步的。因此,我们取消了pre_hide_if_not_logged_in操作,现在一切似乎都保持不变。我们将其替换为以下内容。它没有那么安全,但它不会真正干扰数据库查询。

function hide_if_not_logged_in( $content ) {
    if ( get_field( 'show_page_logged_in_user' ) && ! is_user_logged_in() ) {
        return '';
    }
    return $content;
}
add_filter( 'the_content', 'hide_if_not_logged_in' );
add_filter( 'the_excerpt', 'hide_if_not_logged_in' );

我真的希望这能让别人少头疼。

我有完全相同的行为,在cron作业期间菜单消失,因为有一个自定义函数通过使用'pre_get_posts'钩子更改查询来隐藏帖子。我找到了一个更简单的方法(至少对于我的设置),那就是在更改查询之前检查运行的代码是否在cron作业中:

function pre_hide_if_not_logged_in( $query ) {
    if (defined('DOING_CRON')) {
        // we're running the cron, so return the query untouched
        return $query;
    }
    // now, since we're not running the cron, proceed to alter the query
    if ( ! is_user_logged_in() ) {
        // alter query here
        // ...
    }
}
add_action( 'pre_get_posts', 'pre_hide_if_not_logged_in' );

工作起来很有魅力!

据我所知,这对你也有用。