(对不起,我很抱歉,见下文结论)
我有一个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 Widget(代码为人民)
但是,除了新用户批准和Wordpress MU域映射之外,我一直在使用其他所有项目而没有任何问题。我无法停用它们,因为所有站点都使用它们,有些站点处于生产模式。
结论
WP导航菜单项(仅限页面)正从多站点的菜单中消失。页面本身仍然存在,只有导航菜单链接消失。这是随机发生的(每周一次),即使没有人正在处理代码或登录到管理员。没有从php,mysql或apache记录错误。
对不起,我很抱歉,但我真的认为必须详细解释。有谁认识到这个问题?或者可以指出我正确的方向?我觉得我已经尝试了一切。非常感谢你!
答案 0 :(得分:0)
我曾经使用新设置的自定义主题发生过这种情况,当我在函数文件中注册了几个菜单时,问题与错误/重复相关。我创建了菜单,发现即使不在网站上工作,菜单也没有随机解释。作为一个想法,因为它可能很快尝试,考虑探索相同的选项,并确保菜单已正确注册,并完全重命名。
答案 1 :(得分:0)
最后解决了它!
我们只有登录用户可以看到的几个页面。这是在postmeta / custom字段(由ACF生成)中定义的。在header.php
中我们有如下所示的if
语句,因此系统会提示用户登录而不是仅仅面对空白页面:
if ( ! is_user_logged_in() && get_field( 'show_page_logged_in_user' ) ) {
// ... show login form
get_footer();
exit;
}
但为了防止网页出现在搜索结果和RSS Feed中,我们还将此代码添加到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' );
我真的希望这能让一些人感到头疼。
答案 2 :(得分:0)
我有完全相同的行为,菜单在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' );
像魅力一样!
根据我的理解,这对你也有用。