Как получить имя основной категории в новой версии WordPress

5 июн. 2016 г., 11:02:52
Просмотры: 41.2K
Голосов: 4

В WordPress появилась новая функция, представляющая основную категорию. При выборе категории можно указать основную категорию.

Мой вопрос: как можно получить имя этой основной категории, используя базовые функции WordPress?

Если такой функции нет, можете ли вы помочь мне получить первую дочернюю категорию основной категории?

например:
- главная категория
-- дочерняя кат. 1
-- дочерняя кат. 2
-- дочерняя кат. 3

Мне нужно получить -- дочернюю кат. 1.

Спасибо за помощь.

6
Комментарии

Основная категория? Можете ли вы помочь мне найти статью и объяснить эту новую концепцию основной категории?

Sumit Sumit
5 июн. 2016 г. 11:23:33

Установите последнюю версию WordPress, затем создайте новую запись, выберите несколько категорий - одна из них может быть назначена как основная категория

MMTDesigner MMTDesigner
5 июн. 2016 г. 12:00:37

Или, возможно, я ошибаюсь, и это плагин предоставляет мне такую возможность?!

MMTDesigner MMTDesigner
5 июн. 2016 г. 12:01:38

Я этого не вижу. Вы говорите об этом https://yoast.com/yoast-seo-3-1/ ?

Sumit Sumit
5 июн. 2016 г. 12:15:51

@MMTdesigner Это плагин Yoast SEO предоставляет функцию 'основной категории'. Они используют её для хлебных крошек. Это не часть ядра WordPress. :)

Mayeenul Islam Mayeenul Islam
5 июн. 2016 г. 12:18:58

Вы могли бы ответить на второй вопрос?

MMTDesigner MMTDesigner
5 июн. 2016 г. 12:52:34
Показать остальные 1 комментариев
Все ответы на вопрос 7
0

Я отредактировал функцию 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();
    }
}
1 окт. 2018 г. 02:38:59
0

Я вижу, что этот вопрос привлекает много внимания в течение последнего года, поэтому решил ответить на него правильно.

В 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.

21 мая 2018 г. 17:12:38
1

Чтобы ответить на ваш второй вопрос: функция 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];
5 июн. 2016 г. 18:13:37
Комментарии

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

MMTDesigner MMTDesigner
6 июн. 2016 г. 07:42:22
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

13 авг. 2018 г. 16:36:53
0

Нативное решение для 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;
18 сент. 2019 г. 19:24:04
0

Я только что рефакторил ответ 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 ''; // Возвращаем пустую строку, если ничего не найдено
    }
}
12 февр. 2022 г. 10:19:39
4
-1

Я использую плагин 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);
}
31 мар. 2017 г. 16:24:14
Комментарии

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

Howdy_McGee Howdy_McGee
31 мар. 2017 г. 17:26:07

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

Serge Andreev Serge Andreev
4 апр. 2017 г. 11:26:31

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

Serge Andreev Serge Andreev
4 апр. 2017 г. 11:27:19

> Куда вставить этот код? Например, вы можете добавить этот код в файл wp-content/themes/<ваша-тема>/single.php или в любой другой PHP-файл, где вы отображаете название Основной категории для записи

Serge Andreev Serge Andreev
4 апр. 2017 г. 11:27:24