Проверка наличия записей в категории произвольного типа записей вне цикла
Я создаю навигацию вне основного цикла, которая включает выпадающие меню. У меня есть произвольный тип записей 'Events' со своими категориями. Я хочу, чтобы выпадающее меню отображалось только если существуют записи в этом произвольном типе записей и категории, но я не уверен, какие функции следует использовать для определения этого...
У меня есть...
$hasposts = get_posts('post_type=Events&category=40');
if($hasposts) {
..// показать выпадающее меню
}
Должен ли я вообще использовать get_posts()
? Всё, что я получаю в ответ - пустой массив, хотя я знаю, что в некоторых из этих категорий есть записи...
Большое спасибо, WA.

В конечном итоге всё сводится к 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 ){
// у нас есть записи
}
}

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

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

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

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

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

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

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

Если вам нужен массив со всеми терминами вашей пользовательской таксономии, с дополнительным условием, что они содержат хотя бы одну запись, то вот функция, которая вам нужна:
get_terms(
'group',
array(
'hide_empty' => true
)
);
Эта функция извлекает информацию о терминах, а не о самих записях. В данном сценарии вы знаете только то, что записи существуют в рамках этих терминов, и ничего более. Если выпадающие меню должны отображать какую-то информацию о записях, возможно, вам понадобится что-то другое. В противном случае, функция get_terms — это то, что вы ищете.

Нет необходимости возвращать полный объект 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 ) ) {
..// показать выпадающее меню
}
