Неопределенное свойство: stdClass :: $ labels в общем-template.php post_type_archive_title ()

У меня есть пользовательский тип сообщения со стандартной таксономией тега, добавленной к нему так: '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 запроса 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 но вместо этого получает этот объект, который не имеет этого свойства.

Если я tag.php обычный post с тем же тегом, используются те же шаблоны header.php и tag.php , и это сообщение отображается при использовании URL http://local.mysite.dev/tag/tag1/ , и в этом case, но в debug.log создаются уведомления PHP, хотя print_r(get_queried_object()) показывает очень похожий объект. Возможно, WP никогда не достигает линии, производящей уведомление, в general-template.php .

Я не понимаю, что это за объект и почему он передается вместо объекта CPT. Может ли кто-нибудь объяснить?

Solutions Collecting From Web of "Неопределенное свойство: stdClass :: $ labels в общем-template.php post_type_archive_title ()"

Это ошибка (та, с которой я столкнулся раньше), и мог сделать с билетом в trac (так как я никогда не тратил время, чтобы отправить его!)

Проблема начинается с запросов, которые устанавливают несколько is_* запроса is_* как истинных (в частности, флаги, которые представляют объекты, такие как отдельные сообщения, страницы и почтовые и временные архивы).

Это потому, что может быть только один «запрошенный объект» (в вашем случае это термин).

Теперь причина, по которой 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 и пытается получить доступ к неопределенному свойству того, что на самом деле является термином.

Является ли это исправление, чтобы открыть возможность множественных объектов запроса или выполнить более строгую проверку их, я не уверен, но я получу его на trac, и мы посмотрим, что будет дальше.

Обновление. Чтобы подавить ошибку (и возможные другие), «выключить» один из флагов:

 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; } 

Вот что я сделал. В моем шаблоне архива таксономии я полагался на is_post_type_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'; } } } 

Спасибо всем за помощь. Я использовал решение из 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; } } }