基本的な表示は特に問題なかったのですが、一部パーツへの対応などが思ったよりも大変だったので少しメモ的に。
前提
- WordPressでCocoonで子テーマを使用
- カスタム投稿タイプを設定しカテゴリーを使う
- 専用のカスタムタクソノミーを設定
上記で以下の問題が発生。
- パンくずリストが表示されない
- カスタム投稿タイプとタクソノミーのアーカイブのタイトル左にアイコンが表示されない
Cocoonの詳細は公式含めて検索で色々でてくるので当記事では説明を省きます。
問題と対応
以下対応策ですが、メモ程度なのでコードは一部省いています。
パンくずリストが表示されない
カスタム投稿タイプやカスタムタクソノミーを設定すれば、それぞれのページ自体は何もせずとも表示されます。テンプレートの優先順位に従ってテーマ内に存在するテンプレートが使われるためです。
しかし、この状態ではパンくずが表示されません。表示させるには概ね以下の手順が必要でした。
- 親テーマ(cocoon-master)からfooter.phpとtmp/body-top.phpとtmp/breadcrumbs.phpを子テーマにコピー(親の構造に合わせてtmpディレクトリを作成して中に入れる)
- 各ファイルの表示を操作するif文内にis_tax('カスタムタクソノミー名')とis_post_type_archive('カスタム投稿タイプ名')を追加する
- breadcrumbs.php内のget_category()やget_the_category()の部分に分岐を追加して、カスタム投稿タイプやカスタム投稿タイプでも値が取れるように書き換える
具体的には概ね以下のような対応関係で、そのままでは値が取れない箇所で値が取れるようにコードを追加します。
// 冒頭で表示中のページについているカテゴリを取得する部分
$cats = get_the_category();
↓
$cats = get_the_terms($post->ID,'カスタムタクソノミー名')
// 「メインカテゴリがない場合は先頭のカテゴリを適用」の部分
$cat = (is_single() && isset($cats[0])) ? $cats[0] : get_category(get_query_var("cat"));
↓
$cat = (is_single() && isset($cats[0])) ? $cats[0] : get_queried_object();
// パンくず出力箇所冒頭のhomeを出力するところで、表示中のページの親をカテゴリをいれる変数$parの部分
$par = get_category($cat->parent);
↓
$par = get_term($cat->parent);
//「カテゴリ情報の取得」の部分で、取得した表示中のページについているカテゴリを配列入れる部分
$par = get_category($par->parent);
↓
$par = get_term($par->parent);
加えてhomeの次にカスタム投稿タイプのアーカイブのページを設定する必要がありますが、ここはほとんど直書きか、動的にカスタム投稿やタクソノミーの名前を入れるように作成することになります。
アーカイブのタイトル左にアイコンがつかない
通常のアーカイブのタイトルなら左にアイコンが表示されますが、カスタム投稿タイプとカスタムタクソノミーのアーカイブでは表示されません。
表示させるにはlist-title.php内の分岐に、カスタム投稿タイプとカスタムタクソノミーでも動くような分岐を追加します。
カスタムタクソノミーの「タグタイトル」「タグ本文」が動作しない
上記で解決できているように書かれているうえに、検索しても同種の問題が出てこなかったので私の設定ミスの可能性が高いのですが、以下のような問題がおきました。
- カスタム投稿タイプで専用のカスタムタクソノミーを追加した状態
- 追加したカスタムタクソノミーの編集画面で「タグタイトル」「タグ本文」などを入力しても反映されない
- 「タグ本文」に関しては、上部にある「説明」蘭の入力内容が表示されてしまう
調べたところ、lib/content-tag.phpの256行目付近の以下の記述に問題があるようでした。
if (isset($_POST['taxonomy']) && ($_POST['taxonomy'] === 'post_tag')) {
カスタム投稿タイプの場合、$_POST['taxonomy']の値はpost_tagではなく、設定したカスタム投稿タイプのスラッグになるため、上記の判定では偽となり保存用関数が実行されません。
変更するなら以下のようにすれば実行は可能です。
if (isset($_POST['taxonomy']) && ($_POST['taxonomy'] === 'post_tag' || $_POST['taxonomy'] === '設定したカスタムタクソノミーのスラッグ')) {
または、save_extra_tag_fileds()を複製してリネームし、目的のカスタムタクソノミーの時にだけ動作する関数を作成する方法も考えられます。
ただし、最初の案は親テーマのアップデートで消えるので論外ですし、2つ目の案も今後のアップデートで何らかの対応がなされた場合に2重で実行されそうなので、採用しにくい案だと思われます。
別方向の対応策
「タグの本文」などの機能は一切使わないことにして、以下のようなコードを子テーマに追加して対応しました。
- 専用の固定ページを作成し、カテゴリーページ上部にそのページのコンテンツを出力させる
この方法は、元々カスタム投稿タイプのアーカイブページ上部にコンテンツを追加するために作ったのですが、それを汎用的に使えるように修正して用いた次第です。
非推奨のエラー
Deprecated: edit_tag_form_fields の使用はバージョン 3.0.0 から非推奨になっています ! 代わりに {$taxonomy}_edit_form_fields を使ってください。 in /wp-includes/functions.php on line 5586
デバッグモードがtrueの場合、カスタムタクソノミーとタグの編集画面で上記のようなエラーがでます。
互換性のためにこの状態なのか判断がつきませんが、WP5.8でも動作自体はしているのと親テーマが作業対象である点を考えると、とりあえず無視していても良いかなと思います。
結び
値の取り方と利用の仕方、分岐の作り方が頭に入っていればそれほど困難ではないと思いますが、今回はそうではなかったので作業は想定よりも大変でした。
補足
Cocoonに関わらないカスタム投稿タイプとカスタムタクソノミーに関する多少の情報は以下の記事に記載しています。
3人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。