クエリー回り素人な私のぱっと思い付いたものでは…毎回ランダムではなく一定時間同じ結果をTransients APIを使ってキャッシュして表示するってのはどうですか?(只これだと大量の記事をキャッシュしてしまうことになるからだめか…)
ご返信ありがとうございます、自分は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 )がリクエストごとに動かないようにして、ページングさせてもいいかも、
@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();
?>