【WordPress】タグクラウドをカスタマイズしよう

タグクラウドの表示順の変更機能をテーマが持っていない場合、表示順を変更する方法として「functions.php」へのコード追加を行うというものがあります。

ちょっと調べるとコードは出てきたのですが、試した結果いまいち上手く動きませんでした。
なのでいろいろとこねて動くようにした結果を備忘録的に残しておきます。

表示順を変更するコード

元コード

元にしたコードは以下になります。
(引用元:https://codemy-lesson.office-ing.net/archives/749

// タグクラウド実行関数に与えるパラメータを変更
function custom_widget_tag_cloud_args($args) {
	$myargs = array(
		'orderby' => 'count',  // タグ名ではなく記事件数をソートキーとする
		'order' => 'DESC',     // ソート値が大きい順(記事件数が多い順)にソートする
	);
	$args = wp_parse_args($args, $myargs);
	return $args;
}
add_filter('widget_tag_cloud_args', 'custom_widget_tag_cloud_args');
Code language: PHP (php)

このコードは私の環境ではうまく動いてくれませんでした。

新コード

色々試した結果、私の環境ではより後段の部分で並び替えの変更が破棄されてしまっていました。
そのため元コードよりも後ろの関数にフィルターを噛ませています。

//タグクラウドの並び順を使用頻度順に
function custom_tag_cloud_sort_by_count($tags_data) {
    usort($tags_data, function($a, $b) {
        return $b['real_count'] - $a['real_count'];
    });
    return $tags_data;
}
add_filter('wp_generate_tag_cloud_data', 'custom_tag_cloud_sort_by_count', 20);
Code language: PHP (php)

優先度をつけているのは同じところで、別のフィルタを噛ませているからです。
その内容についても後でご紹介します。

上記のコードでは使用頻度が高い順(記事数順、降順)にしていますが、他の並び順にすることも可能です。「usort」の部分を希望する並び順のものに置き換えてください。

// 使用数順(少ない順)
    usort($tags_data, function($a, $b) {
        return $a['real_count'] - $b['real_count'];
    });

// 名前順(あいうえお順 / A-Z)
    usort($tags_data, function($a, $b) {
        return $a['name'] - $b['name'];
    });

// スラッグ順
    usort($tags_data, function($a, $b) {
        return $a['slug'] - $b['slug'];
    });

// ID順(古い順)
    usort($tags_data, function($a, $b) {
        return $a['id'] - $b['id'];
    });

// ランダム
    shuffle($tags_data);
Code language: PHP (php)

昇順・降順を変更するには「usort」部分の中の「$a」と「$b」を入れ替えましょう。
名前順を例にして記載します。

//昇順
    usort($tags_data, function($a, $b) {
        return $a['name'] - $b['name'];
    });

//降順
    usort($tags_data, function($a, $b) {
        return $b['name'] - $a['name'];
    });
Code language: PHP (php)

使用数が少ないものを非表示にするコード

私は上記の使用数が多い順の並び替えに加えて、使用頻度が少ない(複数の記事に使われていない)タグを非表示にしています。

//指定数以下のタグを非表示
function custom_tag_cloud_filter_by_count($tags_data) {
    $min_count = 1; //これ以下の使用頻度のタグを非表示
    return array_filter($tags_data, function($tag) use ($min_count) {
        return $tag['real_count'] > $min_count;
    });
}
add_filter('wp_generate_tag_cloud_data', 'custom_tag_cloud_filter_by_count', 10);
Code language: PHP (php)

参考