未定义的属性:stdClass::$Labels in General-template.php post_type_ARCHIVE_TITLE()

时间:2012-11-01 作者:ivavid

我有一个自定义的帖子类型,其中添加了一个标准的标记分类法,如下所示:\'taxonomies\' => array(\'post_tag\'). 我已经在这个CPT的一些帖子中添加了一些标签,这些帖子显示在前端,带有模板标签the_tags() 它生成的链接具有以下格式http://local.mysite.dev/tag/tag1/. 当我单击这样的链接时,将使用tag.php 模板,但如果我添加?post_type=seron_mycpt 到URL的末尾,如下所示http://local.mysite.dev/tag/tag1/?post_type=seron_mycpt 包含相关帖子的页面是使用相同的模板生成的,但这次我还将这些行添加到debug.log:

PHP Notice:  Undefined property: stdClass::$labels in /...sitepath.../wp-includes/general-template.php on line 665
PHP Notice:  Trying to get property of non-object in /...sitepath.../wp-includes/general-template.php on line 665
这些通知是在wp_title() 在中调用header.php 样板根据重写规则,将请求转换为查询tag=tag1&post_type=seron_mycpt.

对于调试,我将print_r(get_queried_object()); 在里面header.php 得到这个:

MYSITEstdClass Object
(
 [term_id] => 27
 [name] => tag1
 [slug] => tag1
 [term_group] => 0
 [term_taxonomy_id] => 27
 [taxonomy] => post_tag
 [description] =>
 [parent] => 0
 [count] => 2
)
我认为WP期望CPT对象具有labels 属性,但获取不具有该属性的此对象。

如果我标记一个普通post 使用相同的标签,相同header.phptag.php 使用模板时,将显示该帖子http://local.mysite.dev/tag/tag1/ URL,在这种情况下,不会在中生成PHP通知debug.log, 虽然print_r(get_queried_object()) 显示非常相似的对象。也许WP从未到达通知生产线general-template.php.

我不明白这个对象是什么,为什么它被传递而不是CPT对象。有人能解释一下吗?

3 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

这是一个bug(我以前遇到过),可以在trac (因为我从来没有花时间提交过!)

问题开始于设置多个is_* 查询标志为true(特别是表示对象的标志,如单篇文章、页面和文章类型及术语存档)。

这是因为只有一个“被查询的对象”(在您的情况下是术语)。

现在是原因wp_title() 似乎是因为它调用了另一个函数:

function post_type_archive_title( $prefix = \'\', $display = true ) {
    if ( ! is_post_type_archive() )
        return;

    $post_type_obj = get_queried_object();
    $title = apply_filters(\'post_type_archive_title\', $post_type_obj->labels->name );

    if ( $display )
        echo $prefix . $title;
    else
        return $title;
}
is_post_type_archive 标志为true时,它假定查询的对象是post类型,并尝试访问实际上是term对象的未定义属性。

我不确定修复是要打开多个查询对象的可能性,还是要对它们进行更严格的检查,但我会在trac&;上找到它;我们将看到下面的内容。

Update: 要抑制该错误(其他可能的错误)(&;S),请“关闭”其中一个标志:

add_action( \'parse_query\', \'wpse_71157_parse_query\' );
function wpse_71157_parse_query( $wp_query )
{
    if ( $wp_query->is_post_type_archive && $wp_query->is_tax )
        $wp_query->is_post_type_archive = false;
}

SO网友:Svetoslav Marinov

这就是我所做的。在我的分类法归档模板中,我依赖is\\u post\\u type\\u archive()输出其他div标记。

add_action( \'parse_query\', \'orb_parse_query\' );

function orb_parse_query( $wp_query ) {  
    global $post_type_obj;

    if ( $wp_query->is_post_type_archive && $wp_query->is_tax ) {
        $post_type_obj = get_queried_object();

        if (empty($post_type_obj->labels)) {
            $post_type_obj->labels = new stdClass();
            $post_type_obj->labels->name = \'dev/hack to fix WordPress Bug\';
        }
    }
}

SO网友:Kuzvac

谢谢大家的帮助。我使用了lordspace的解决方案,并对其进行了少量修改,以显示当前自定义帖子类型的名称。

add_action( \'parse_query\', \'orb_parse_query\' );

function orb_parse_query( $wp_query ) {  
    global $post_type_obj;

    if ( $wp_query->is_post_type_archive && $wp_query->is_tax ) {
        $post_type_obj = get_queried_object();

        if (empty($post_type_obj->labels)) {
            $currentPostType = $wp_query->query[\'post_type\'];
            $currentPostTypeName = get_post_type_object($currentPostType)->labels->name;
            $post_type_obj->labels = new stdClass();
            $post_type_obj->labels->name = $currentPostTypeName;
        }
    }
}

结束