Дек
8
6

Вывод основной категории записи (для Yoast SEO)

главная категории постаВообще в данном блоге около десятка заметок про категории, где я рассматриваю разные нюансы по их использованию. Однако иногда не получается добавить тот или иной хак в уже существующие статьи, поэтому решил сделать отдельный раздел вопросов-ответов. Не знаю насколько эта идея приживется, но сегодняшняя задача с выводом главной рубрики поста самая первая в нем. Позже создам соответствующую форму вопросов, но пока буду находить их в комментариях (если тема требует более тщательного пояснения).

Когда вы задаете категории для постов блога/сайта, то можете выбрать сразу парочку значений, разместив тем самым публикацию в нескольких разделах. При этом все они имеют одинаковый «вес», то есть никак между собой не различаются. Единственное, что вы можете, это отобразить первую (по названию) рубрику через функцию get_the_category:

<?php
 $one_category = get_the_category(); 
 echo $one_category[0]->cat_name;
?>

Однако популярный среди оптимизаторов плагин Yoast SEO внедрил такую интересную фишку как главная категория (primary category). Вы можете определить какая из всех является основной, то есть наиболее важной.

Основная категория Yoast SEO

Это решение повлияет на:

Плагин автоматически определяет одну из рубрик как основную, однако кликнув по ссылке «Сделать первичным» вы можете все изменить. Это, кстати, полезно, если вам нужно задать конкретный URL для статьи, а не полагаться на выбор системы.

Как вывести главную категорию поста

1. Первый вариант найден на Github — данную конструкцию нужно разместить непосредственно в том месте шаблона, где вы хотите отобразить результат функции, например, в single.php и т.п.

<?php 
// SHOW YOAST PRIMARY CATEGORY, OR FIRST CATEGORY
$category = get_the_category();
$useCatLink = true;
// If post has a category assigned.
if ($category){
	$category_display = '';
	$category_link = '';
	if ( class_exists('WPSEO_Primary_Term') )
	{
		// Show the post's 'Primary' category, if this Yoast feature is available, & one is set
		$wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
		$wpseo_primary_term = $wpseo_primary_term->get_primary_term();
		$term = get_term( $wpseo_primary_term );
		if (is_wp_error($term)) { 
			// Default to first category (not Yoast) if an error is returned
			$category_display = $category[0]->name;
			$category_link = get_category_link( $category[0]->term_id );
		} else { 
			// Yoast Primary category
			$category_display = $term->name;
			$category_link = get_category_link( $term->term_id );
		}
	} 
	else {
		// Default, display the first category in WP's list of assigned categories
		$category_display = $category[0]->name;
		$category_link = get_category_link( $category[0]->term_id );
	}
	// Display category
	if ( !empty($category_display) ){
	    if ( $useCatLink == true && !empty($category_link) ){
		echo '<span class="post-category">';
		echo '<a href="'.$category_link.'">'.htmlspecialchars($category_display).'</a>';
		echo '</span>';
	    } else {
		echo '<span class="post-category">'.htmlspecialchars($category_display).'</span>';
	    }
	}
 
}
?>

В принципе, если понимаете английский, то комментарии в коде помогут понять какие действия там выполняются.

2. Второй метод чуть отличается по принципу работы, он найден тут. Размещаете решение в файл functions.php:

function get_post_primary_category($post_id, $term='category', $return_all_categories=false){
    $return = array();
 
    if (class_exists('WPSEO_Primary_Term')){
        // Show Primary category by Yoast if it is enabled & set
        $wpseo_primary_term = new WPSEO_Primary_Term( $term, $post_id );
        $primary_term = get_term($wpseo_primary_term->get_primary_term());
 
        if (!is_wp_error($primary_term)){
            $return['primary_category'] = $primary_term;
        }
    }
 
    if (empty($return['primary_category']) || $return_all_categories){
        $categories_list = get_the_terms($post_id, $term);
 
        if (empty($return['primary_category']) && !empty($categories_list)){
            $return['primary_category'] = $categories_list[0];  //get the first category
        }
        if ($return_all_categories){
            $return['all_categories'] = array();
 
            if (!empty($categories_list)){
                foreach($categories_list as &$category){
                    $return['all_categories'][] = $category->term_id;
                }
            }
        }
    }
 
    return $return;
}

В коде вы, по сути, изначально определяете функцию, с которой дальше будете работать. Здесь есть параметры, указываемые при ее вызове:

  • $post_id — ID поста, для которого считывается главная категория;
  • $term — базовую таксономию «category» можете заменить ее на любую другую, например «post_tag»;
  • $return_all_categories — по умолчанию установлено в false (ложное), но если нужно возвращать кроме основной рубрики список остальных, то ставите true. Это пригодится в том случае, когда вы хотите расширить функциональность хака и добавить туда, например, проверку родительского значения, и если там будет «video», то показывать соответствующую иконку.

Для вывода/обработки результатов используете:

<?php
$post_categories = get_post_primary_category($post->ID, 'category'); 
$primary_category = $post_categories['primary_category'];
echo $primary_category->name;
?>

Переменная $primary_category содержит объект WP_Term:

Объект WP_Term

… из которого нам нужно вывести название name (через echo);

Итого. Очевидно, что данные решения подойдут только для тех сайтов, где установлен Yoast SEO, в остальных случаях они бесполезны. Надеюсь, вы уже из числа тех, кто присоединился к поклонникам модуля, ведь он реально топовый.

рейтинг Оцените статью:
Ужасная статьяНичего интересногоТак себеНормальноХорошоКлассный постВ закладки!
(голосов - 9, средний балл: 5,00 из 7)
Загрузка...

категория Категории: Вопрос-ответ; Хаки и секреты;
теги Теги: , , , .

комментариев 6 к статье “Вывод основной категории записи (для Yoast SEO)”

  • MaDMaxx   15.12.2018

    Тю я реально думал, что это функция самой Вордпресс.. а тут вот оно как оказывается)) сто лет на Yoast поэтому и не обратил внимания

  • Tod   15.12.2018

    MaDMaxx, аналогично сразу не понял чья это функция.

  • Alex   15.08.2019

    Тоже думал, что это функция Вордпресса, а я то думаю, почему моя тема (SmartMag) не хочет подцеплять никак основной раздел, а выводит на главной и в разделах в анонсе статьи на картинке название и ссылку на рандомный раздел (то есть на тот который она сама посчитает нужным), а не указанный мной вручную при редактировании статьи основной раздел.
    Скажите я правильно понимаю, что эти хаки как раз предназначены для того, чтобы выводились в нужном месте анонса статьи именно название раздела с ссылкой на основной раздел? Я просто в PHP не не очень разбираюсь увы..

  • Tod   17.08.2019

    Alex, все правильно, хак выводит главную категорию в конкретном месте шаблона.

  • Макс   11.12.2020

    Отлично! Подскажите, а как сделать ее вывод ссылкой?

  • Tod   14.12.2020

    Макс, в первом коде ссылка, вроде как, есть. А во втором методе нужно добавить еще одну строчку в код вывода, где использовать функцию get_category_link и в нее подставляете ID найденной основнокй категории.

Оставить комментарий


Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости