WordPressのテーマ「COCOON」では複数カテゴリ設定時に優先して表示するカテゴリを指定する機能があります。最近表示が意図していないものになっているものに気付きましたが、過去記事のチェックを容易にする方法を考えました。
目次
メインカテゴリーは「ページ設定」
COCOON愛用者の方、このような事象に陥ったことはないですか?
例えばこの記事。カテゴリとしては「ヨーロッパ」が表示されています。ですが、私が表示したいのは
この階層の一番下にある「海外>ヨーロッパ>北欧ドイツ(2019.07) 」なんです。これを改善するには
「ページ設定」にあるメインカテゴリーの中から、該当する「北欧ドイツ(2019.07)」を選んであげれば解決します。
こんな具合に意図したカテゴリーが表示されるようになります。
解決方法はわかっているのですが、問題はそこではありません。ある程度記事を発行して、後々気付いた場合に、「どこまで過去に 遡って チェックしたらいいか調べるのが面倒 」と言うことです。
まあ、現時点において私の記事は200そこそこなので、全部チェックすることも可能です。ただ面倒くさい。大事なことなのでもう一度言いますが、面倒くさい。
今回ある程度これらをざっくり調べる方法を考えましたので紹介したいと思います。
複数カテゴリ設定時の優先順位
以降よりWordPressの構造について触れますが、テーブル名は WordPress/データベース構造 を参考にしています。
そもそも「複数カテゴリ」については言葉ではわかりにくいですが、前述の
であれば、「海外」「ヨーロッパ」「北欧ドイツ(2019.07)」の3つがこの記事のカテゴリと言えます。
WordPressにおいて複数カテゴリを設定した場合、それはその階層構造を含めてですが、どうも「名前」の最小値が優先 されるようです。
また、具体的には下記の関数によってそのカテゴリを呼び出しているようです。
そしてこの時の最優先順位が、”テーブル: wp_terms”の”フィールド:name”の最小値を取得しているようです。ここで言う最小値とはSQLのMIN関数を表しており、その取得には設定上の照合順序が影響しているように思います。
色々調べた結果、各解説サイトによっては「term_idだ」、「slugだ」、「nameだ」と色々ありますが、検証してみた結果nameが一番マッチしそう。
SQLで一括チェック(サンプルあり)
これらを一括チェックするにはSQLを書いて一覧を作ってしまうのが手早いと思います。
WordPressで書いた記事はその構造上、用意しているデータベースに格納されます。データベースも色々ありますが、WordPressにおいては、MySQLとMarinaDBが推奨されており、当ブログではMySQLを利用しています。以降MySQLを前提として記載します。
SQL文を実行する環境としてはXserverであれば、WEB画面から直接操作できるphpMyAdminが用意されています。レンタルサーバによってまちまちですので、それぞれ実行できる環境をご用意ください。
実行するSQL文サンプルは下記の通りです。
SELECT DISTINCT
MT01.object_id AS Post_ID
,ST03.post_title AS Post_Title
,MIN(ST01.name) AS Default_Cat
,ST02.name AS Main_Cat
FROM
wp_term_relationships MT01
-- Get category name of Default_Cat
LEFT JOIN(
SELECT
ST11.term_taxonomy_id
,ST11.term_id
,ST11.parent
,ST21.name
,ST21.slug
FROM
wp_term_taxonomy ST11
LEFT JOIN wp_terms ST21 on ST11.term_id = ST21.term_id
WHERE
ST11.taxonomy = "category"
) ST01 ON MT01.term_taxonomy_id = ST01.term_taxonomy_id
-- Get category name of Main_Cat
LEFT JOIN(
SELECT
ST12.post_id
,ST12.meta_value AS term_id
,ST22.name
FROM
wp_postmeta ST12
LEFT JOIN wp_terms ST22 on ST12.meta_value = ST22.term_id
WHERE
ST12.meta_key = "the_page_main_category"
) ST02 ON MT01.object_id = ST02.post_id
-- For search conditions
LEFT JOIN wp_posts ST03 on MT01.object_id = ST03.ID
WHERE
ST03.post_status = "publish"
AND ST03.post_type = "post"
GROUP BY MT01.object_id
ORDER BY MT01.object_id DESC
最終的に表示される3つの項目を簡単に説明します。
・Post_ID:記事のID
・Default_Cat:優先されるカテゴリ
・Main_Cat:「ページ設定」で指定した最優先するカテゴリ
Default_Catが優先され、Main_Catが設定されている場合はそちらが最優先されます。よってDefault_Catが意図していないものかつMain_Catが設定されていないものをチェックしていけばよい です。
この一覧を例として抜粋すると、下記のようになります。
この中で私の目に着いたのは、”Default_Cat:ヨーロッパ”となっている記事です。例えばPost_ID:4772の記事を確認すると下記の通り。
この記事はコペンハーゲンからハンブルグまで旅行した記事で、カテゴリとしては「ヨーロッパ」も正しいのですが、その下に「北欧ドイツ(2019.07)」も設定しています。
ご覧の通り。
「ヨーロッパ」は広すぎるので希望としては「北欧ドイツ(2019.07)」を表示したいです(と言うか、それが表示されていると勝手に思っていた…)。
このように前述のリストを見ると、Defalt_Cat、Main_Catで何が最優先表示されているのか明確なので、どの記事をチェックすればいいか一目瞭然ですね!
ちなみにID:4720の記事は事前に「ページ設定」で希望の 「北欧ドイツ(2019.07)」 を設定していたので、そちらが最優先で表示されています。
まとめ
SQLでデータ抽出することでどれをチェックしないといけないのかわかりやすくなりました。シンプルな一覧で確認し、その中から気になるものだけチェックしていくだけ なので少し楽になります。
全てチェックしたわけではないですが、その中では抽出間違いは無さそうでした。あくまで表記上の問題なので漏れていても特に影響はないと思いますが…。ちなみに「メインカテゴリー」の設定は、パーマリンクにcategoryを含めた場合のURLにおける優先順位とは関係がないことも補足しておきます(参考記事参照のこと)。
SQL文は勉強がてら作成してみましたが、中々WordPressのカテゴリ取得の仕組みが面倒で苦労しました。語弊がありますが、記事からカテゴリを直接取得しているのではなく、間に1テーブルあります。”テーブル:wp_term_taxonomy”の”フィールド:taxonomy”が”category”なものの中の”term_id”と関連付けられた”テーブル:wp_terms”の”name”から取得していると思われます。
また「メインカテゴリー」の仕組みはCOCOON独自の仕様ですが、こちらはtaxonomyがcategoryのterm_idを直接指定していること前提にしました( “テーブル:wp_term_taxonomy”は直接関係ない前提)。
同じテーマを利用していても運用者によって環境は様々ですが、もし参考になるようでしたら幸いです。
(間違いがあれば指摘いただけると嬉しいです。)
参考記事
https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0#.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB:_wp_terms
Cocoon
パーマリンクに対してメインカテゴリの反映
お世話になっております。 いつもCocoonを利用させていただいております。tkと申します。 不具合というか、要望かもしれませんが、パーマリンク設定で %category%/%postnam...
Cocoon
投稿のメインカテゴリーを選択する方法。意図したカテゴリーをラベルに表示する設定。
カテゴリーの複数選択をしたとき、意図通りのカテゴリーをアイキャッチラベルやパンくずリストに表示する方法です。
コメント