Cela fait un moment que j'essaie de régler ce problème sans chance, alors quelqu'un pourra peut-être me diriger dans la bonne direction.
J'ai créé un CPT appelé reports
et j'ai deux taxonomies personnalisées appelées report-locations
et report-weeks
. Je veux une page qui interroge uniquement reports
avec report-weeks
et report-locations
.
La reports
sera répertoriée sous chaque report-weeks
, puis sous cette semaine, ils devraient répertorier le report-locations
et j'aimerais pouvoir les commander d'une manière ou d'une autre.
Jusqu’à présent, j’ai le texte suivant qui me rapproche, mais il s’appuie sur une fonction secondaire pour saisir et lister le report-locations
et ne me permet donc pas de commander ces publications car elles ne font pas partie du WP_Query
.
<?php
$post_type = 'reports';
$weeks = get_terms( array(
'taxonomy' => 'report-weeks',
'orderby' => 'name',
'order' => 'DESC'
) );
foreach ( $weeks as $week ) :
$cat_query = new WP_Query( array(
'post_type' => $post_type,
'tax_query' => array(
array(
'taxonomy' => $week->taxonomy,
'field' => $week->slug,
'terms' => $week->term_id,
),
),
'posts_per_page' => '-1',
) );
if ( $cat_query->have_posts() ) : ?>
<h2><?php echo $week->name; ?></h2>
<?php while ( $cat_query->have_posts() ) : $cat_query->the_post(); ?>
<article id="<?php echo 'report-' . $post->ID; ?>">
<h3><?php list_custom_taxonomy('report-locations', $post->ID); ?></h3>
<div><?php the_content(); ?></div>
</article>
<?php endwhile; wp_reset_postdata(); ?>
<?php endif; endforeach; ?>
Avertissement: Ce ne sera pas une solution très efficace et j'espère que vous n'avez pas beaucoup de termes dans ces 2 taxonomies (si oui, alors vous devriez le faire un peu différent et inclure des requêtes SQL personnalisées).
OK, disclaimer terminé, on peut aller à la solution;) Et voilà:
<?php
$post_type = 'reports';
$weeks = get_terms( array(
'taxonomy' => 'report-weeks',
'orderby' => 'name',
'order' => 'DESC'
) );
$locations = get_terms( array(
'taxonomy' => 'report-locations',
'orderby' => 'name',
'order' => 'ASC'
) );
$results = array();
foreach ( $weeks as $week ) {
$week_results = array();
foreach ( $locations as $location ) {
$posts = new WP_Query( array(
'post_type' => $post_type,
'tax_query' => array(
array(
'taxonomy' => $week->taxonomy,
'terms' => $week->term_id,
),
array(
'taxonomy' => $location->taxonomy,
'terms' => $location->term_id,
),
),
'posts_per_page' => '-1',
) );
if ( $posts->have_posts() ) {
$week_results[ $location->term_id ] = $posts;
}
}
if ( ! empty( $week_results ) ) {
$results[$week->term_id] = $week_results;
}
}
foreach ( $weeks as $week ) :
if ( ! array_key_exists( $week->term_id, $results ) ) continue;
?>
<h2><?php echo $week->name ?></h2>
<?php
foreach ( $locations as $location ) :
if ( ! array_key_exists( $location->term_id, $results[$week->term_id] ) ) continue;
$query = $results[$week->term_id][$location->term];
?>
<h3><?php echo $location->name; ?></h3>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<h4><?php the_title(); ?></h4>
<div><?php the_content(); ?></div>
<?php endwhile; ?>
<?php endforeach; ?>
<?php
endforeach;
wp_reset_postdata();
?>
Alors, que faisons-nous là-bas? Tout d'abord, nous parcourons chaque semaine et chaque emplacement et préparons WP_Query
pour chaque paire. De cette façon, nous pouvons omettre les paires auxquelles aucun message n’a été attribué.
Après avoir préparé ces requêtes, nous pouvons afficher les résultats. Nous devons donc itérer une fois de plus et imprimer les posts affectés à une paire donnée.