「WP-PostViews」プラグインでタグを人気順（閲覧数順）に表示する方法

WordPressって情報が豊富にあって便利な分、情報が無いときにしんどい思いをすることもあります。
最近開発したWebメディアで、タグを人気順に並べる要望がありました。（以下のようなやつ。）
<img width="350" alt="タグ一覧.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513719/1a701d01-ae84-7dbc-4b61-1f6c14591998.png">

閲覧数なら「WP-PostViews」と思って使ったは良いものの、そこから情報が少なかったので自分で集計しました。
<img width="400" alt="WP-PostViews.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513719/ef4cb36c-0f60-d6e6-fe79-92b7d3e3851c.png">

誰か同じことで困っている人のためになればと思い、**「WP-PostViews」プラグインでタグを人気順（閲覧数順）に表示する方法**をまとめます。
<br>
##結論
まず結論から。
WordPressで「WP-PostViews」プラグインを有効化し、以下のコードでタグを人気順に並べて表示することが可能です。
（ここでは紹介のためにHTMLと混合して書いていますが、実際はそれぞれの環境に合わせてfunction.phpにまとめてメソッド化するべきでしょう。）

```php
<div class="tags_wrap">
    <?php
    $tags = array();

    $posts = get_posts(array(
            'post_type' => 'post',
            'post_status' => 'publish',
            'meta_key' => 'views',
            'posts_per_page' => -1
            ));

    foreach($posts as $post) {
    $posttags = get_the_tags();
        if ( $posttags ){
            foreach ( $posttags as $tag ) {
                $tag_name = $tag->name;
                $view_count = (int) get_post_meta($post->ID, 'views', true);

                if ( $tags["$tag_name"] ) {
                    $tags["$tag_name"] += $view_count ; 
                } else {
                    $tags += array( $tag_name => $view_count);
                }
            }
        }
    }
    arsort($tags);
    ?>
    <?php
    foreach ( $tags as $key => $value  ) :
        $tag = get_term_by('name', $key, 'post_tag');
    ?>
        <a class="tags_link" href="<?php echo get_tag_link($tag->term_id); ?>">#<?php echo $tag->name; ?></a>
    <?php endforeach;?>
</div>
```
<br>
##コードの解説
今回のコードでは```$tags```という変数に```'タグ名'=>ビュー数```という形で連想配列を作っています。
下記のようなイメージでビュー数の大きい順に並べ、順番に値を取り出していけば人気順にタグが表示できるというわけです。
`$tags = array('tag_name1'=>1000, 'tag_name2'=>500, 'tag_name3'=>100);`
　
作成は以下の順序で行っています。
<a href="#i-1">①連想配列を作る準備</a>
<a href="#i-2">②連想配列の作成</a>
<a href="#i-3">③データの出力</a>

それでは順番に解説していきます。  
（連想配列についてあまり分からない場合は、[【参考記事】[PHP] 配列・連想配列の初期化、結合、追加](https://qiita.com/shuntaro_tamura/items/784cfd61f355516dfff0)を事前に読んでください。）

###<h3 id="i-1">①連想配列の作成準備</h3>

```php
// $tagsとして空の配列を定義
$tags = array(); 

// $postsとして全投稿データを取得
$posts = get_posts(array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'meta_key' => 'views', //（WP-PostViewsの閲覧数データを取得）
        'posts_per_page' => -1
        ));
```
まず、連想配列の準備として、空の配列を定義しておきます。
この時投稿データも合わせて取得します。
今回は全投稿データを取得していますが、必要に応じて条件はカスタマイズしてください。

###<h3 id="i-2">②連想配列の作成</h3>
```php
    foreach($posts as $post) {
    $posttags = get_the_tags();
        if ( $posttags ){
            foreach ( $posttags as $tag ) {
                // タグ名を$tag_nameと定義
                $tag_name = $tag->name; 
                // ビュー数を$view_countと定義
                $view_count = (int) get_post_meta($post->ID, 'views', true);

                if ( $tags["$tag_name"] ) {
                    // $tag_nameが連想配列内に存在する場合、$view_countを足し合わせる
                    $tags["$tag_name"] += $view_count ; 
                } else {
                    // 連想配列にarray( $tag_name => $view_count)を入れる
                    $tags += array( $tag_name => $view_count); 
                }
            }
        }
    }
    // ビュー数順に並べる
    arsort($tags);
```
①で取得した```$posts```に対して、```$posttags```としてタグをそれぞれ定義します。
以降は各タグを個別に処理し、```array( $tag_name => $view_count)```として配列を成形。
成形できたら```$tags```に値を入れていくという流れです。

ここで気をつけるのは、**「連想配列内に同じ名前のタグは入れられない」**ということです。
つまり、```array('tag_name1'=>1000, 'tag_name1'=>500, 'tag_name2'=>100)```という配列は作れません。
従って、```array('tag_name1'=>1500, 'tag_name2'=>100)```というように足し合わせていかないと、各タグのビュー数が集計できなくなるので注意してください。

###<h3 id="i-3">③データの出力</h3>
```php
    <?php
    foreach ( $tags as $key => $value  ) :
        $tag = get_term_by('name', $key, 'post_tag');
    ?>
        <a class="tags_link" href="<?php echo get_tag_link($tag->term_id); ?>">#<?php echo $tag->name; ?></a>
    <?php endforeach;?>
```
最後に②で作成した連想配列を出力して完成です。
配列のキーがタグ名となっているので、それを利用して```get_term_by```でタグ情報を取得し直しています。
出力する内容はお好みで調整してください。
<br>
##まとめ
WP-PostViewsは記事の閲覧数ランキングで良く使われるプラグインですが、閲覧数のデータを利用して集計すると様々な応用が可能です。  
今回はタグを人気順に並べて表示しましたが、同じ方法でカテゴリーも集計可能です。  
この記事を参考にして、プラグインの応用の幅を広めてもらえると幸いです。  
最後までお読みいただきありがとうございました！！