団地デバッグ

ゲームつくるのがスキです

【WordPress】固定ページにカテゴリを設定できるようにする

引き続きWordPress中。
くどいけど、『こういうことしたい!』と思って検索して上位に出てくるページに『このコードをコピペするだけでできちゃいます!』ってあるとほんとに脱力…。

何がアレかって、記事のタイトルが"〇〇する方法"とか"〇〇できるようにするには"とかいかにも技術紹介ですみたいなタイトルがついてるところ。"コピペでOK!"とかつけてほしいわ。さらにそういうサイトのコメント欄が『うまくいかないんですけどー』で埋まってると地獄ですね。

いいんだけど!!


今回は【固定ページをカテゴリ分けしたい】ので調べてみました。

キーワード

  • register_taxonomy_for_object_type
  • add_action

この2つぽい。

register_taxonomy_for_object_type

◆参考文献
関数リファレンス/register taxonomy for object type - WordPress Codex 日本語版

平たくいうと、投稿タイプに分類を追加する、かな。

register_taxonomy_for_object_type( 追加したい分類のタイプ, 対象の投稿タイプ );

分類のタイプはこちら
投稿のタイプはこちら

固定ページにカテゴリを設定できるようにしたい場合は

register_taxonomy_for_object_type('category', 'page');

こういうわけですねー。

add_action

◆参考文献
WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック
この方のページは、ちゃんと「なんで?」が載ってるのでとても好き!


プラグイン API/アクションフック一覧 - WordPress Codex 日本語版
↑に載っているタイミングで何かしら処理したいときにadd_action()を使う、と。

add_action( フックするアクション名, フックしたときに呼び出す関数名, 呼び出し優先順, 関数に渡す引数の数 );


今回は【固定ページの記事投稿時、カテゴリ設定できるようにしたい】わけです。アクションフック一覧でいうところの"registered_post_type"を使うのかしら…?

ちなみにコピペサイトはこぞって"init"を使ってるんだけど、これだと全ページ呼び出し毎にフックされるっぽいので違う気がするんだよね…。

とりあえず実行あるのみ!ということで以下のようにfunction.phpに記述してみました。

function add_taxonomy_for_pages()
{
    register_taxonomy_for_object_type('category', 'page');
}
// アクションフック
add_action('registered_post_type','add_taxonomy_for_pages');

結果は…

◆アクションフック追加前
f:id:tairams018:20170427185059p:plain:w480

◆追加後
f:id:tairams018:20170427185104p:plain:w480

できたー!
固定ページの記事にカテゴリ設定するんであれば、フックするアクションは"registered_post_type"でいいんじゃん!!

任意のカテゴリの固定ページを取得

固定ページにカテゴリを設定して、そのカテゴリの記事を取得したい場合は

    $cat = get_category_by_slug(カテゴリのスラッグ);

    $args = array( 'category' => $cat->cat_ID,
                   'post_type' => 'page');

    $posts = get_posts($args);

こんな感じでできました!

$cat = get_category_by_slug(カテゴリのスラッグ);

この部分は何かっていうと、

注意: category パラメータではカテゴリー名ではなくカテゴリー ID を指定する必要があります。

ということだったので、

【WordPress】スラッグ名からIDを取得する方法 - Qiita

こちらを参考に、カテゴリのパラメータを取得してきています。


これで、やりたいことはできたぞ!ヤッター