我正在使用名为Connections的插件。当404出现时(有充分理由,即通过浏览器访问不存在的页面),插件的代码中指定的自定义帖子回调过滤器为$wp_query->post
,未设置。我们会在访问$wp_query->post->ID
时收到尝试获取非对象属性的投诉。正如您所料。
我已禁用所有其他插件并返回Twenty Fifteen主题,但问题仍然存在。在干净的安装上,问题不会发生。这对我来说没有意义。如果它不是插件或主题问题,并且它不在Wordpress核心中,那么问题出在哪里?一个腐败的数据库? (其他一切似乎都运转良好)。
过滤器回调在这里:
public static function filterPostTitle( $title, $id = 0 ) {
global $wp_query, $post, $connections;
// ADDED: If I add this line the problem goes away.
if ( is_404() ) return $title;
// Whether or not to filter the page title with the current directory location.
if ( ! cnSettingsAPI::get( 'connections', 'connections_seo', 'page_title' ) ) return $title;
// If I uncomment the next two lines and comment out the following line of code, then the problem also goes away.
//$post_id = get_queried_object_id();
//if ( ! is_object( $post ) || $post_id != $id || ! self::$filterPermalink ) return $title;
if ( ! is_object( $post ) || $wp_query->post->ID != $id || ! self::$filterPermalink ) return $title;
如果我在功能开始时添加以下检查,那么问题也会消失(再次像我们预期的那样):
if ( ! isset( $wp_query->post ) || ! isset( $wp_query->post->ID ) ) return $title;
我已经打印出回溯给我提供线索,但是由于全局变量$ wp_query有问题,所以回溯似乎没有给出很多线索。这是另一个提醒,为什么全局变形是不好的做法...一个非常糟糕的Wordpress节目。 Globals使调试成为一场噩梦。全局变量在哪里变了?我们不知道。
过滤器回调设置如下:
add_filter( 'the_title', array( __CLASS__, 'filterPostTitle' ), 10, 2 );
插件的开发者(可能是这样)认为问题出在他的插件之外。
问题: 为什么$ wp_query->在触发回调时未设置? $ wp_query-> post应始终按照' the_title'过滤回调是否被触发?
你可能猜到我对Wordpress相当新手。它非常棒......虽然不是全球变量的粉丝......但是这是一个很大的禁忌。
答案 0 :(得分:0)
并非$wp_query->post
在404期间未被设置...而是它根本没有设置。实际上,$wp_query->post
的所有新实例在初始化时都未设置WP_Query
。让我们look at the source:
/**
* Initiates object properties and sets default values.
*
* @since 1.5.0
* @access public
*/
public function init() {
unset($this->posts);
unset($this->query);
$this->query_vars = array();
unset($this->queried_object);
unset($this->queried_object_id);
$this->post_count = 0;
$this->current_post = -1;
$this->in_the_loop = false;
unset( $this->request );
unset( $this->post ); // Always unset
unset( $this->comments );
unset( $this->comment );
$this->comment_count = 0;
$this->current_comment = -1;
$this->found_posts = 0;
$this->max_num_pages = 0;
$this->max_num_comment_pages = 0;
$this->init_query_flags();
}
接下来是query is parsed,如果出现错误:
if ( '404' == $qv['error'] )
$this->set_404();
设置了404状态,永远不会填充/设置$wp_query->post
。