Однако популярный среди оптимизаторов плагин Yoast SEO внедрил такую интересную фишку как главная категория (primary category). Вы можете определить какая из всех является основной, то есть наиболее важной.
Это решение повлияет на:
Плагин автоматически определяет одну из рубрик как основную, однако кликнув по ссылке «Сделать первичным» вы можете все изменить. Это, кстати, полезно, если вам нужно задать конкретный 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:
… из которого нам нужно вывести название name (через echo);
Итого. Очевидно, что данные решения подойдут только для тех сайтов, где установлен Yoast SEO, в остальных случаях они бесполезны. Надеюсь, вы уже из числа тех, кто присоединился к поклонникам модуля, ведь он реально топовый.
View Comments
Давно искала подобное, спасибо очень интересно!