为什么$ wp_query->在404期间未设置?

时间:2015-10-22 14:15:04

标签: wordpress wordpress-plugin

我正在使用名为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相当新手。它非常棒......虽然不是全球变量的粉丝......但是这是一个很大的禁忌。

1 个答案:

答案 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