web-dev-qa-db-fra.com

Interrogation du CPT avec deux taxonomies

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.

enter image description here

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; ?>
2
tylorreimer

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.

1