web-dev-qa-db-ja.com

動的カテゴリでループする

カテゴリに関連付けられているすべての投稿を表示するWordPressループを作成する必要がありますが、表示しているページに一致させるにはそのカテゴリが必要です。

たとえば、ページ1に表示するすべての投稿があるカテゴリ1があるとします。ページ2に移動すると、そのカテゴリをカテゴリ2に変更して、関連するすべての投稿がページ2に表示されます。

現在、私のループはこのように見えます:

<?php query_posts('$cat_ID'); ?>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <?php the_content(); ?>

    <?php endwhile; else: ?>

        <p>Sorry, this page does not exist</p>

    <?php endif; ?>
</div>

明らかにこれはカテゴリに関係なくすべての投稿を表示しようとしています。ページによってカテゴリが変わることを確認する必要があります。

助言がありますか?

4
Nathan Alvarez

以下のコードはページのカテゴリを有効にします。ページに割り当てられたカテゴリをループし、各カテゴリの投稿を表示するページテンプレートの例が提供されています。

ユーザーが1つのカテゴリのみを選択するように制限したい場合は、 Taxonomy Single Term などのソリューションを使用できます。

category分類法をpage投稿タイプに関連付けます。

function wpse_page_category() {
    register_taxonomy_for_object_type( 'category', 'page' );    
}
add_action( 'init', 'wpse_page_category', 999  );

必要最小限のページテンプレートの例(template-page-categories.php):

<?php
/**
 * Template Name: Page Categories
 *
 */

get_header(); ?>


<?php 
    // Standard loop for page content
    if ( have_posts() ) {
        while ( have_posts() ) {
            the_post();
            the_title( '<h1>', '</h1>' );
            the_content();
        }
    }


    // Get the category assigned to this page and list the posts in this category.
    // This code works when multiple categories have been assigned to the page.
    $page_categories = get_the_terms( get_the_ID(), 'category' );
    if ( $page_categories && ! is_wp_error( $page_categories ) ) {

        foreach ( $page_categories as $page_category ) {

            $posts_query = new WP_Query( [
                'post_type' => 'post',
                'cat' => $page_category->term_id,
            ] );


            if ( $posts_query->have_posts() ) {
                echo '<h2> Posts from the <em>' . esc_html( $page_category->name ) . '</em> category:</h2>';
                while ( $posts_query->have_posts() ) {
                    $posts_query->the_post();
                    the_title( '<h3>', '</h3>' );
                    //the_content();
                }
                echo '<hr>';
            }
        }
    }

?>
1
Dave Romsey