日志查询
正如问题所说的“这并不总是发生”,很难说出到底发生了什么。当您看不到发生了什么(在后台查询)并且不知道什么时候发生时,最好将其记录下来。
记录器在激活时,插件将尝试创建一个名为\'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;