Wordpress Nav Menu页面项随机消失

时间:2014-09-11 13:52:40

标签: php wordpress menuitem multisite

(对不起,我很抱歉,见下文结论)

我有一个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记录错误。


对不起,我很抱歉,但我真的认为必须详细解释。有谁认识到这个问题?或者可以指出我正确的方向?我觉得我已经尝试了一切。非常感谢你!

3 个答案:

答案 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' );

像魅力一样!

根据我的理解,这对你也有用。