как запросить записи по категории и метке?
Я пытаюсь показать список записей, которые относятся к категории X и метке Y. Я пробовал следующий код:
$args = array(
'posts_per_page' => 4, // количество записей на страницу
'tag_id' => $tag_id, // ID метки
'cat' => $cat_id, // ID категории
);
query_posts($args);
но он работает некорректно и возвращает все записи в категории.
Буду рад услышать любые ваши предложения

Редактирование: Смотрите ниже правильный способ запроса пересечений категорий и меток.
global $wp_query;
$args = array(
'category__and' => 'category', //необходимо использовать ID категории для этого поля
'tag__in' => 'post_tag', //необходимо использовать ID метки для этого поля
'posts_per_page' => -1); //получить все записи
$posts = get_posts($args);
foreach ($posts as $post) :
//выполняем действия
endforeach;

Этот код работает:
$args = array(
'tag' => get_queried_object()->slug, // Если постоянная ссылка вида example.com/tag/example-tag и т.д.
'posts_per_page' => -1, // Количество постов (-1 = все посты)
'tax_query' => array(
array(
'taxonomy' => 'category', // Таксономия, в моем случае нужны стандартные категории записей
'field' => 'slug', // Поле для сравнения (слаг)
'terms' => 'interior', // Слаг вашей категории (у меня есть категория 'interior')
),
)
); // Получаем все записи
$posts_new = get_posts( $args );

Думаю, это баг в WordPress, о котором уже упоминалось в других обсуждениях. Попробуйте использовать название тега вместо его ID, тогда всё должно заработать:
$args = array(
'posts_per_page' => 3,
'tag' => 'review',
'cat' => 9,
);
query_posts($args);
Дайте нам знать, как у вас получится. Не уверен, что будет с тегами, состоящими из нескольких слов.

Я столкнулся с такой же проблемой и решил её, сделав запрос к MySQL.
Коротко: get_post($args) вернет вам записи, у которых есть категория=MyCategory ИЛИ тег=MyTag.
Вам же нужно заменить ИЛИ на И.
Моя логика заключалась в том, чтобы сразу перейти к MySQL-запросу:
- Запрос 1 = Выбрать все записи, у которых есть категория MyCat
- Запрос 2 = Выбрать все записи, у которых есть тег MyTag
- Финально: Выбрать все записи, которые есть в Запросе 1 И Запросе 2
Я использовал wpdb вместо query_post();
Немного кода (возвращает опубликованные записи с категорией MyCat и тегом MyTag):
$query_byTag="
SELECT wp_posts.ID
FROM wp_posts, wp_term_relationships, wp_terms
WHERE wp_posts.ID = wp_term_relationships.object_id
AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
AND wp_terms.name = 'MyTag'";
$query_byCat="
SELECT wp_posts.ID
FROM wp_posts, wp_term_relationships, wp_terms
WHERE wp_posts.ID = wp_term_relationships.object_id
AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
AND wp_terms.name = 'MyCat'";
$query ="
SELECT wp_posts.post_title AS title ,
wp_posts.post_content AS content,
wp_posts.post_date AS blogdate
FROM wp_posts
WHERE wp_posts.post_status = 'publish'
AND wp_posts.ID IN (".$query_byTag.")
AND wp_posts.ID IN (".$query_byCat.")
ORDER BY wp_posts.post_date DESC ";
$result= $wpdb->get_results($query);
Это грязный способ, но надеюсь, он поможет =)

Это гораздо проще сделать с помощью WP_Query
и отношения tax_query
AND, без необходимости использовать чистый SQL.

В WordPress нет абсолютно никакой необходимости использовать чистые запросы для достижения этого.

SELECT wp_posts.post_name
FROM wp_posts, wp_term_relationships, wp_terms, wp_term_taxonomy
WHERE wp_posts.ID = wp_term_relationships.object_id
AND wp_terms.term_id = wp_term_taxonomy.term_id
AND wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id
AND wp_terms.name = "МОЙ ТЕГ"

Ответы только с кодом редко соответствуют стандартам качества. Пожалуйста, отредактируйте ваш ответ и добавьте пояснения / комментарии о том, как это решение устраняет исходную проблему, а также информацию о том, как и где его применять.
