Проверка наличия подкатегорий у текущей категории

28 янв. 2015 г., 16:50:43
Просмотры: 33.4K
Голосов: 5

Я нашел следующий фрагмент кода в теме WP Knowledge Base, который показывает подкатегории родительской категории. Проблема в том, что это работает только для первого уровня иерархии, поэтому я хотел изменить условие if, чтобы проверять, есть ли у текущей категории дочерние элементы, но не знаю как это сделать. Есть идеи? Спасибо

global $term_meta, $cat, $cat_id, $wp_query;

// Проверяем, не является ли текущая категория категорией первого уровня
// Это произойдет, если у текущей категории нет дочерних элементов
// В этом случае мы просто показываем все её записи
// Вместо красивого отображения базы знаний
if ( $cat->parent != '0' ) {
0
Все ответы на вопрос 5
3

Для этого уже есть встроенная функция, нет необходимости создавать пользовательскую функцию. Функция называется get_term_children() и возвращает:

  • Массив дочерних терминов, если указанный термин имеет дочерние элементы

  • Пустой массив, если дочерние термины не найдены

  • Объект WP_Error, если таксономия не существует

Исходя из этого, оберните get_term_children() в функцию и возвращайте true или false в зависимости от возвращаемого значения, если вам нужно просто булево значение (например, для условного тега).

function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
    // Проверяем, передан ли ID термина, если нет, возвращаем false
    if ( !$term_id ) 
        return false;

    // Получаем дочерние термины
    $term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );

    // Возвращаем false, если получен пустой массив или объект WP_Error
    if ( empty( $term_children ) || is_wp_error( $term_children ) )
    return false;

    return true;
}

Теперь вы можете просто передать ID термина в функцию и, если таксономия отличается от category, указать её название. Функция вернет булево значение, как и встроенные условные теги: true в случае успеха, если термин имеет дочерние элементы, и false, если нет.

if ( has_term_have_children( 21 ) ) {
    // Выполнить что-то, если термин 21 имеет дочерние элементы
}
24 июн. 2015 г. 10:35:28
Комментарии

Вы также можете использовать if ( has_term_have_children( get_cat_ID() ) ) на странице категории

Andrew Lazarus Andrew Lazarus
30 окт. 2015 г. 15:03:02

@AndrewLazarus верно, конкретный вариант использования зависит от вашей настройки и того, что именно вам нужно. К сожалению, когда я отвечаю на вопросы, я не могу охватить все аспекты и иногда упускаю одну-две вещи. Комментарии, подобные вашему, всегда очень ценятся и приветствуются ;-). Удачи

Pieter Goosen Pieter Goosen
30 окт. 2015 г. 17:08:37

@AndrewLazarus вы также можете использовать get_queried_object_id() вместо get_cat_ID() на странице категории ;-)

Pieter Goosen Pieter Goosen
30 окт. 2015 г. 17:09:39
3

Вы можете использовать этот простой вызов функции, который возвращает либо TRUE, либо FALSE в зависимости от того, является ли массив $children пустым или нет.

/**
 * Проверяет, есть ли дочерние термины у указанного термина
 *
 * @param Integer $term_id ID термина
 * @param String $taxonomy Таксономия
 *
 * @return Boolean
 */
function category_has_children( $term_id = 0, $taxonomy = 'category' ) {
    $children = get_categories( array( 
        'child_of'      => $term_id,
        'taxonomy'      => $taxonomy,
        'hide_empty'    => false,
        'fields'        => 'ids',
    ) );
    return ( $children );
}

Если вы используете только встроенные категории записей (post), вы можете вызвать функцию следующим образом: category_has_children( 17 );

Если вам нужно проверить пользовательскую таксономию, это работает почти так же, просто передайте дополнительный параметр 'название-таксономии': category_has_children( 7, 'my_taxonomy' );

Для использования в условном операторе IF:

if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )
28 янв. 2015 г. 17:09:26
Комментарии

get_term_children() уже делает то, что нужно автору вопроса. Просто нужно создать булеву условную метку :-)

Pieter Goosen Pieter Goosen
24 июн. 2015 г. 10:39:59

Заметка: параметр type предназначен не для post_type, а для определения, относится ли категория к встроенной таксономии category или встроенной таксономии link_category. Этот параметр использовался до введения пользовательских таксономий в версии 3.0. Параметр type был заменен новым параметром taxonomy, который появился в версии 3.0. Текущий исходный код

Pieter Goosen Pieter Goosen
24 июн. 2015 г. 11:21:16

Примечание: В WooCommerce параметр $taxonomy нужно изменить на 'product_cat' вместо 'category'

luissimo luissimo
20 авг. 2020 г. 22:25:23
2

Чтобы получить названия дочерних категорий. Я использовал функцию от @Howdy_McGee для более быстрого и итеративного процесса.

function category_has_children( $term_id = 0, $post_type = 'post', $taxonomy = 'category' ) {

    $children = get_categories( array( 'child_of' => $term_id, 'type' => $post_type, 'taxonomy' => $taxonomy, 'order' => 'ASC', 'orderby' => 'name' ) );
    if($children){
    echo '<ul>';
    foreach ($children as $value) {
        echo '<li>';
            echo '<a href="'.get_bloginfo("siteurl").'/category/'.$value->slug.'" >'.$value->name.'</a>';
        echo '</li>';
        }
    echo '</ul>';
    }
}

$cId = get_cat_id('cms'); /* cms - родительская категория */
category_has_children($cId, 'post', 'category');

Этот код выведет список всех подкатегорий (дочерних) для родительской категории.

28 янв. 2015 г. 18:35:46
Комментарии

В WordPress уже есть встроенная функция для этого: wp_list_categories()

Howdy_McGee Howdy_McGee
29 янв. 2015 г. 17:00:45

Да, но кастомизация/структурирование с ней несколько ограничены. :)

Shreyo Gi Shreyo Gi
30 янв. 2015 г. 04:45:04
0

Вот что я использую. Переменная $cat содержит ID категории, которую вы проверяете:

$categories = get_categories($cat);

if (!empty($categories)) {
    // У этой категории есть дочерние элементы
    }
else {
    // У этой категории нет дочерних элементов
    }
24 июн. 2015 г. 09:40:45
1

Используйте эту функцию cat_has_subcat('вставьте id категории') чтобы проверить, есть ли у категории подкатегории

//вставьте в файл functions.php

//начало


function cat_has_subcat($catId){
    $args = array(
        'taxonomy' => 'product_cat',
        'orderby' => 'name',
        'parent' => $catId,
        'show_count' => 0,
        'pad_counts' => 0,
        'hierarchical' => 1,
        'title_li' => '',
        'hide_empty' => false
    );

    $cats = get_categories($args);
    if(!empty($cats)){
        return $catId;
    }
}

//конец
9 нояб. 2017 г. 08:53:34
Комментарии

Было бы неплохо добавить объяснение, почему это решение отвечает на вопрос автора.

cjbj cjbj
9 нояб. 2017 г. 09:54:53