web-dev-qa-db-ja.com

2つの分類法を使用したCPTのクエリ

私はしばらくの間これをうまく運ばずに整理しようとしてきたので、誰かが私を正しい方向に向けることができるかもしれません。

enter image description here

reportsというCPTを作成し、その下にreport-locationsreport-weeksという2つのカスタム分類を作成しました。 report-weeksreport-locationsの両方でreportsのみをクエリするページが必要です。

reportsが各report-weeksの下にリストされ、その週の下で、彼らはreport-locationsをリ​​ストするはずです。どうにかして注文できるようにしたいと思います。

これまでのところ、私は私を近づける次のものを持っていますが、report-locationsを取得してリストするための二次関数に依存しており、したがって、それらは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

免責事項:それはあまり効率的な解決策ではないでしょうし、私はあなたがこれら2つの分類法に多くの用語を持っていないことを願っています。

さて、免責事項は、私たちは解決策に行くことができます;)そしてここでそれは行きます:

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

それで、我々はそこで何をしますか?まず、毎週、すべての場所を繰り返し、すべてのペアに対してWP_Queryを準備します。これにより、投稿が割り当てられていないペアを省略できます。

これらのクエリを準備した後、結果を出力することができます。そのため、もう一度繰り返して、指定されたペアに割り当てられている投稿を印刷する必要があります。

1