LoginSignup
0
0

More than 3 years have passed since last update.

WordPressのタグ一覧画面に表示されないタグがあった場合への対応

Posted at

背景

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')の部分はタグ名によって変わります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0