背景
WordPressサイトで固定ページを使ってタグ一覧画面を作成した時、
管理画面側から追加したタグが一覧に表示されない現象が発生しました。
仕様
-
AdvancedCustomField(ACF)で追加したカスタムフィールド(下記の例では
tag_index
がキー)を取得する記事の並びの基準にする -
tag_index
は数値フィールドで昇順に取得する
修正前のコード
page-tags.php
<?php
$args = [
'taxonomy' => 'tags',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_key' => 'tag_index', //ACFのフィールド名
'hide_empty' => true,// 紐づけられている記事があるタグのみ取得
];
$tags_array = get_terms($args);
?>
// タグのループ
<?php if($tags_array): foreach($tags_array as $tag):
$term_link = get_term_link($tag, 'tags');
?>
<div class="tag"><a href="<?php echo esc_url($term_link); ?>"><?php echo $tag->name ;?></a></div>
<?php endforeach; endif; ?>
原因
投稿エディタ画面のサイドバーの「タグを追加」から登録を行なったタグはカスタムフィールドの値が存在しない(slugもタグ名と同じになる)
↓
順序を決定するための値が存在しないので取得するタグの対象に入らない
↓
タグ一覧画面にタグが表示されない
対応
- 投稿エディタ画面の「タグを追加」リンクを無効化(非表示)にする
-
get_terms
で並び替えをせず、自前の処理で行う
修正後のコード
page-tags.php
$args = [
'taxonomy' => 'tags',
'hide_empty' => true,// 紐づけられている記事があるタグのみ取得
];
$tags_array = get_terms($args);
usort( $tags_array, 'tags_order_by_index' );
function.php
/**
* tag_indexの値によって並び替えを行う
* @param $a
* @param $b
*
* @return int
*/
function tags_order_by_index($a, $b) {
// nullのときは0にキャストされる(tag_indexの初期値は0)
$a_index = (int) get_field('tag_index', "tags_{$a->term_id}");
$b_index = (int) get_field('tag_index', "tags_{$b->term_id}");
if ($a_index == $b_index) {
return 0;
}
return ($a_index < $b_index) ? -1 : 1;
}
/**
* エディタ画面から直接タグを追加できないようにする
*/
function hide_tags_adder(){
echo <<<JSCODE
<script type="text/javascript">
window.onload = function(){
var element = document.getElementById('tags-adder');
if(element) {
element.style.display = 'none';
}
}
</script>
JSCODE;
}
add_action('admin_head', 'hide_tags_adder');
document.getElementById('tags-adder')
の部分はタグ名によって変わります。