Как получить имя основной категории в новой версии WordPress
В WordPress появилась новая функция, представляющая основную категорию. При выборе категории можно указать основную категорию.
Мой вопрос: как можно получить имя этой основной категории, используя базовые функции WordPress?
Если такой функции нет, можете ли вы помочь мне получить первую дочернюю категорию основной категории?
например:
- главная категория
-- дочерняя кат. 1
-- дочерняя кат. 2
-- дочерняя кат. 3
Мне нужно получить -- дочернюю кат. 1.
Спасибо за помощь.

Я отредактировал функцию MMT Designer. Этот вариант работает для меня лучше:
if ( ! function_exists( 'get_primary_taxonomy_id' ) ) {
function get_primary_taxonomy_id( $post_id, $taxonomy ) {
$prm_term = '';
if (class_exists('WPSEO_Primary_Term')) {
$wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
$prm_term = $wpseo_primary_term->get_primary_term();
}
if ( !is_object($wpseo_primary_term) || empty( $prm_term ) ) {
$term = wp_get_post_terms( $post_id, $taxonomy );
if (isset( $term ) && !empty( $term ) ) {
return $term[0]->term_id;
} else {
return '';
}
}
return $wpseo_primary_term->get_primary_term();
}
}

Я вижу, что этот вопрос привлекает много внимания в течение последнего года, поэтому решил ответить на него правильно.
В WordPress нет встроенной основной категории, но если у вас установлен плагин Yoast SEO, то в админке на странице редактирования записи (Single Posts) появится возможность выбрать основную категорию.
Чтобы получить эту основную категорию, вы можете использовать следующую функцию, которую я разработал:
if ( ! function_exists( 'get_primary_taxonomy_id' ) ) {
function get_primary_taxonomy_id( $post_id, $taxonomy ) {
$prm_term = '';
if (class_exists('WPSEO_Primary_Term')) {
$wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
$prm_term = $wpseo_primary_term->get_primary_term();
}
if ( !is_object($wpseo_primary_term) && empty( $prm_term ) ) {
$term = wp_get_post_terms( $post_id, $taxonomy );
if (isset( $term ) && !empty( $term ) ) {
return wp_get_post_terms( $post_id, $taxonomy )[0]->term_id;
}
return '';
}
return $wpseo_primary_term->get_primary_term();
}
}
Сначала функция проверит, установлен и активирован ли Yoast SEO, и попытается получить основную категорию. Если Yoast не установлен, она получит все категории и вернет первую.
Обратите внимание, что эта функция также работает с пользовательскими типами записей и таксономиями.
В конце функция возвращает ID категории (термина). Если вам нужен объект категории (термина), вы можете использовать get_term($ID, $taxonomy)
, передав ID.
Новое дополнение:
Если вы используете Rank Math и хотите получить основную таксономию, установленную через этот плагин, вам может помочь следующий код:
if (class_exists('RankMath')) {
$primary_tax = get_post_meta( $post_id, 'rank_math_primary_category', true );
if (!empty($primary_tax)) {
return get_term( $primary_tax, $taxonomy );
}
}
Я рекомендую добавить этот код после условия проверки Yoast.

Чтобы ответить на ваш второй вопрос: функция get_categories()
позволяет передавать множество аргументов, одним из которых является получение дочерних категорий.
Сначала получите родительскую категорию. В примере я использовал get_category_by_slug
, но вы можете использовать любой другой способ, например функцию Yoast для получения основной категории.
$category = get_category_by_slug( 'category-name' );
Затем получите все дочерние категории:
$args = array(
'type' => 'post',
'child_of' => $category->term_id,
'orderby' => 'name',
'order' => 'ASC', // или любой другой порядок
'hide_empty' => FALSE,
'hierarchical' => 1,
'taxonomy' => 'category',
);
$child_categories = get_categories($args);
Наконец, выберите первый элемент, если он существует:
if !empty($child_categories) $first_child = $child_categories[0];

Это не для WordPress, а для SEO-плагина, вы можете использовать следующую функцию:
function get_post_primary_category($post_id, $term='category',
$return_all_categories=false){
$return = array();
if (class_exists('WPSEO_Primary_Term')){
// Показывать основную категорию от Yoast, если она включена и задана
$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]; // Получить первую категорию
}
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;
}
Эта функция написана lab21.gr

Нативное решение для WordPress, возвращающее текущую родительскую категорию.
function primary_categories($arr_excluded_cats) {
if($arr_excluded_cats == null) {
$arr_excluded_cats = array();
}
$post_cats = get_the_category();
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'parent' => 0
);
$primary_categories = get_categories($args);
foreach ($primary_categories as $primary_category) {
foreach ($post_cats as $post_cat) {
if(($primary_category->slug == $post_cat->slug) && (!in_array($primary_category->slug, $arr_excluded_cats))) {
return $primary_category->slug;
}
}
}
}
//если у вас более двух родительских категорий, связанных с записью, вы можете исключить ненужные здесь
$dont_return_these = array(
'receitas','enciclopedico'
);
//используйте функцию следующим образом:
echo primary_categories($dont_return_these);
Комментарии:
- если у вас только одна родительская категория для записи, передайте null вместо массива
- если вам нужен другой вывод вместо slug, измените return $primary_category->slug;

Я только что рефакторил ответ Eqhes. Чуть более чистый код :)
if (!function_exists('get_primary_taxonomy_id')) {
function get_primary_taxonomy_id($post_id, $taxonomy) {
$prm_term = ''; // Основной термин
$wpseo_primary_term = ''; // Объект первичной таксономии Yoast SEO
// Проверяем, существует ли класс WPSEO_Primary_Term (Yoast SEO)
if (class_exists('WPSEO_Primary_Term')) {
$wpseo_primary_term = new WPSEO_Primary_Term($taxonomy, $post_id);
$prm_term = $wpseo_primary_term->get_primary_term(); // Получаем ID основного термина
}
// Если объект первичного термина существует и сам термин не пуст
if (is_object($wpseo_primary_term) && !empty($prm_term)) {
return $wpseo_primary_term->get_primary_term(); // Возвращаем ID основного термина
}
// Получаем термины таксономии для поста
$term = wp_get_post_terms($post_id, $taxonomy);
// Если термины существуют и не пусты
if (isset($term) && !empty($term)) {
return $term[0]->term_id; // Возвращаем ID первого термина
}
return ''; // Возвращаем пустую строку, если ничего не найдено
}
}

Я использую плагин sCategory Permalink https://wordpress.org/plugins/scategory-permalink/
// Получаем ID основной категории из метаполя поста
$category_primary_id = get_post_meta(get_the_ID(), '_category_permalink', true);
// Если ID категории существует
if (!empty($category_primary_id)) {
// Получаем объект категории
$category = get_category($category_primary_id);
// Выводим название категории
var_dump($category->name);
}

Что такое _category_permalink
? Я не знаком с этим мета-ключом. Куда нужно вставить этот код? Не могли бы вы отредактировать свой ответ, используя ссылку на редактирование выше, и добавить больше деталей в ваш ответ, пожалуйста?

> Что такое category_permalink ? Каждая основная категория для записи сохраняется как _category_permalink

> Я не знаком с этим мета-ключом.
Используйте SQL-запрос для поиска всех мета-ключей записи:
SELECT * FROM postmeta WHERE post_id = ID
