Проверка наличия записей в категории произвольного типа записей вне цикла
Я создаю навигацию вне основного цикла, которая включает выпадающие меню. У меня есть произвольный тип записей '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 категории относится только к этому пользовательскому типу записей. Я согласен с хардкодингом, но я модифицирую чужой код. Первое предложенное вами решение продолжает возвращать пустой массив, даже когда в этой категории есть записи. А второе предложение... оно немного сложнее, чем я искал, потому что мне не нужно фактически выводить что-либо из этого запроса. Мне просто нужно проверить, есть ли записи в категории. Ваш ввод очень ценится.
RCNeil
Второе решение идентично первому, это то, что get_posts делает внутри, и они означают одно и то же и работают одинаково. Просто потому что вы сделали запрос, не означает, что вы должны делать цикл.
Tom J Nowell
Также, если у вас есть пользовательская таксономия, почему вы используете 'category=40', а не 'customtaxonomyname=40'?
Tom J Nowell
спасибо за информацию. На самом деле, таксономии здесь нет, как я сейчас вижу, разбирая файл functions.php. Используются категории из типов записей. И даже с учетом всего этого, почему оба решения возвращают мне пустой массив, даже если я просто делаю запрос по ID категории, не привязывая его к определенным типам записей? Это имеет значение?
RCNeil
Это указывает на отсутствующую информацию. Не могли бы вы опубликовать код регистрации вашего типа записи?
Tom J Nowell
Еще раз... это не мой код, но разработчик использовал плагин http://wordpress.org/extend/plugins/types/ для их создания.
RCNeil
давайте продолжим обсуждение в чате
RCNeil
Если вам нужен массив со всеми терминами вашей пользовательской таксономии, с дополнительным условием, что они содержат хотя бы одну запись, то вот функция, которая вам нужна:
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 ) ) {
..// показать выпадающее меню
}