web-dev-qa-db-ja.com

カスタム投稿タイプアーカイブページ:ページごとの投稿数の設定、ページ付け

私はvideoというカスタム投稿タイプを持っています。アーカイブページをページ分割して、各ページに 3つの投稿のみ と表示します。

アーカイブページには all ビデオ投稿(サムネイルギャラリー用)を出力するカスタムループもあります。

これがarchive-video.phpです。

<?php while( have_posts() ) : the_post(); ?>
    MAIN LOOP...
<?php endwhile; wp_reset_query(); ?>

<?php next_posts_link(); previous_posts_link(); >

<?php $custom_loop = new WP_Query( array('post_type' => 'video', 'posts_per_page' => '-1' ) );
<?php while ( $custom_loop->have_posts() ) : $custom_loop->the_post(); ?>
    CUSTOM LOOP...
<?php endwhile; ?>

posts_per_page(ここのコード) を使ってpre_get_postsを3に設定しようとしました。ページ付けは完全に機能しますが、カスタムループは3つの投稿のみを出力し、すべての投稿は出力しません。

ハードコーディングされた/プラグイン以外のソリューションをお持ちの方は?無駄にグーグルされています...何かアドバイス/助けは最も感謝されるでしょう!

4
asymptote

あなたが投稿したリンク内のコードは(pre_get_postsを使用して)、そのタイプからの投稿をクエリしている場合は常にposts_per_pageの数を3に変更します。だからより良い解決策はその前に、そのコードを使わず、単にあなたのコードより上にすることでしょう:

<?php while( have_posts() ) : the_post(); ?>

追加:

if ( get_query_var('paged') )
    $paged = get_query_var('paged');
elseif ( get_query_var('page') )
    $paged = get_query_var('page');
else
    $paged = 1;
query_posts(array('post_type' => 'video', 'posts_per_page' => '3', 'paged' => $paged ));

これはそのクエリにのみ影響し、その投稿タイプのすべてのクエリには影響しません。

更新:

コードの構造は次のようになります。

if ( get_query_var('paged') )
    $paged = get_query_var('paged');
elseif ( get_query_var('page') )
    $paged = get_query_var('page');
else
    $paged = 1;
query_posts(array('post_type' => 'video', 'posts_per_page' => '3', 'paged' => $paged ));
while( have_posts() ) : the_post(); 
    //MAIN LOOP...
endwhile; wp_reset_query(); 

next_posts_link(); previous_posts_link(); 

$custom_loop = new WP_Query( array('post_type' => 'video', 'posts_per_page' => '-1' ) );
while ( $custom_loop->have_posts() ) : $custom_loop->the_post();
    //CUSTOM LOOP...
endwhile;
wp_reset_query(); 
4
Bainternet

'paged' => $paged,の後にnew WP_Query( array('post_type' => 'video',を試して、'posts_per_page' => '-1''posts_per_page' => '3'に変更してください。

1
MartinJJ

私はあなたのケースではpre_get_postsフックを使います、そして私はメインのクエリをフィルタリングします。 functions.phpに次のコードを追加してください。

add_action( 'pre_get_posts', function ( $query ) {
  if ( $query->is_post_type_archive( 'video' ) && $query->is_main_query() && ! is_admin() ) {
    $query->set( 'posts_per_page', 3 );
  }
} );

お役に立てれば!

0
Robert Bokori