web-dev-qa-db-ja.com

ループが正しいカテゴリを動的に取得し、すべての分類された投稿を表示しないのはなぜですか?

目的:カテゴリーがクリックされると、category.phpページでそのクリックされたカテゴリーの下に投稿されたすべての投稿を動的に取り込むようにします。

例:ニュース - >(アクション:クリック) - >カテゴリ=ニュース

現在、私のループはCategoryから3つの投稿を引き出しています:どのカテゴリがクリックされても、未分類。私は自分のループと引数を確認しましたが、すべてが意図したとおりに機能しているはずです。私はこれについての新鮮な目に感謝します。

CATEGORY.PHP

<?php get_header(); ?>
<section class="component" role="main">
<header class="header">
<h1 class="entry-title"><?php single_cat_title(); ?></h1>
<?php if ( '' != category_description() ) echo apply_filters( 'archive_meta', '<div class="archive-meta">' . category_description() . '</div>' ); ?>
</header>
<section class="component responsive">
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

// Grabs the selected category
foreach((get_the_category()) as $category)
{
    $postcat= $category->cat_ID;
}

$args = array(
           'posts_per_page' => 7,
           'paged' => $paged,
           'cat' => $postcat // Passes the selected category to the arguments
        );

$custom_query = new WP_Query( $args );
$post_number = 0;


if ( $custom_query->have_posts() ) : while($custom_query->have_posts()) : $custom_query->the_post(); ?>
        <?php the_title(); ?>
    <?php endwhile; else : ?>
<?php endif; ?>
    <div class="clear"></div>
    <?php if (function_exists("pagination")) {
        pagination($custom_query->max_num_pages);
    } ?>
    </section>
</section>
1
Peter

テンプレート全体が壊れているのは、メインのクエリを変更するのではなく、破棄して新しいクエリを次の場所に配置したためです。

$args = array(
           'posts_per_page' => 7,
           'paged' => $paged,
           'cat' => $postcat // Passes the selected category to the arguments
        );

$custom_query = new WP_Query( $args );

WPは、どのページ、いくつの投稿、どの種類の投稿など、新しいクエリで複製する必要があるかを把握するために多くの作業を行いました。繰り返しになりますが、これはまったく新しいクエリです。パフォーマンスやスピードも非常に悪く、ページが遅くなります。

代わりに、pre_get_postsフィルタを使用してアーカイブを当初の予定どおりに7件の投稿に制限した場合は、カスタムクエリと同様に、すべてのページ区切りコードを削除できます。

最初に、メインのクエリがカテゴリアーカイブ用のものである場合、functions.phpに7件の投稿のみを表示するようにクエリを調整しましょう。

function limit_category( $query ) {
    if ( $query->is_category() && $query->is_archive() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', '7' );
    }
}
add_action( 'pre_get_posts', 'limit_category' );

これで、標準的なページ付け関数と、通常の標準投稿ループをcategory.phpで使用できます。

if ( have_posts() ) { // if we have posts
    while( have_posts() ) { // while we still have posts
        the_post(); // set the current post
        the_title(); // display its title
        the_content(); // display its content
    }
    // display the pagination links
    ?>
    <div class="nav-previous alignleft"><?php previous_posts_link( 'Older posts' ); ?> </div>
    <div class="nav-next alignright"><?php next_posts_link( 'Newer posts' ); ?></div>
    <?php
} else {
    echo "<p>No posts found</p>";
}
1
Tom J Nowell