it-swarm.com.de

CPT mit zwei Taxonomien abfragen

Ich habe versucht, dies für eine Weile ohne Glück zu regeln, damit mich vielleicht jemand in die richtige Richtung weisen kann.

 enter image description here 

Ich habe ein CPT mit dem Namen reports erstellt und zwei benutzerdefinierte Taxonomien mit dem Namen report-locations und report-weeks verwendet. Ich möchte eine Seite, die nur reports mit report-weeks und report-locations abfragt.

Die reports wird unter jedem report-weeks aufgelistet und dann sollten sie unter dieser Woche den report-locations auflisten und ich möchte sie irgendwie bestellen können.

Bisher habe ich Folgendes, das mich näher bringt, aber es basiert auf einer sekundären Funktion, um den report-locations zu erfassen und aufzulisten, und daher kann ich diese Posts nicht bestellen, da sie nicht Teil des WP_Query sind.

<?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

Haftungsausschluss: Es wird keine sehr effiziente Lösung sein und ich hoffe, Sie haben nicht viele Begriffe in diesen 2 Taxonomien (wenn ja, sollten Sie es ein wenig anders machen und einige benutzerdefinierte SQL-Abfragen einschließen).

OK, Haftungsausschluss gemacht, wir können zur Lösung gehen;) Und hier geht es:

<?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();
?>

Also, was machen wir dort? Zuerst durchlaufen wir jede Woche und jeden Ort und bereiten WP_Query für jedes Paar vor. Auf diese Weise können wir die Paare auslassen, denen keine Posts zugewiesen sind.

Nachdem wir diese Abfragen vorbereitet haben, können wir die Ergebnisse ausgeben. Wir müssen also noch einmal iterieren und die Beiträge drucken, die einem bestimmten Paar zugewiesen sind.

1