Проверка наличия записей в категории произвольного типа записей вне цикла

14 февр. 2013 г., 18:29:34
Просмотры: 20.6K
Голосов: 2

Я создаю навигацию вне основного цикла, которая включает выпадающие меню. У меня есть произвольный тип записей 'Events' со своими категориями. Я хочу, чтобы выпадающее меню отображалось только если существуют записи в этом произвольном типе записей и категории, но я не уверен, какие функции следует использовать для определения этого...

У меня есть...

$hasposts = get_posts('post_type=Events&category=40');
if($hasposts) {
    ..// показать выпадающее меню
} 

Должен ли я вообще использовать get_posts()? Всё, что я получаю в ответ - пустой массив, хотя я знаю, что в некоторых из этих категорий есть записи...

Большое спасибо, WA.

0
Все ответы на вопрос 4
7

В конечном итоге всё сводится к WP_Query, даже если вы используете get_posts. Вот моя модифицированная версия:

$hasposts = get_posts('post_type=sc-events&category=40');
if( !empty ( $hasposts ) ) {
    ..// показать выпадающее меню
}

или

$query = new WP_Query(array(
    'post_type' => 'sc-events',
    'category' => 40
));
if( $query->have_posts() ){
    echo 'у нас есть записи';
} else {
    echo 'записи не найдены';
}

Хотя это будет работать, есть альтернатива, вдохновлённая вашим собственным ответом, которая использует slug категории вместо её ID:

$term = get_term_by('name', 'как там называется категория 40', 'category');
if($term != false ){
    if($term->count > 0 ){
        // у нас есть записи
    }
}
14 февр. 2013 г. 19:01:03
Комментарии

Тип записи 'Events' имеет свою собственную таксономию, поэтому ID категории относится только к этому пользовательскому типу записей. Я согласен с хардкодингом, но я модифицирую чужой код. Первое предложенное вами решение продолжает возвращать пустой массив, даже когда в этой категории есть записи. А второе предложение... оно немного сложнее, чем я искал, потому что мне не нужно фактически выводить что-либо из этого запроса. Мне просто нужно проверить, есть ли записи в категории. Ваш ввод очень ценится.

RCNeil RCNeil
14 февр. 2013 г. 19:07:38

Второе решение идентично первому, это то, что get_posts делает внутри, и они означают одно и то же и работают одинаково. Просто потому что вы сделали запрос, не означает, что вы должны делать цикл.

Tom J Nowell Tom J Nowell
14 февр. 2013 г. 19:09:31

Также, если у вас есть пользовательская таксономия, почему вы используете 'category=40', а не 'customtaxonomyname=40'?

Tom J Nowell Tom J Nowell
14 февр. 2013 г. 19:09:56

спасибо за информацию. На самом деле, таксономии здесь нет, как я сейчас вижу, разбирая файл functions.php. Используются категории из типов записей. И даже с учетом всего этого, почему оба решения возвращают мне пустой массив, даже если я просто делаю запрос по ID категории, не привязывая его к определенным типам записей? Это имеет значение?

RCNeil RCNeil
14 февр. 2013 г. 19:23:44

Это указывает на отсутствующую информацию. Не могли бы вы опубликовать код регистрации вашего типа записи?

Tom J Nowell Tom J Nowell
14 февр. 2013 г. 19:34:42

Еще раз... это не мой код, но разработчик использовал плагин http://wordpress.org/extend/plugins/types/ для их создания.

RCNeil RCNeil
14 февр. 2013 г. 19:44:46

давайте продолжим обсуждение в чате

RCNeil RCNeil
14 февр. 2013 г. 19:49:14
Показать остальные 2 комментариев
0

Если вам нужен массив со всеми терминами вашей пользовательской таксономии, с дополнительным условием, что они содержат хотя бы одну запись, то вот функция, которая вам нужна:

get_terms(
    'group',
    array(
        'hide_empty' => true
    )
);

Эта функция извлекает информацию о терминах, а не о самих записях. В данном сценарии вы знаете только то, что записи существуют в рамках этих терминов, и ничего более. Если выпадающие меню должны отображать какую-то информацию о записях, возможно, вам понадобится что-то другое. В противном случае, функция get_terms — это то, что вы ищете.

14 февр. 2013 г. 19:21:05
1

Я смог выполнить эту условную проверку с помощью следующего кода -

if (get_category('40')->category_count > 0) {
    ..//показывать выпадающий список
}
14 февр. 2013 г. 19:24:46
Комментарии

Это не сработает, если термин 40 будет удалён или его ID изменится.

Tom J Nowell Tom J Nowell
14 февр. 2013 г. 19:34:05
0

Нет необходимости возвращать полный объект get_posts, вы можете оптимизировать запрос, используя параметр fields для возврата только ID записей

$posts = get_posts( array(
    'post_type' => 'Events',
    'posts_per_page' => 1,
    'fields' => 'ids',
    'tax_query' => array(
        array(
            'taxonomy' => 'category',
            'field'    => 'term_id',
            'terms'    => array( '40' )
        ),
    ),
) );
if ( ! empty ( $posts ) ) {
    ..// показать выпадающее меню
}
4 авг. 2015 г. 23:54:10