web-dev-qa-db-ja.com

3日ごとに異なる投稿を表示する

ホームページには3日ごとに異なる(ランダムな)投稿を表示したいセクションがあります。

その方法を見つけようとしています。これは私たちに毎週の投稿をするでしょう、しかし私は3日ごとに投稿を受ける方法を知りません...:

<?php
            global $post;
            $args = array(
                'post_type' => 'girls_tips',
                'posts_per_page' => 1,
                'no_found_rows' => true, 
                'offset' => (date( 'W' ) - 1)
            );
            $posts = get_posts($args);
            foreach($posts as $post):
            setup_postdata($post);
            ?>

            <h2><?php the_title(); ?></h2>

            <?php endforeach; ?>

任意の助けは大歓迎です!乾杯、

1
Peanuts

あなたのコード例は、ランダムではありません、しかし、それは週番号に基づく固定オフセットです。

すでに述べたように、これはクエリAPIで表現できるものではありません。

次のようなアルゴリズムで状態を追跡する必要があるでしょう。

  1. ランダムな投稿をクエリし、そのIDを保存する
  2. 3日先に日付を保存する
  3. まだ日付を確認しています。
  4. 日付が最初から繰り返しを過ぎた場合(および現在の投稿をクエリから除外する場合)
1
Rarst

これを試してください - それはあなたのニーズに合うはずです。注意を払う、私はやっとそれをテストしました...ライブのライブ環境でそれを使用する前にあなた自身をテストしてください。

// calculate times
$second = 1;
$minute = $second * 60;
$hour   = $minute * 60;
$day    = $hour * 24;
$days   = $day * 3;


$time = time(); //get current timestamp
$random_post_timestamp = get_option('my_random_post_timestamp'); //get timestamp of queried post

if( $random_post_timestamp ) {
  $diff = $time - $random_post_timestamp;

  if( $diff >= $days ) { // if timestamp older than 3 days, delete the option
    delete_option('my_random_post');
    delete_option('my_random_post_timestamp');
  }
}

if( get_option('my_random_post') ) { // is there a option with my id?
  //yes, it shoukd be used in my query
  $args = array( 'p' => get_option('my_random_post') ); 
} else {

   //no, query a new one
  $args = array(
    'post_type' => 'post',
    'posts_per_page' => 1,
    'limit' => 1,
    'orderby' => 'Rand',
    'meta_key'     => 'already_shown_in_random',
    'meta_compare' => 'NOT EXISTS' //only query posts that don't have a the 'already_shown_in_random' meta
  );
}

// the query
$random_post = new WP_Query($args);
if( $random_post->have_posts() ):
  while( $random_post->have_posts() ): $random_post->the_post();

    if( !get_option('my_random_post') ) { //if not already populated, store my id and the current timestamp in the options
      add_option('my_random_post', get_the_id() );
      add_option('my_random_post_timestamp', time() );

      add_post_meta( get_the_id() , 'already_shown_in_random', 'yes'); //add a post meta so that this post isnt queried a second time
    }

    /* DO YOUR STUFF HERE!!!!! */


  endwhile;
  wp_reset_postdata();
endif;

それは Rarst が以前の答えで持っていたことを行います...

1
Adrian Lambertz