WordPress

pętla – Grupuj posty w kategorii na podstawie tagów w niestandardowej taksonomii

  • 8 maja, 2020
  • 4 min read
pętla – Grupuj posty w kategorii na podstawie tagów w niestandardowej taksonomii


Dla query_post funkcji, zaleca się, aby nie używać zgodnie z oficjalną dokumentacją.

Ta funkcja całkowicie zastąpi główne zapytanie i nie jest przeznaczona do użytku przez wtyczki lub motywy…….Nie wolno jej używać w pętli WordPress.

Możesz przeczytać ten post, aby uchwycić więcej pomysłów.

Aby zapytać o wiele taksonomii, możesz użyć klasy WP_Query do utworzenia niestandardowego zapytania.

<?php
$slug = the_slug();

// get all the tags from the database
$tags = get_tags();

// loop through the categories
foreach ($tags as $tag) {
    // setup the category ID
    $tag_id = $tag->term_id;

    // custom query with multiple taxonomy as parameter
    $args = array(
        'orderby' => 'title', 
        'order' => 'ASC', 
        'posts_per_page' => -1,
        'tax_query' => array(
            'relation' => 'AND', // at the same time meet both conditions
            array(
                'taxonomy' => 'towns', // custom tag taxonomy name
                'field'    => 'term_id',
                'terms'    => array( $tag_id ),
            ),
            array(
                'taxonomy' => 'category', // default taxonomy category name
                'field'    => 'slug',
                'terms'    => array( $slug ),
            ),
        ),
    );

    $query = new WP_Query( $args );

    // start the wordpress loop!
    if ($query->have_posts()) :

        // Make a header for the category, only if there are posts under it
        echo '<h2 class="group-title">'.$tag->name.'</h2>';

        while ($query->have_posts()) : $query->the_post(); 
            get_template_part('template-parts/place-listing', 'place');
        endwhile;

        // After looping through a nested query, this function restores the $post global to the current post in this query.
        // properly reset may avoid problem in most of the cases
        wp_reset_postdata(); 

    endif; // done our wordpress loop. Will start again for each category 
} // done the foreach statement 
?>

Cześć Steve, przeczytałem również twoje poprzednie pytania, które @Pieter Goosen sugeruje użycie domyślnej pętli. Ponieważ używasz query_post() z argumentem. W takim przypadku WP_Query jest preferowany ze względu na wydajność i stabilność, ponieważ query_post modyfikuje globalny obiekt $post. Myślę, że ta część jest tylko częścią szablonu, a nie główną pętlą. Sugestia jest oparta na oryginalnym kodzie i środowisku. Możesz dostosować i przetestować zgodnie z rzeczywistymi potrzebami.

Warto przeczytać!  baza danych - Zapisywanie zera jako wartości meta

Sugestie dotyczące rozwiązywania problemów i debugowania

Jeśli nie ma wyników, dobrze jest podzielić zapytanie na części i przetestować skończonymi wartościami.

(Poniższe są testowane i działają poprzez umieszczenie w haku init w functions.php z symulowaną taksonomią, ślimakiem i identyfikatorem, do celów testowych nie umieściłem wewnątrz szablonu)

  1. przetestować go z wartością ślimaka i tylko 1 taksonomią
$args = array(
    // 'post_type' => 'post', // default post type is 'post', allow array of post types
    'orderby' => 'title', 
    'order' => 'ASC', 
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( 'arts' ), // place the slug here
        ),
    ),
);

$query = new WP_Query( $args );

if ($query->have_posts()) :

    while ($query->have_posts()) : $query->the_post(); 
        the_title();
        echo 'something';
    endwhile;

    wp_reset_postdata(); 

endif;

  1. aby przetestować go z wartością ślimaka i 1 niestandardową taksonomią
$args = array(
    'orderby' => 'title', 
    'order' => 'ASC', 
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'towns', // custom tag taxonomy name, please confirm the name
            'field'    => 'term_id',
            'terms'    => array( 43 ), // change to your tag ID
        ),
    ),
);

$query = new WP_Query( $args );

if ($query->have_posts()) :

    while ($query->have_posts()) : $query->the_post(); 
        the_title();
        echo 'something';
    endwhile;

    wp_reset_postdata(); 

endif;
  1. przetestować go z wartością ślimaka i wieloma taksonomiami
$args = array(
    'orderby' => 'title', 
    'order' => 'ASC', 
    'posts_per_page' => -1,
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( 'arts' ),
        ),
        array(
            'taxonomy' => 'towns',
            'field'    => 'term_id',
            'terms'    => array( 43 ), // change to your tag ID
        ),
    ),
);

$query = new WP_Query( $args );

if ($query->have_posts()) :

    while ($query->have_posts()) : $query->the_post(); 
        the_title();
        echo 'something';
    endwhile;

    wp_reset_postdata(); 

endif;


Źródło

Warto przeczytać!  php — Jak sprawić, aby ten krótki kod nie odświeżał całej strony, gdy używam go na interfejsie użytkownika