3

(我很抱歉发了这么长的帖子,见下面的结论)

我设置了一个 WP 多站点,其中一些站点处于生产模式(使用域别名),而一些站点仍未“启动”。目前有五个站点正在运行。

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

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

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

已安装并激活的插件有:

  • 高级自定义字段

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

  • 高级自定义字段:重复字段

  • 博客复印机

  • 联系表格 7

  • 喷气背包

  • 新用户批准

  • 重定向(Urban Giraffe 的一个)

  • 简单的 301 重定向

  • WordPress 导入器

  • Wordpress MU 域映射

  • Wordpress SEO(由 Yoast 提供)

  • WP Instagram 小部件(由 Code For The People)

但是,除了 New User Approve 和 Wordpress MU Domain Mapping 之外,我一直在其他项目上使用它们,没有任何问题。我无法停用它们,因为所有站点都在使用它们,有些处于生产模式。


结论

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


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

4

3 回答 3

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;
}

但是为了防止页面出现在 ie 搜索结果和 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' );

我真的希望这可以避免一些人头疼。

于 2014-10-16T09:39:49.870 回答
0

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

于 2014-09-22T15:51:32.420 回答
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' );

奇迹般有效!

据我了解,这也对你有用。

于 2015-09-22T05:30:50.807 回答