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.
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)
- 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;
- 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;
- 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;