• HOME
  • Wordpress
  • 【Wordpress】投稿の多いタグ順に並び替える方法

2022/05/09 12:05

【Wordpress】投稿の多いタグ順に並び替える方法

ちょっと原始的ではありますが、WPの投稿に付いてるタグで多く指定されてるものの順番に並べる為のコードです。

そのタグがついてる記事の多い順って事ですね。

投稿した記事数もカッコ内に表示するようになってます。

 

【PHP】

<ul>

  <?php

  $tagArray = array();

  $args = array(

    'post_type' => 'post',

    'showposts' => -1,

    'orderby' => 'count', //投稿数で並び替え

    'order' => 'DESC',

  );

  $my_query = new WP_Query($args);

  if ($my_query->have_posts()) : ?>

    <?php while ($my_query->have_posts()) : $my_query->the_post(); ?>

      <?php $posttags = get_the_tags(); ?>

      <?php foreach ((array)$posttags as $posttag) : ?>

        <?php

        // 全投稿のタグを片っ端から格納していく

        // 多次元配列で追加

        $tagArray[] = array(

          'slug' => $posttag->slug,

          'name' => $posttag->name,

          'count' => 1,

        );

        ?>

      <?php endforeach; ?>

    <?php endwhile; ?>

  <?php endif; wp_reset_postdata(); ?>

 

  <?php

  // 重複を削除し

  // 配列を結合する

  // ループ利用する為に1と2を複製して生成

  $tagArray1 = array_merge(array_unique($tagArray, SORT_REGULAR));

  $tagArray2 = $tagArray;

  $mainCount = 0;

  foreach ((array) $tagArray1 as $key => $value) {

    $subCount = 0;

    $mainValue = $value;

    if (in_array($mainValue['slug'], array_column($tagArray, 'slug'))) {

      foreach ((array) $tagArray2 as $key => $value) {

        // 同じ内容のものがあればカウントを増やす

        if ($value == $mainValue) {

          $subCount++;

        }

      }

      // 記事の数をカウントとして格納

      $tagArray1[$mainCount]['count'] = $subCount;

    }

    $mainCount++;

  }

  $tags = array_unique($tagArray1, SORT_REGULAR);

 

  // ソート

  foreach ((array) $tags as $key => $value) {

    $sort[$key] = $value['count'];

  }

  // 投稿の多い順に並び替え

  array_multisort($sort, SORT_DESC, $tags);

  ?>

 

  <!-- 出力して完了 -->

  <?php foreach ((array)$tags as $value) : ?>

    <li>

      <a href="<?php echo home_url(); ?>/tag/<?php echo $value['slug']; ?>">

        #<?php echo $value['name']; ?>

        <?php echo '(' . $value['count'] . ')';

        ?>

      </a>

    </li>

  <?php endforeach; ?>

</ul>

 

WordPressなのでもうちょっとスマートに書ける方法があるんでしょうけど

やりたかった事がうまく探せなかったので…

 

では現場から以上です!

5114