как запросить сообщения по категориям и тегам?


11

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

$args = array(
    'posts_per_page' => 4,
    'tag_id' => $tag_id,
    'cat' => $cat_id,
);
query_posts($args);

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

Хотелось бы услышать любое понимание, которое вы могли бы иметь


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

Ответы:


19

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

global $wp_query;
        $args = array(
        'category__and' => 'category', //must use category id for this field
        'tag__in' => 'post_tag', //must use tag id for this field
        'posts_per_page' => -1); //get all posts

$posts = get_posts($args);
        foreach ($posts as $post) :
  //do stuff 
     endforeach;

3

Я думаю, что это ошибка в WordPress, которая была прокомментирована в другом месте, попробуйте использовать имя тега, а не идентификатор, тогда он должен работать:

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

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


2

Я столкнулся с этой же проблемой и решил ее, сделав запрос MySQL.

вкратце: get_post ($ args) вернет вам сообщения, которые имеют категорию = MyCategory ИЛИ тег = MyTag.

что вы хотите изменить OR на AND .

моя логика заключалась в том, чтобы идти прямо с MySQL Query:

  • Запрос 1 = Выбрать все сообщения, у которых есть категория MyCat
  • Запрос 2 = Выбрать все сообщения, у которых есть тег MyTag
  • И наконец: выберите все сообщения, которые находятся в Query 1 И Query 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);

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


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

Для этого абсолютно не нужно делать необработанные запросы в WordPress.
Drmzindec

2

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

$args = array(
    'tag' => get_queried_object()->slug, // If permalink like example.com/tag/example-tag, etc.
    'posts_per_page' => -1,
    'tax_query' => array( 
        array(
            'taxonomy' => 'category', // Taxonomy, in my case I need default post categories
            'field'    => 'slug',
            'terms'    => 'interior', // Your category slug (I have a category 'interior')
        ),
        ) 
); // Get all posts
$posts_new = get_posts( $args );

-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 = "MY TAG"

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

Это гораздо проще сделать с WP_Query и отношением tax_query AND, нет необходимости в необработанном SQL.
Drmzindec
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.