wake-up-neo.net

Zufälliger Beitrag, einmal pro Tag

Ich habe einen benutzerdefinierten Beitragstyp "Anführungszeichen" und möchte jeden Tag einen zufälligen Eintrag auf der Startseite anzeigen.

Dies ist der Code, den ich zur Zeit zum Anzeigen des Inhalts brauche:

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

BEARBEITEN:

Nach den hilfreichen Vorschlägen habe ich jetzt etwas, das wie folgt aussieht:

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


        ?>

Ich bin mir nicht ganz sicher, ob ich die foreach-Aussage richtig verstanden habe.

4
cubechris

Zunächst einmal sollten Sie query_posts() wirklich nicht verwenden. Lesen Sie diese hervorragende Erklärung warum.

Dann ist dies ein perfekter Anwendungsfall für Transienten .

Sie erhalten den Beitrag nur einmal und speichern ihn dann mithilfe der Transients-API für 24 Stunden im Cache.

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

Wenn Ihr Ziel darin bestand, es an Kalendertage und nicht 24 Stunden nach der letzten Anforderung zu binden, ersetzen Sie die letzte Zeile durch Folgendes. ( Requisiten zu Chaos )

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

Nachdem Sie die Daten erhalten haben, können Sie sie einfach so anzeigen, wie Sie möchten:

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

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

endforeach; 
wp_reset_postdata();

Siehe diesen Link für weitere Beispiele.

BEARBEITEN:

Dies sollte den Trick in Ihrer speziellen Situation tun:

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