как запросить записи по категории и метке?

17 нояб. 2010 г., 23:58:53
Просмотры: 160K
Голосов: 14

Я пытаюсь показать список записей, которые относятся к категории X и метке Y. Я пробовал следующий код:

$args = array(
    'posts_per_page' => 4, // количество записей на страницу
    'tag_id' => $tag_id, // ID метки
    'cat' => $cat_id, // ID категории
);
query_posts($args);

но он работает некорректно и возвращает все записи в категории.

Буду рад услышать любые ваши предложения

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

Я думаю, что с query_posts() можно использовать только категории или теги. Не уверен, но, возможно, функциональность этой функции ограничена именно этим, что означает, что она работает корректно, но не делает то, что вы хотите.

hakre hakre
18 нояб. 2010 г. 01:40:26
Все ответы на вопрос 5
0
21

Редактирование: Смотрите ниже правильный способ запроса пересечений категорий и меток.

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;
3 дек. 2010 г. 21:58:39
0

Этот код работает:

$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 );
11 мар. 2016 г. 02:57:31
0

Думаю, это баг в WordPress, о котором уже упоминалось в других обсуждениях. Попробуйте использовать название тега вместо его ID, тогда всё должно заработать:

$args = array(
    'posts_per_page' => 3,
    'tag' => 'review',
    'cat' => 9,
);
query_posts($args);

Дайте нам знать, как у вас получится. Не уверен, что будет с тегами, состоящими из нескольких слов.

4 дек. 2010 г. 14:29:13
3

Я столкнулся с такой же проблемой и решил её, сделав запрос к 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);

Это грязный способ, но надеюсь, он поможет =)

8 июн. 2014 г. 22:01:12
Комментарии

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

Milo Milo
8 июн. 2014 г. 22:10:28

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

Drmzindec Drmzindec
30 янв. 2020 г. 10:44:07

также я думаю, что это неправильно: "AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id", потому что вы полностью пропускаете таблицу wp_term_taxonomy.

DrLightman DrLightman
15 сент. 2020 г. 13:46:36
2
-1
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 = "МОЙ ТЕГ"
15 мар. 2016 г. 20:45:26
Комментарии

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

Howdy_McGee Howdy_McGee
15 мар. 2016 г. 23:24:59

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

Drmzindec Drmzindec
30 янв. 2020 г. 10:44:35