(很抱歉帖子太长,请参阅下面的结论)
我设置了一个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' );
工作起来很有魅力!
据我所知,这对你也有用。