як запитувати повідомлення за категоріями та тегами?


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:

  • Запит 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);

Це брудний спосіб зробити це, але я сподіваюся, що це допоможе =)


7
Це набагато простіше здійснити WP_Queryі з tax_queryІ відносинами , не потрібно в необробленому 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.