jak wyszukiwać posty według kategorii i tagu?


11

Próbuję wyświetlić listę postów związanych z kategorią X i tagiem Y. Próbowałem następującego kodu:

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

ale nie działa poprawnie i zwraca wszystkie posty w katalogu.

Bardzo chciałbym usłyszeć każdy wgląd


Myślę, że dzięki query_posts () możesz używać tylko kategorii lub tagu. Nie jestem pewien, ale może użycie funkcji jest ograniczone do tego, co oznaczałoby, że działa ona poprawnie, ale nie robi tego, co chcesz.
hakre

Odpowiedzi:


19

Edycja: patrz poniżej odpowiedni sposób zapytania o kategorie i przecięcia znaczników.

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

Myślę, że to błąd w WordPressie, który został skomentowany w innym miejscu, spróbuj użyć nazwy znacznika zamiast identyfikatora, to powinno działać:

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

Poinformuj nas, jak sobie radzisz, nie wiedz, co się stanie z tagami z wieloma słowami w nazwie.


2

Natknąłem się na ten sam problem i rozwiązałem go, wysyłając żądanie MySQL.

w skrócie: get_post ($ args) zwróci Ci posty, które mają kategorię = MyCategory LUB tag = MyTag.

chcesz zmienić OR na AND .

moją logiką było przejście od razu do zapytania MySQL:

  • Zapytanie 1 = Wybierz wszystkie posty z kategorii MyCat
  • Zapytanie 2 = Wybierz wszystkie posty, które mają tag MyTag
  • Wreszcie: wybierz wszystkie posty, które są w Zapytaniu 1 ORAZ Zapytaniu 2.

Użyłem wpdb zamiast query_post ();

Trochę kodu (zwracanie opublikowanych postów z kategorią MyCat i tagiem 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);

To jest brudny sposób na zrobienie tego, ale mam nadzieję, że to pomoże =)


7
Jest to o wiele łatwiej osiągnąć z WP_Querya tax_queryI relacji , nie ma potrzeby surowego SQL.
Milo

W tym celu absolutnie nie ma potrzeby wykonywania surowych zapytań w WordPress.
Drmzindec

2

Ten kod działa:

$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
Kod tylko odpowiedzi rzadko spełniają standardy jakości. Edytuj swoją odpowiedź i dołącz uwagi / komentarze na temat tego, jak to rozwiązuje pierwotny problem, oraz jak / gdzie go wdrożyć.
Howdy_McGee

Jest to o wiele łatwiejsze do osiągnięcia dzięki WP_Query i relacji tax_query AND, bez potrzeby używania surowego SQL.
Drmzindec
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.