Отображение заголовка Yoast WordPress SEO в шаблоне архива
Плагин WordPress SEO от Yoast позволяет добавлять SEO заголовки и мета-описания на страницы архивов таксономий. Затем они используются в head документа.
Я пытаюсь отобразить SEO заголовок терминов таксономии как H1 в моем шаблоне архива таксономии.
Сделать это для записи, типа записи или страницы просто:
echo get_post_meta($post->ID, '_yoast_wpseo_title', true);
В шаблонах архива это не работает.
Кто-нибудь знает, как это реализовать?
Пример скриншота
Это заголовок определенного тега. Я пытаюсь отобразить этот заголовок - но для термина пользовательской таксономии - в моих шаблонах архива.
Итоговый код
Вот что я в итоге использовал в моем шаблоне archive.php
. Это работает, если вы используете пользовательскую таксономию. Для тегов или категорий посмотрите ответ Mike Madern ниже.
<h1 class="archive-title">
<?php
if ( is_tax() ) :
$taxonomy = get_queried_object()->taxonomy;
$term_id = get_queried_object()->term_id;
$meta = get_option( 'wpseo_taxonomy_meta' );
$title = $meta[$taxonomy][$term_id]['wpseo_title'];
//printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_taxonomy_meta' ), 1 ) );
if ( isset($meta) && !empty($title) ) :
echo apply_filters( 'the_title', $title );
else :
single_term_title();
endif;
endif;
?>
</h1>

Получение SEO-заголовков архивов
Если вы задали заголовок архива для пользовательского типа записи, его можно получить следующим образом:
$titles = get_option( 'wpseo_titles' );
$title = $titles['title-ptarchive-POST_TYPE'];
echo apply_filters( 'the_title', $title );
Не забудьте заменить POST_TYPE
на ваш собственный тип записи.
Для отображения всех переменных wpseo_title
можно использовать:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_titles' ), 1 ) );
Это позволит легко выбрать нужный вам заголовок.
Получение SEO-заголовков таксономий
Категории
Следующий код позволяет получить заданный SEO-заголовок:
$cat_id = get_query_var( 'cat' );
$meta = get_option( 'wpseo_taxonomy_meta' );
$title = $meta['category'][$cat_id]['wpseo_title'];
echo apply_filters( 'the_title', $title );
Метки
Для получения SEO-заголовка метки используйте этот код:
$tag_id = get_query_var( 'tag' );
$meta = get_option( 'wpseo_taxonomy_meta' );
$title = $meta['post_tag'][$tag_id]['wpseo_title'];
echo apply_filters( 'the_title', $title );
Для отображения всех переменных wpseo_taxonomy_meta
можно использовать:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_taxonomy_meta' ), 1 ) );
Это поможет увидеть структуру и доступные переменные.

Полагаю, вы пропустили моё последнее редактирование сообщения :-P Я добавил версию с $tag_id
.

Большое спасибо за код, я бы никогда не смог разобраться в этом самостоятельно. Я внес несколько небольших изменений, чтобы заставить его работать с пользовательскими таксономиями.

Это отлично. Мне пришлось использовать get_queried_object()->term_id
вместо get_query_var()
, так как первый возвращает ID, а второй возвращает slug, из-за чего код выдавал уведомления "undefined index". Также важно проверять, установлено ли что-либо в $meta['post_tag|category']
, иначе вы также получите уведомления о неопределенном индексе. (Кстати, WP 4.2.2)

К сожалению, это не сработало. Отображается SEO-заголовок первой записи в архиве. Вероятно, мне придется покопаться в базе данных, чтобы понять, где хранятся эти данные.

Я добавил свой код. Не уверен, что я объяснил, что хотел вывести заголовок страницы, а не заголовки каждой записи в цикле.

Именно это я и искал. Выводит SEO-заголовок в цикле. Также я заменил get_the_ID() на $post->ID

Почему-то выводит мета-описание для меня, как если бы я использовал _yoast_wpseo_metadesc

Получение ключевого слова для рубрик и меток
Чтобы программно получить ключевое слово для рубрики или метки, можно использовать один из двух методов:
/** Метод 1. Прямое обращение к настройкам. **/
$meta = get_option( 'wpseo_taxonomy_meta' ); // нужно только один раз, поэтому разместите это до цикла foreach.
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo $meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
}
}
Это, по сути, подход, который использовал Майк в конце своей статьи.
Или
/** Метод 2. Использование функции Yoast. **/
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo WPSEO_Taxonomy_Meta::get_term_meta( $tag->term_id, 'post_tag', 'focuskw' );
}
}
Я предпочитаю второй подход, потому что в этом случае мне не нужно самостоятельно получать или заботиться о мета-настройках.
В вашем файле functions.php
можно добавить проверку if class_exists( 'WPSEO_Taxonomy_Meta' )
, а затем, возможно, обернуть функцию Yoast в свою собственную функцию для безопасности на случай, если вы решите перестать использовать Yoast SEO в будущем.
Немного теории
Как упоминалось в исходном вопросе, что-то вроде get_post_meta( $tag->term_id, '_yoast_wpseo_focuskw', true);
не сработает для рубрик и страниц (вернёт пустоту).
Почему так происходит?
Дело в том, что для рубрик и меток ключевое слово сохраняется в другом месте базы данных. Вместо таблицы wp_postmeta
, как обычно, оно хранится глубоко внутри таблицы wp_options
в виде JSON-объекта.
Приведённые выше методы позволяют получить доступ к этим значениям.
Наконец, если вы, как и я, не всегда можете вспомнить названия таксономий (например, неочевидно, почему метки используют таксономию post_tag
, а не просто tag
), просто посмотрите URL-адреса при редактировании рубрики или метки: там будет указано …taxonomy=category…
или что-то подобное.

Ответ Получение фокусного ключевого слова для категорий и меток
// это работает, спасибо
// через REST API
GET запрос /wp-json/wp/v2/categories?slug=slug_name
plugin.in использует Метод 1
изменить строку
$meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
на
$meta['category'][$param_post_id]['wpseo_focuskw'];
