団地デバッグ

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

【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

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


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

【WordPress】shortcode_attsとextract

WordPressさわってます。

分からないところをグーグルすると「〇〇の書き方」とか「〇〇を説明します」とかよく出てくるんだけど、大体が「こう書いたらこうなります!」みたいなテンプレート紹介して終わり。内容コピペしたんか…ってぐらい大体同じ。「なぜ」の部分がないんだよなぁ。。とりあえず使ってみる分はいいんだろうけど。

そんなわけで自作ショートコードの「なぜ」を調べました。

テンプレート

大体こんな風に書け!っていわれるやつ。

shortcode_sample

function shortcode_sample($atts)
{
    extract(shortcode_atts(
    array( 'fruit' => 'りんご',
           'sweets' => 'ケーキ'), $atts));
    
    return "好きな果物は${fruit}で、好きなスイーツは${sweets}です";
}
add_shortcode('sample', 'shortcode_sample');

インデント難しい。
でも、はてな記法って便利だなー

ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ

分からない部分

  • shortcode_attsとは何をする関数なのか?
  • extractとは何をする関数なのか?

関数を関数でくくってて複雑じゃん…
ということで分割して考えます。

shortcode_atts

◆参考文献
関数リファレンス/shortcode atts - WordPress Codex 日本語版
shortcode_atts:WordPress私的マニュアル

つまり

shortcode_atts(
    使用したいキーとデフォルト値の宣言[],
    ショートコードに渡されたキーと値[],
    フィルター用の文字列
);

返り値は『無効なキーを除外したキーと値の連想配列
ということですね。

shortcode_sampleは"fruit"と"sweets"に値が渡されること前提で実装されてます。ショートコードで呼び出すと、

[sample fruit="みかん" sweets="クッキー"]

こんな感じで

好きな果物はみかんで、好きなスイーツはクッキーです

という結果になる。
んだけど、例えば関数の仕様を勘違いしていて

[sample cake="ショートケーキ" drink="紅茶"]

こんな風に想定外のパラメータを渡してしまった(つまり想定したキーと値が渡されなかった)とき

好きな果物はで、好きなスイーツはです

という悲しい結果に…。
それを解決するのがそう、『shortcode_atts』!

ショートコードから想定するキー(fruitとsweets)の値が渡されればそれらを使って、渡されなかった場合はデフォルト値を使用。さらに想定外のキー(cakeとかdrink)はまるっと無視して連想配列を作成してくれる関数、ということなのですね~、理解。

extract

◆参考文献
連想配列に含まれるキー毎に変数を作成(extract) - 配列関数 - PHP関数

phpのマニュアルも見たんだけど、"配列からシンボルテーブルに変数をインポートする"って、なにそのルー語!

この関数は超シンプル。

    extract(shortcode_atts(
    array( 'fruit' => 'りんご',
           'sweets' => 'ケーキ'), $atts));

↑の場合。
shortcode_atts()の時点では、

連想配列['fruit'] = 'りんご'
連想配列['sweets'] = 'ケーキ'

になっていて、それをextractすると

$fruit = 'りんご'
$sweets = 'ケーキ'

と、連想配列のキーの部分を変数として扱えるようにしてくれるってわけですね~~。

学び

ショートコードからの入力値をどうこうするならshortcode_atts()だけでいいわけじゃん!

WordPressたのしいなー。