导航菜单项消失(但不是立即)

时间:2012-09-07 作者:Travis Northcutt

我在一个网站上工作,其中一些导航菜单项消失了(从前端、后端和数据库)。然而,调试非常困难,因为它们不会立即消失!因此,我无法找出是什么触发了删除。

更多信息:

“自定义”的导航菜单项(例如指向任意url,而不是帖子/页面/类别等)似乎是安全的。我还不能百分之百确定

这在3.4.1中。我刚刚更新到3.4.2,但今天我还不能证实它是否仍在发生(尽管我没有理由相信它不会发生)。

编辑:我已经确认“自定义”导航项目(指向任意url的链接,与WP页面/类别等)不会被删除。

2 个回复
SO网友:kaiser

日志查询

正如问题所说的“这并不总是发生”,很难说出到底发生了什么。当您看不到发生了什么(在后台查询)并且不知道什么时候发生时,最好将其记录下来。

记录器在激活时,插件将尝试创建一个名为\'nav_log\' 在temp文件夹中-当这不起作用时,它将抛出并打印一个错误。

然后,它将尝试写入名为\'nav_log.txt\' 在临时目录内。每次都应该获得一个日志条目,查询nav_menu_item 已触发。日志将以日期为前缀(Y-m-d g:i:s). 因此,只要你睁大眼睛,努力捕捉UI中的变化,你就应该能够知道它何时发生,何时发生。我还添加了$hook_suffix global(可能)帮助确定何时发生这种情况。

免责声明:该插件需要一些爱,不能开箱即用。文件系统的东西很复杂,插件只是一个草图/想法

<?php
! defined( \'ABSPATH\' ) AND exit;
/** Plugin Name: (#64487) »kaiser« log nav menu query */
# Version: 2012-09-17.0924

if ( ! class_exists( \'wpse64487_query_logger\' ) )
{
    register_activation_hook( __FILE__, array( \'wpse64487_query_logger\', \'create_log_dir\' ) );
    add_action( \'plugins_loaded\', array( \'wpse64487_query_logger\', \'init\' ), 5 );

class wpse64487_query_logger
{
    public static $instance;
    public $name = \'nav_log\';

    public static function init()
    {
        null === self :: $instance AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        add_filter( \'posts_where\', array( $this, \'ask_where\' ) );
    }

    public function create_log_dir()
    {
        $output = true;
        // Relative to the Temp Dir
        if ( ! wp_mkdir_p( $this->get_log_loc() ) )
            $output = new WP_Error( __CLASS__, \'Log Dir creation failed.\' );

        is_wp_error( $output ) AND print $output->get_error_message( __CLASS__ );
    }

    public function get_log_loc( $full = false )
    {
        $output = trailingslashit( get_temp_dir()."{$this->name}" );
        $full AND $output .= "{$this->name}.txt";
        return $output;
    }

    public function ask_where( $where )
    {
        if ( "`post_type` = \'nav_menu_item\'" === $where )
        {
            add_filter( \'posts_clauses\', array( $this, \'catch_query\' ) );
        }
        return $where;
    }

    public function catch_query( $pieces )
    {
        global $wp_filesystem, $hook_suffix;
        $file = $this->get_log_loc( true );
        $contents  = $wp_filesystem->get_contents( $file );
        // Append current query
        $contents .= "\\n\\n@".date( "Y-m-d g:i:s" );
        $contents .= "\\n Query: ".implode( \' \', $pieces );
        $contents .= "\\n Page: {$hook_suffix}";
        $wp_filesystem->put_contents(
             $file
            ,$contents
            ,FS_CHMOD_FILE
        );
        return $pieces;
    }
} // END Class wpse64487_query_logger

} // endif;

SO网友:Ben

您是否已停用您可能已安装的任何插件?

如果您已经尝试过了,但它仍在发生,那么我不能建议您对此安装进行简单的修复,但您是否尝试过,甚至考虑过,备份现有安装,将内容导出到xml文件,然后在干净的数据库中重新安装,并且一开始没有激活插件,只是您想要的主题?新安装的核心文件中应包含标准(非自定义代码)。在将内容重新导入之前,请尝试设置一个菜单,看看它是否仍然存在。如果是这样的话,您可以排除损坏的数据库,我认为可以肯定地说问题出在您的主题文件中的某个地方。

只需记住,在使用干净的安装清除当前的核心选项值之前,请记下它们。

结束

相关推荐

Wordpress Custom Menus Issue

在我的模板中,我使用这样的调用来输出一些自定义菜单:<?php wp_nav_menu(array(\'container_class\' => \'secondary-navigation\', \'theme_location\' => \'secondary\')); ?> 自从升级到WordPress 3.1.4后,我就可以获得完整的页面列表,而不是自定义菜单我看到修复程序(通过谷歌)说我应该添加以下内容来修复此问题:\'fallback_cb\' => f