web-dev-qa-db-ja.com

ランダム投稿、1日1回

私はカスタムの投稿タイプを「引用」とし、毎日ホームページにランダムなエントリを表示したいと思います。

これは私が現在コンテンツを表示しなければならないコードです:

            <?php query_posts( 'post_type=quote&orderby=Rand&showposts=1' ); ?>
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
            <?php if ( has_post_thumbnail() ) {
                the_post_thumbnail( 'thumbnail-quote' );
                } else { ?>
                <img src="<?php bloginfo('template_directory'); ?>/img/thumb1.jpg" alt="x" class="quote_person" />
                <?php } ?>
        <div class="quote_container">
            <span class="quote_intro hstack">Quote of the day:</span><a class="quote_Tweet hstack" href="#">Tweet this quote <i class="fa fa-Twitter"></i></a>
            <div class="quote_message white gstack"><?php the_field('quote'); ?></div>
            <div class="quote_source white hstack"><?php the_field('attribution'); ?></div>
        </div>
        <?php endwhile; endif; ?>

編集:

役に立つ提案に従って、私は今、以下のようなものを持っています。

            <?php 

        if ( false === ( $quotes = get_transient( 'random_quote' ) ) ) {
          // It wasn't there, so regenerate the data and save the transient

          $args = array(
             'post_type' => 'quote',
             'orderby'   => 'Rand',
             'posts_per_page' => '1'
          );

          $quotes = get_posts( $args );

          //Now we store the array for one day.
          //Just change the last parameter for another timespan in seconds.
          $seconds_until_next_day = strtotime('tomorrow') - time();
          set_transient( 'random_quote', $quotes, $seconds_until_next_day );
        }

        foreach ( $quotes as $post ) : setup_postdata( $post );
        if ( have_posts()) : while (have_posts()) : the_post();

            if ( has_post_thumbnail() ) {
            the_post_thumbnail( 'thumbnail-quote' );
            } else { '<img src="' . bloginfo('template_directory') .'/img/thumb1.jpg" alt="University of Lincoln" class="quote_person" />'
            echo '<div class="quote_container">
                <span class="quote_intro hstack">Quote of the day:</span><a class="quote_Tweet hstack" href="#">Tweet this quote <i class="fa fa-Twitter"></i></a>
                <div class="quote_message white gstack" id="thequote">' . the_field('quote') . '</div>
                <div class="quote_source white hstack">' . the_field('attribution') . '</div>
            </div>
            '; }

        endforeach; 
        wp_reset_postdata();


        ?>

Foreach文がきちんと正しいかどうかはよくわかりません。

4
cubechris

まず第一にあなたは本当にquery_posts()を使うべきではありません。 このすばらしい説明をなぜ読んでください。

そしてこれは トランジェント の完璧なユースケースです。

あなたは一度だけ投稿を得て、それからトランジェントAPIを使って24時間それをキャッシュします。

if ( false === ( $quotes = get_transient( 'random_quote' ) ) ) {
  // It wasn't there, so regenerate the data and save the transient

  $args = array(
     'post_type' => 'quote',
     'orderby'   => 'Rand',
     'posts_per_page' => '1'
  );

  $quotes = get_posts( $args );

  //Now we store the array for one day.
  //Just change the last parameter for another timespan in seconds.
  set_transient( 'random_quote', $quotes, DAY_IN_SECONDS );
}

最後のリクエストから24時間ではなく、カレンダーの日数にバインドすることを目標としている場合は、最後の行を次の行に置き換えます。 ( 小道具 to - カオス

$seconds_until_next_day = strtotime('tomorrow') - time();
set_transient( 'random_quote', $quotes, $seconds_until_next_day );

データを取得したら、必要に応じてそれを表示できます。

foreach ( $quotes as $post ) : setup_postdata( $post );

  [...]
  the_title();
  [...]

endforeach; 
wp_reset_postdata();

その他の例についてはこのリンクを参照してください。

編集:

これはあなたの特定の状況でトリックをするはずです:

foreach ( $quotes as $post ) : setup_postdata( $post );

    if ( has_post_thumbnail() ) {
                the_post_thumbnail( 'thumbnail-quote' );
    } else { ?>
            <img src="<?php echo get_stylesheet_directory_uri (); ?>/img/thumb1.jpg" alt="x" class="quote_person" />
    <?php } ?>
    <div class="quote_container">
        <span class="quote_intro hstack">Quote of the day:</span><a class="quote_Tweet hstack" href="#">Tweet this quote <i class="fa fa-Twitter"></i></a>
        <div class="quote_message white gstack"><?php the_field('quote'); ?></div>
        <div class="quote_source white hstack"><?php the_field('attribution'); ?></div>
    </div>

<?php endforeach; 
wp_reset_postdata();
10
kraftner