ショートコードに空の属性を作成する方法はありますか?
例:
function paragraph_shortcode( $atts, $content = null ) {
return '<p class="super-p">' . do_shortcode($content) . '</p>';
}
add_shortcode('paragraph', 'paragraph_shortcode');
ユーザーの種類
[段落]何か[/段落]
そしてそれは示す
<p class="super-p"> something </p>
最初のコードに空の属性機能を追加する方法だからユーザータイプ
[最後の段落]何か[/段落]
それは出力されます:
<p class="super-p last"> something </p>
私は追加を信じる:
extract( shortcode_atts( array(
'last' => '',
), $atts ) );
良いスタートですが、値がないのにユーザーが "last"属性を使用したかどうかを確認する方法はありますか?
これを行うにはいくつかの方法があります。あいにく、私はあなたが何をしようとしているのかということになるとは思わない。 ([paragraph last]
)
属性を必要とせずに$ contentを処理する[paragraph_first]
[paragraph_last]
[paragraph_foobar]
用に別々のショートコードを作成するだけで済みます。
Lastのデフォルト値を''
の代わりにfalse
に設定し、ユーザーに[paragraph last=""]content[/paragraph]
の実行を要求することもできます。
position
のようなもっと意味のある属性を追加することができ、それを[paragraph position="first"]
や[paragraph position="last"]
のように使うことができます。
WordPressがデフォルトを与えられていない属性をすべて破棄するという事実と、="value"
を持たないattにはまったくリストされていないのと同じデフォルト値が与えられるという事実のために、私は[paragraph last]
を達成する方法を見ません
うまくいけば、私の3つの回避策のうちの1つが役に立つことを証明するでしょう。がんばろう!
WordPressはSethMerrickが示唆しているように値のない属性を破棄しませんが、あなたが期待するようには扱いません。あなたの例では、あなたはisset($atts['last'])
をチェックすることができないでしょうが、 "last"は値として名前のない属性に渡されます。この場合、これはTRUEになります:($atts[0] == 'last')
。そのため、「last」の値を持つすべての属性をチェックするためにforeachループを実行できます。
[example attr1="value1" attr2 attr3="value3" attr4]
が解析されると、$atts
パラメーターは次のようになります。
$atts = array (
'attr1' => 'value1',
0 => 'attr2',
'attr3' => 'value3',
1 => 'attr4'
);
あなたはこれをそのように正規化することができ、それからあなたはそれでshortcode_atts
を呼び出すことができます。
if (!function_exists('normalize_empty_atts')) {
function normalize_empty_atts ($atts) {
foreach ($atts as $attribute => $value) {
if (is_int($attribute)) {
$atts[strtolower($value)] = true;
unset($atts[$attribute]);
}
}
return $atts;
}
}
function paragraph_shortcode ($atts, $content = null) {
extract(shortcode_atts(
array (
'last' => ''
),
normalize_empty_atts($atts)
));
return '<p class="super-p'
.($last ? ' last' : '')
.'">'
.do_shortcode($content)
.'</p>';
}
add_shortcode('paragraph', 'paragraph_shortcode');
その他のメモ:
[paragraph last]
は$last = true
になります。 [paragraph last="1"]
は$last = '1'
になります。[paragraph LAST]
は[paragraph last]
と同等です。foreach
ループは、整数インデックスの属性に対して安全です。私はこれが古いことを知っています、しかし私は答えのどれもが完全でコンパクトな答えであると感じませんでした。多くの人があなたの値が存在するかどうかを見つけるためにforeachを通して$atts
配列を実行することを提案しています。現実には、それほど複雑である必要はないと思います。単純化するために代わりにarray_searchを使用できます。
あなたの例の場合、これを使うことができます:
[paragraph last] something [/paragraph]
空の属性が提供されているかどうかを判断するには、基本条件を使用して、キーがnullまたは整数(ゼロを含む)として返されたかどうかを確認します。
// Returns the array key, if empty attribute is found
$last_key = array_search('last', $atts);
// Determine if the key is an integer, zero or greater
// (In the event you're passing multiple empty attributes)
if(is_int($last_key)) {
// Do something, your attribute is set
}
ここで受け入れられた答えは間違っていると正しいです。フレーズ:
「WordPressはデフォルトが指定されていない属性を破棄します」
WPショートコード機能全体ではなく、shortcode_atts
関数のtrueonlyのみです。
以下のコードを見ると:
add_shortcode( 'paragraph', 'custom_shortcode_paragraph' );
function custom_shortcode_paragraph( $atts ) {
// Attribute Defaults Function
$atts = shortcode_atts(
array(
'last' => false,
),
$atts
);
$isLast = $atts['last'] !== false;
}
[paragraph last] something [/paragraph]
などのショートコードの使用法では、$isLast
変数の値は常にfalse
になります。
問題は、shortcode_atts
関数を実行すると、does値なしの属性が破棄されることです。ただし、それらは絶対に$atts
配列beforeにあります。 var_dump
関数の最初の行としての$atts
のcustom_shortcode_paragraph
は、以下を生成します。
array(1) {
[0]=>
string(4) "last"
}
したがって、配列内のth項目は、小文字に強制された属性名の文字列です。
代わりにコードを次のように変更しましょう。
add_shortcode( 'paragraph', 'custom_shortcode_paragraph' );
function custom_shortcode_paragraph( $atts ) {
// look for the existance of the string 'last' in the array
$last = in_array('last', $atts); // $last is now a boolean
// Attribute Defaults Function
$atts = shortcode_atts(
array(
'last' => $last, // default to true if the attribute existed valueless
),
$atts
);
$isLast = $atts['last'] !== false;
}
これで、ショートコード用の$atts['last'] === true && $isLast === true
ができました。
[paragraph last] something [/paragraph]
あなたが値を追加することになった場合、ショートコード:
[paragraph last="any value at all"] something [/paragraph]
$atts['last'] === "any value at all" && $isLast === true
を返します。 $last
は、最初の$atts
配列に内容があるため、false
になります。
array(1) {
["last"]=>
string(16) "any value at all"
}
したがって、配列項目の値は属性名ではなく、in_array('last', $atts) === false
なので、デフォルト値はshortcode_atts
がfalseです。しかし、それはdefaultであり、any value at all
の実際の値で上書きされ、$atts['last'] !== false
はtrue
ですなぜなら"any value at all" !== false
。
すべてが言った、これはあなたが望むことをし、ユーザーエラーに対して回復力があると思う。
私はこれを見つけた: http://richjenks.com/wp-shortcode-attributes-without-values/ /
コード
function get_flags($atts) {
$flags = array();
if (is_array($atts)) {
foreach ($atts as $key => $value) {
if ($value != '' && is_numeric($key)) {
array_Push($flags, $value);
}
}
}
return $flags;
}
使用法
$flags = get_flags($atts);
if (in_array('your_flag', $flags) {
// Flag is present
}