Wie kann man Beiträge nach Kategorie und Tag abfragen?

11

Ich versuche, eine Liste von Posts anzuzeigen, die sich auf Kategorie X und Tag Y beziehen. Ich habe den folgenden Code ausprobiert:

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

aber es funktioniert nicht richtig und gibt alle Beiträge in der Kategorie zurück.

Würde gerne einen Einblick hören, den Sie haben könnten

hannit cohen
quelle
Ich denke, mit query_posts () können Sie nur Kategorie oder Tag verwenden. Ich bin mir nicht sicher, aber vielleicht ist die Verwendung der Funktion auf das beschränkt, was bedeuten würde, dass dies korrekt funktioniert, aber es macht nicht das, was Sie wollen.
hakre

Antworten:

19

Bearbeiten: Im Folgenden erfahren Sie, wie Sie Kategorien- und Tag-Schnittpunkte richtig abfragen können.

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;
Chris_O
quelle
3

Ich denke, dies ist ein Fehler in WordPress, der an anderer Stelle kommentiert wurde. Versuchen Sie, den Namen des Tags anstelle der ID zu verwenden, dann sollte es funktionieren:

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

Lassen Sie uns wissen, wie Sie vorankommen und nicht sicher sind, was mit Tags mit mehreren Wörtern im Namen passiert.

James Piggot
quelle
2

Ich bin auf dasselbe Problem gestoßen und habe es durch eine MySQL-Anfrage gelöst.

Kurz gesagt: get_post ($ args) gibt Ihnen Beiträge zurück, die die Kategorie = MyCategory ODER das Tag = MyTag haben.

Was Sie wollen, ist, Ihr ODER in UND zu ändern .

Meine Logik war, direkt mit einer MySQL-Abfrage fortzufahren:

  • Abfrage 1 = Wählen Sie alle Beiträge aus, die die Kategorie MyCat haben
  • Abfrage 2 = Wählen Sie alle Beiträge mit dem Tag MyTag aus
  • Endlich: Wählen Sie alle Beiträge aus, die sich in Abfrage 1 UND Abfrage 2 befinden.

Ich habe wpdb anstelle von query_post () verwendet.

Ein bisschen Code (Rückgabe veröffentlichter Beiträge mit der Kategorie MyCat und dem Tag 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);

Dies ist ein schmutziger Weg, aber ich hoffe es hilft =)

Wouwei
quelle
7
Dies ist mit WP_Queryeiner tax_queryUND-Beziehung viel einfacher zu erreichen , ohne dass Roh-SQL erforderlich ist.
Milo
Es ist absolut nicht erforderlich, rohe Abfragen in WordPress durchzuführen, um dies zu erreichen.
Johan Pretorius
2

Dieser Code funktioniert:

$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 );
Oleksandr Chopenko
quelle
-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"
mal
quelle
2
Nur Code-Antworten erfüllen selten Qualitätsstandards. Bitte bearbeiten Sie Ihre Antwort und geben Sie Hinweise / Kommentare dazu an, wie das ursprüngliche Problem gelöst wird und wie / wo es implementiert werden soll.
Howdy_McGee
Dies ist mit WP_Query und einer tax_query AND-Beziehung viel einfacher zu erreichen, ohne dass SQL erforderlich ist.
Johan Pretorius