Иван Данилин
Fullstack WordPress Developer
WordPress по умолчанию позволяет присваивать записям несколько рубрик, что очень даже правильно, логично и удобно. Но очень часто возникает такая ситуация, что записи присваивается несколько рубрик, а дизайн фронтенда, например, рассчитан только на одну-две рубрики. Вообще сложно представить ситуацию когда имеется необходимость вывода в цикле всего массива присвоенных записи рубрик. К сожалению, нативных средств выбора главной рубрики и второстепенных в WordPress нет. Поэтому, изобретались какие-то костыли, выводилась лишь первая присвоенная рубрика, устанавливались какие-то специализированные плагины и т.д.
В марте этого года, с очередным релизом небезызвестного плагина Yoast SEO, ситуация внезапно изменилась. С версии 3.1 у плагина появилась функция, позволяющая помечать у записи основную, т.н. «Primary» рубрику. Напомню, Yoast SEO — популярный бесплатный плагин поисковой оптимизации для WordPress. На мой взгляд, лучший в своём классе, давно входит в мой маст хэв плагинов WordPress.
Yoast SEO — очень функциональный плагин с невероятным количеством полезных функций, полное описание которых вряд ли поместится в одну статью. Плагин безупречно справляется со всеми возложенными на него задачами. А теперь ещё и отпала необходимость в костылях для рубрик.
Как задействовать основную рубрику в теме?
Для этого воспользуемся небольшим сниппетом.
Суть его работы заключается в следующем. Если установлен Yoast SEO, запись проверяется на наличие Primary Category. И если она есть, то выводится в качестве рубрики записи. Если условие не выполняется, тогда выводится по-старинке первая рубрика записи. Кроме этого, с помощью переменной $useCatLink можно указать нужно ли делать рубрику ссылкой.
Вместо рубрик в переменной $yourTaxonomy можно задать любую другую таксономию.
$yourTaxonomy = 'category'; // Задаем таксономию $category = get_the_terms( $postId, $yourTaxonomy ); $useCatLink = true; // Делаем рубрики ссылками if ($category){ $category_display = ''; $category_link = ''; if ( class_exists('WPSEO_Primary_Term') ) { $wpseo_primary_term = new WPSEO_Primary_Term( 'event_cat', get_the_id() ); $wpseo_primary_term = $wpseo_primary_term->get_primary_term(); $term = get_term( $wpseo_primary_term ); if (is_wp_error($term)) { $category_display = $category[0]->name; $category_link = get_bloginfo('url') . '/' . 'event-category/' . $term->slug; } else { $category_display = $term->name; $category_link = get_term_link( $term->term_id ); } } else { $category_display = $category[0]->name; $category_link = get_term_link( $category[0]->term_id ); } if ( !empty($category_display) ){ if ( $useCatLink == true && !empty($category_link) ){ echo '<span class="post-category">'; echo '<a href="'.$category_link.'">'.$category_display.'</a>'; echo '</span>'; } else { echo '<span class="post-category">'.$category_display.'</span>'; } } }
Можно пойти немного дальше, создать в functions.php функцию и при необходимости обращаться к ней из любого места темы. В циклах, например.
Кстати, чтобы отключить в Yoast SEO возможность выбора основной рубрики, можно воспользоваться таким фильтром:
add_filter( 'wpseo_primary_term_taxonomies', '__return_empty_array' );
И всё.
-
Здравствуйте, это то что нужно мне но в моей теме (SmartMag) нужно использовать такой код в файле functions.php так как несколько плагинов используют вывод категории, подскажите пожалуйста как этот код можно встроить в functions.php и как затем вызвать из нужного места темы? Я не очень разбираюсь к сожалению в PHP..
-
Добрый вечер. В новости несколько рубрик. Если выбрать одну из них основной, то ничего не происходит. Ссылка и рубрика в ссылке не меняется. В чем может быть проблема?