wake-up-neo.net

Tags mit zufälliger Miniaturansicht aus der Auswahl von Posts mit diesem Tag anzeigen

Was ich erreichen möchte, besteht aus zwei Teilen:

Zuerst eine Reihe von Containern, die jedes Tag anzeigen (mit Name, Beschreibung und Link). Dies kann leicht mit einer get_tags- und foreach-Schleife erreicht werden.

<?php
$tags = get_tags( $args );

foreach ( $tags as $tag ) {
    // get tag link
    $tag_link = get_tag_link( $tag->term_id );
    // display content
    echo '<div id="tag-block">'
       . $tag->name
       . $tag->description
       . '<a href="'.$tag_link.'">see tag archive</a>'
       . '</div>';
} 
?>

Nun der schwierige Teil:

Ich möchte ein Bild in jedem Tag-Container anzeigen (abfragen), um das Tag mit den folgenden Bedingungen (Argumenten) zu veranschaulichen:

für jedes Tag:

  • eine Auswahl von Bildern (post_thumbnail) wird aus allen Posts des aktuellen Tags abgerufen.

  • order => 'Rand', damit bei jeder Aktualisierung ein anderes Bild angezeigt wird.

  • es wird nur einer angezeigt (posts_per_page = 1)

Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, alle Tags zu erfassen, sie in eine foreach-Schleife zu setzen und in jeder Instanz eine separate wp_query mit diesen Argumenten auszuführen.

Bei 7-8 Tags führt dieser Code jedoch zu viele Abfragen auf einer Seite aus. Soweit ich weiß (und getestet), ist dies in Bezug auf die Leistung schrecklich ineffizient.

TLDR: Der folgende Code funktioniert, aber das Ausführen all dieser separaten Abfragen ist eine schlechte Leistung. Ich könnte hier eine Hand gebrauchen.

<?php
$tags = get_tags( $args );

foreach ( $tags as $tag ) {
    // get tag link
    $tag_link = get_tag_link( $tag->term_id );

    // get random image for this tag
    $args = array(
    'post_type' => 'custom_event',
    'order' => 'Rand',
    'tag__in' => array ($tag->term_id),
    'posts_per_page' => 1,
    );

    $query = new WP_query ( $args );

    // hmmm this is probably bad
    while ( $query->have_posts() ) { $query->the_post();

      the_post_thumbnail( $post->id );

    } wp_reset_postdata();

    // display rest of content
    echo '<div id="tag-block">'
       . $tag->name
       . $tag->description
       . '<a href="'.$tag_link.'">see tag archive</a>'
       . '</div>';
} 
?>
1
human1fy

Ich denke darüber nach, den wp_cron und die transients zu nutzen.

Sie können mithilfe der wp_cron API eine Hilfsfunktion erstellen, die das Heben von Lasten und alle erforderlichen Abfragen erledigt. Planen Sie sie jedoch so, dass sie alle 12 Stunden ausgeführt wird - zweimal täglich (oder mehr, abhängig von der Häufigkeit neuer Posts).

Grundsätzlich ist das, was Sie brauchen:

Hilfsfunktion und WP Cronjob

/**
 * Helper function to update tag transients with post IDs
 */
function wpse317707_update_tag_transients() {
    $tags = get_tags(); // add args

    /** @var WP_Term $tag */
    foreach ( $tags as $tag ) {

        // get random image for this tag
        $args = array(
            'post_type' => 'custom_event',
            'tag__in' => array ( $tag->term_id ),
            'posts_per_page' => -1,
        );

        $query = new WP_query ( $args );
        $post_ids = wp_list_pluck( $query->posts, 'ID' );

        set_transient( $tag->slug . '-tag-posts', $post_ids, DAY_IN_SECONDS );
    }
}

add_action( 'update_tag_transients', 'wpse317707_update_tag_transients' );

/**
 * Schedule WP Cron job
 */
if ( ! wp_next_scheduled( 'update_tag_transients' ) ) {
    wp_schedule_event( time(), 'twicedaily', 'update_tag_transients' );
}

Dein Code angepasst

$tags = get_tags( $args );

foreach ( $tags as $tag ) {
    // get tag link
    $tag_link = get_tag_link( $tag->term_id );

    // get post IDs
    $post_ids = get_transient( $tag->slug . '-tag-posts' );

    // get random ID
    $random_id = $post_ids[ array_Rand( $post_ids, 1 ) ];

    the_post_thumbnail( $random_id );

    // display content
    echo '<div id="tag-block">'
         . $tag->name
         . $tag->description
         . '<a href="'.$tag_link.'">see tag archive</a>'
         . '</div>';
}
0
dboris