Получение только используемых терминов

18 мар. 2024 г., 18:39:15
Просмотры: 59
Голосов: 1

В настоящее время я использую term_exists($term, $taxonomy); в условном операторе, но проблема в том, что эта функция включает термины, которые не используются (хотя они существуют в списке категорий).

Есть ли что-то, что я могу использовать вместо term_exists, что будет включать категории только если они используются? И мне нужно как-то фильтровать, чтобы получить только используемые термины?

Я фильтрую архив объектов недвижимости через элемент select. Каждую неделю, когда назначаются дни открытых дверей, я применяю категорию 'Open House' к соответствующим объектам, что позволяет посетителям фильтровать и видеть все открытые дома. После выходных я удаляю эту категорию из каждого объявления. Пример: https://megangulick.com/agent-listings/ (сейчас я редактирую опцию вручную, поэтому 'Open House' не отображается как вариант).

Что я хочу сделать - это изменить начальную опцию select в зависимости от того, есть ли в данный момент назначенные дни открытых дверей.

Вот как выглядит мой текущий код:

<?php $categories = get_categories('taxonomy=listing-neighborhood&post_type=listings'); ?>
<select name="listingcat" id="listingcat" onchange="submit()">
<?php //это часть, для которой мне нужно решение
$cat = (term_exists('Open House', $categories));
if $cat {
    echo '<option value="">Выберите район или день открытых дверей</option>';
} else { 
    echo '<option value="">Выберите район</option>';
}
?>
<?php 
    foreach ($categories as $category) : 
    echo '<option value="'.$category->name.'"';
    if(isset($_GET['listingcat']) && ($_GET['listingcat'] == $category->name)) { 
        echo ' selected="selected"'; 
    } 
    echo '>'.$category->name.'</option>';
    endforeach; 
?>
</select>

Задача здесь - определить, используется ли конкретный термин (например, Open House), а затем использовать эту информацию для условного оператора if/else.

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

Вы пробовали добавлять &hide_empty=1 в строку запроса?

birgire birgire
19 мар. 2024 г. 17:10:34

Вы имеете в виду это?
<?php $categories = get_categories('taxonomy=listing-category&post_type=listings&hide_empty=1'); ?> Не дает никакого эффекта.

Ray Gulick Ray Gulick
19 мар. 2024 г. 17:24:09

По умолчанию он должен скрывать пустые, наверное, я неправильно понял настройку и вопрос.

birgire birgire
19 мар. 2024 г. 18:03:08

Выпадающий список отображает термины идеально, включая только те, которые используются. Я пытаюсь сделать так, чтобы показывался другой первый вариант в зависимости от того, используется ли термин 'Open House'. Подозреваю, что 'term exists' — это не та функция, которую стоит использовать, так как она получает все термины, используемые или нет. ЕСЛИ 'Open House' среди активных терминов ТО ПОКАЗЫВАТЬ <option value="">Выбрать район или открытый дом</option> ИНАЧЕ ПОКАЗЫВАТЬ <option value="">Выбрать район</option>

Ray Gulick Ray Gulick
19 мар. 2024 г. 21:29:45

Если вы пытаетесь определить, есть ли у конкретной записи конкретный термин, вы можете использовать has_term() — что-то вроде has_term( 'Open House', 'listing-category', get_the_ID() ) может быть тем, что вам нужно, вместо вашего вызова term_exists().

Pat J Pat J
20 мар. 2024 г. 02:48:29

Не пытаюсь определить, есть ли у конкретной записи термин, а пытаюсь определить, есть ли у ЛЮБОЙ записи данный термин. Попробовал has_term — не работает. Подозреваю, что мне нужно условное выражение с in_array.

Ray Gulick Ray Gulick
20 мар. 2024 г. 11:40:30
Показать остальные 1 комментариев
Все ответы на вопрос 2
0

Начал исследовать массивы терминов и придумал рабочее решение для создания условия, проверяющего, используется ли термин в каких-либо записях:

<?php $categories = get_categories('taxonomy=listing-neighborhood&post_type=listings'); ?>
<?php 
    $term_name = wp_list_pluck( $categories, 'name' );
    $this_name= 'Открытый дом'; // Open House
    if( in_array( $this_name, $term_name ) ){
        echo '<option value="">Выберите статус или открытый дом</option>'; // Select status or open house
    } else { 
        echo '<option value="">Выберите статус (по умолчанию показывать все)</option>'; // Select status (show all by default)
    }
?>

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

20 мар. 2024 г. 13:31:05
2
-1

Чтобы получить только термины, которые используются в связанных записях, можно использовать функцию get_terms() с параметром pad_counts, установленным в true. Это гарантирует, что свойство count каждого объекта термина будет отражать количество связанных записей. Затем можно отфильтровать термины с количеством 0.

$taxonomy = 'ваша_таксономия'; // Замените 'ваша_таксономия' на название вашей таксономии
$terms = get_terms(array(
    'taxonomy' => $taxonomy,
    'pad_counts' => true, // Установите true, чтобы включить количество связанных записей
));

// Фильтруем термины, оставляя только те, у которых есть связанные записи
$used_terms = array_filter($terms, function($term) {
    return $term->count > 0;
});

// Проверяем, есть ли полученные термины
if (!empty($used_terms)) {
    foreach ($used_terms as $term) {
        // Выводим информацию о термине
        echo '<p>Название термина: ' . $term->name . '</p>';
        echo '<p>ID термина: ' . $term->term_id . '</p>';
        echo '<p>Slug термина: ' . $term->slug . '</p>';
        echo '<p>Описание термина: ' . $term->description . '</p>';
        echo '<p>Количество записей: ' . $term->count . '</p>';
        // Можно вывести больше информации о термине, если нужно
    }
} else {
    echo 'Не найдено терминов с связанными записями.';
}
19 мар. 2024 г. 05:18:26
Комментарии

Это потребует более масштабной переработки, чем я рассчитывал, но выглядит многообещающе. Я сообщу о результатах позже утром. Спасибо.

Ray Gulick Ray Gulick
19 мар. 2024 г. 10:46:29

Это не совсем работает в моём случае (добавил свой существующий код и дополнительную информацию в исходном вопросе).

Ray Gulick Ray Gulick
19 мар. 2024 г. 14:00:27