显示带有随机缩略图的标签,从带有该标签的帖子中选择

时间:2018-10-26 作者:human1fy

我想要实现的目标包括两部分:

首先是一组显示每个标记(带有名称、描述和链接)的容器。这可以通过get\\u标记和foreach循环轻松实现。

<?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>\';
} 
?>
现在最困难的部分是:

我想在每个标记容器中显示(查询)一个图像,以说明标记,并具有以下条件(参数):

for each tag:

  • 从当前标签的所有贴子中选择图像(post\\u缩略图)。

    所以每次刷新都会显示不同的图片。

  • 只显示一个(posts\\u per\\u page=1)
    • 我能想到的唯一方法是抓取所有标记,将它们放在foreach循环中,并在每个实例中使用这些参数运行单独的wp\\u查询。

      然而,对于7-8个标记,这段代码将在一个页面上运行过多的查询。据我所知,(并经过测试),这在性能方面是非常低效的。

      TLDR:以下代码可以工作,但运行所有这些单独的查询会导致性能下降。我需要帮忙。

      <?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 个回复
最合适的回答,由SO网友:djboris 整理而成

我正在考虑利用wp_crontransients.

您可以创建一个助手函数,该函数将完成繁重的工作并执行所有需要的查询,但可以使用wp_cron API。

基本上,这就是您需要的:

Helper function and WP cron job

/**
 * 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\' );
}

Your code, adjusted

$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>\';
}

结束