Cocoonでカテゴリを好きな順に並び替えたかった話

PHP

〜functions.php を使う方法と、詰まったポイントまとめ〜

やりたかったこと

WordPress(Cocoon)でブログを運営していると、
こんな要求が出てきます。

  • サイドバーのカテゴリ一覧を
  • 自分の好きな順番で並べたい
  • 特に
    • 「本八幡系のカテゴリを一番上にしたい」
    • その下に他のカテゴリを続けたい

ところが、
WordPress標準のカテゴリウィジェットには「順序(order)」の指定項目がありません。


最初に知っておくべき注意事項(重要)

functions.inc / functions.php を触るのは「自己責任」

今回の対応は
PHPファイルを直接編集します。

  • 1文字ミスでサイトが真っ白になる可能性あり
  • WordPress初心者にはおすすめしない
  • 必ずバックアップを取ってから実施

という前提があります。

👉
「設定画面だけで何とかしたい人」には不向きです。


なぜ functions.inc を直接いじらないのか

Cocoonを使っていると、

/wp-content/themes/cocoon-master/function.inc

というファイルが目に入ります。

しかしここを編集するのは NG

理由

  • Cocoonのアップデートで 必ず上書きされる
  • 変更が消える
  • トラブル時に原因切り分けができなくなる

正解:cocoon_child の functions.php を使う理由

Cocoonでは
子テーマ(Cocoon Child) が用意されています。

編集すべき場所はここ

/wp-content/themes/cocoon-child/functions.php

これを使う理由

  • 親テーマ更新の影響を受けない
  • 不具合が出ても切り戻ししやすい
  • WordPress的に「正しい拡張方法」

👉
functions.inc を直接触らず、子テーマで上書きする
これが鉄則です。


変更内容(結論)

やったこと

  • サイドバーの「カテゴリー」ウィジェットに対して
  • 表示順を PHP で強制的に指定
  • SQLを直接いじらず、安全な方法を採用

実現した仕様

  • 指定したカテゴリID(例:本八幡系)を先頭に固定
  • それ以外のカテゴリは通常順
  • 投稿が0件のカテゴリは表示しない

実際に使ったコード(完成版)

<?php
if ( ! defined( 'ABSPATH' ) ) exit;

add_editor_style();

/**
 * サイドバー「カテゴリー」ウィジェットを完全手動順にする(安全版)
 */

// 上に出したいカテゴリID(この順)
function hon_yawata_priority_ids() {
  return [6, 10, 8, 9];
}

add_filter('widget_categories_args', function ($args) {
  $priority = hon_yawata_priority_ids();
  if (empty($priority)) return $args;

  // 投稿があるカテゴリのみ表示
  $args['hide_empty'] = 1;

  $all_ids = get_terms([
    'taxonomy'   => 'category',
    'hide_empty' => 1,
    'fields'     => 'ids',
  ]);

  if (is_wp_error($all_ids) || empty($all_ids)) {
    return $args;
  }

  // priority → 残りカテゴリ の順
  $ordered = array_values(array_unique(array_merge($priority, $all_ids)));

  $args['include'] = $ordered;
  $args['orderby'] = 'include';
  $args['order']   = 'ASC';

  return $args;
});

途中で悩んだポイントと解決方法

① カテゴリが突然「表示されなくなる」

原因

  • SQLを直接いじる方法を使っていた
  • ORDER BY が壊れて、結果が0件扱いに

解決

  • get_terms_orderby を使うのをやめる
  • orderby=include を使う安全な方法に変更

② 0件のカテゴリが全部表示されてしまう

原因

  • hide_empty = 0 を指定していた

解決

  • hide_empty = 1 に変更
  • 「入口にしたいカテゴリ」だけは priority に含める設計に

③ functions.php が本当に読み込まれているか不安

確認方法

add_action('wp_footer', function(){
  echo '<!-- CHILD_FUNCTIONS_OK -->';
});

HTMLソースにこれが出れば
子テーマの functions.php は確実に動いている


まとめ

  • Cocoonでカテゴリを自由に並び替えるには
    • 設定画面だけでは不可能
    • PHPで制御する必要がある
  • functions.inc を直接触るのは避ける
  • Cocoon Child の functions.php を使う
  • SQLを直接書き換えない方法のほうが安全
  • 最終的に「見た目・運用・安全性」のバランスが取れた

同じことで悩んでいる人へ

「なんで順序がないんだ…」と何時間も悩みましたが、
仕様を理解すれば できること・できないこと が見えてきます。

この方法は

  • 雑誌風トップ
  • 地域ブログ
  • カテゴリに意味を持たせたいサイト

にはかなり有効です。

コメント

タイトルとURLをコピーしました