web-dev-qa-db-fra.com

Message aléatoire, une fois par jour

J'ai un type de message personnalisé 'citations' et j'aimerais afficher chaque jour une entrée aléatoire sur la page d'accueil.

C'est le code que je dois actuellement afficher le contenu:

            <?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; ?>

MODIFIER:

Suite aux suggestions utiles, j'ai maintenant quelque chose qui ressemble à ce qui suit:

            <?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();


        ?>

Je ne suis pas tout à fait sûr d'avoir bien compris la déclaration foreach.

4
cubechris

Tout d’abord, vous ne devriez vraiment pas utiliser query_posts(). Lisez cette excellente explication pourquoi.

Il s’agit alors d’un cas d’utilisation idéal pour transitoires .

Vous ne recevez la publication qu'une seule fois, puis vous la mettez en cache pendant 24 heures à l'aide de l'API Transients.

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 );
}

Si votre objectif était de le lier à des jours calendaires et non 24 heures à compter de la dernière demande, remplacez la dernière ligne par la suivante. ( accessoires to chaos )

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

Après avoir obtenu les données, vous pouvez simplement les afficher comme vous le souhaitez:

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

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

endforeach; 
wp_reset_postdata();

Voir ce lien pour plus d'exemples.

EDIT:

Cela devrait faire l'affaire dans votre situation particulière:

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