団地デバッグ

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

【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たのしいなー。