サポート » 使い方全般 » WP_Queryでorderbyをrandにした場合、表示済み記事を重複表示させないようにし

  • WP_Queryでパラメータorderbyをrandにした場合、2ページ目以降に1ページ目に表示されている記事が再度呼び出されてしまうので、表示済み記事を重複表示させないようにしたいです。
    記事データすべてからランダムで呼び出している事が原因だと思うのですが、3.0.6で既出記事を除外する方法はありますでしょうか?お分かりになられましたら、ご教授いただけますと助かります。

    現在のコード

    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
        'posts_per_page' => 10,
        'paged' => $paged,
        'orderby' => 'rand'
    );
    
    $the_query = new WP_Query( $args );
    
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post(); 
    
    the_content();
    
    endwhile;
    endif;
    wp_reset_postdata();
    ?>

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • クエリー回り素人な私のぱっと思い付いたものでは…毎回ランダムではなく一定時間同じ結果をTransients APIを使ってキャッシュして表示するってのはどうですか?(只これだと大量の記事をキャッシュしてしまうことになるからだめか…)

    トピック投稿者 under

    (@under)

    ご返信ありがとうございます、自分はTransients APIを使った事が無いので具体的な導入方法がまだわかりませんが、別の使い方で考えるととても可能性のある機能ですね、参考になりました。

    こんにちは

    ‘orderby’ => ‘rand’をやめて、shuffle($paging_contents)のようにするといいと思います。

    固定ページテンプレートの、サンプル

    <?php
    
    $posts_per_page				 = 6; //ページあたりのリンク件数
    $paged					 = '';
    $content				 = '';
    $html_structure				 = '<li><a href="%1$s">%2$s</a></li>';
    $html_list_wrapper			 = '<ul>%1$s</ul>';
    $html_pagenate_links_wrapper = '<p class="pagenate_links">%1$s</p>';
    
    $paged = get_query_var( 'paged' );
    
    if ( !isset( $posts_per_page ) ) {
    
    	$posts_per_page = get_option( 'posts_per_page' );
    }
    
    $args = array( 'paged' => $paged, 'posts_per_page' => $posts_per_page );
    
    if ( !is_paged() ) {
    
    	$args[ 'numberposts' ] = $posts_per_page;
    	$paged		       = 1;
    } elseif ( $paged == 2 ) {
    
    	$args[ 'offset' ] = $posts_per_page;
    } else {
    
    	$args[ 'offset' ] = $posts_per_page * ( $paged - 1 );
    }
    
    $paging_contents = get_posts( $args );
    
    if ( $paging_contents ) {
    
    	shuffle($paging_contents);
    
    	foreach ( $paging_contents as $q ) {
    
    		$content .= sprintf( $html_structure, esc_url( $q->guid ), $q->post_title );
    	}
    
    	printf( $html_list_wrapper, $content );
    }
    
    /* Make pagenate links */
    
    $total_content	         = get_posts( 'numberposts=-1' );
    $page_total		 = ceil( count( $total_content ) / $posts_per_page );
    $pagination		 = array(
    	'base'		 => @add_query_arg( 'paged', '%#%' ),
    	'format'	 => '',
    	'total'		 => $page_total,
    	'current'	 => $paged,
    	'show_all'	 => false,
    	'type'		 => 'plain'
    );
    
    if ( $wp_rewrite->using_permalinks() ) {
    	$pagination[ 'base' ] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
    }
    
    if ( $page_total - $paged >= 0 ) {
    
    	printf( $html_pagenate_links_wrapper, paginate_links( $pagination ) );
    }

    ページごとにランダムが気に入らない場合は、

    @Hinaloeさんの提案のように、

    if( ! $_SESSION['my_obj'] ){
    $the_query = new WP_Query( $args );
    $_SESSION['my_obj'] = $the_query;
    } else {
    	$the_query = $_SESSION['my_obj'];
    }

    のようにして、WP_Query( $args )がリクエストごとに動かないようにして、ページングさせてもいいかも、

    トピック投稿者 under

    (@under)

    @nobitaさんアドバイスありがとうございます。正にこういう呼び出しをしたかったのでとても助かります。いただいた方法でランダム抽出出来る事を確認させていただきました。
    ただ、自分のphpに関するスキル不足により、カテゴリ絞り込みができなかったり、教えていただいたコードと合体させようとするとphpの中にphpのようになってしまったり、、まだ形にならず頭がパンク中ですが、もう少しやってみようとおもいます。

    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array( 
    
        'cat' => 1,
        'posts_per_page' => 10,
        'paged' => $paged,
        'orderby' => 'desc'
    );
    
    $the_query = new WP_Query( $args );
    
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
    ?>
    
    <div class="<?php echo get_post_meta($post->ID , 'xxxxx' ,true); ?>">
    <a href="<?php the_ID(); ?>">
    <?php if(has_post_thumbnail()) { echo the_post_thumbnail(); } ?>
    
    <?php
    $terms = get_the_terms( get_the_ID(), 'xxxx' );
    if ( !empty($terms) ) : if ( !is_wp_error($terms) ) :
    ?>
    <?php foreach( $terms as $term ) : ?>
    <strong class="<?php echo $term->slug; ?>"><?php echo $term->name; ?></strong><br/>
    <?php endforeach; endif; endif; ?>
    
    <h2>
    <?php
    if ( post_custom('xxxxxx') ) : echo get_post_meta($post->ID , 'xxxxxx' ,true);
    else :
    the_title();
    ?>
    </h2>
    </a>
    
    </div><!-- /.post -->
    
    <?php endwhile; ?>
    <ul id="pagetop"><li><a href="#top">PAGETOP</a></li></ul>
    <div class="nav-below" id="nav-belowID"><?php next_posts_link('古い記事へ') ?></div>
    
    <?php endif;
    wp_reset_postdata();
    ?>
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「WP_Queryでorderbyをrandにした場合、表示済み記事を重複表示させないようにし」には新たに返信することはできません。