web-dev-qa-db-ja.com

ショートコードの空の属性

ショートコードに空の属性を作成する方法はありますか?

例:

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"属性を使用したかどうかを確認する方法はありますか?

5
Wordpressor

これを行うにはいくつかの方法があります。あいにく、私はあなたが何をしようとしているのかということになるとは思わない。 ([paragraph last]

  1. 属性を必要とせずに$ contentを処理する[paragraph_first][paragraph_last][paragraph_foobar]用に別々のショートコードを作成するだけで済みます。

  2. Lastのデフォルト値を''の代わりにfalseに設定し、ユーザーに[paragraph last=""]content[/paragraph]の実行を要求することもできます。

  3. positionのようなもっと意味のある属性を追加することができ、それを[paragraph position="first"][paragraph position="last"]のように使うことができます。

WordPressがデフォルトを与えられていない属性をすべて破棄するという事実と、="value"を持たないattにはまったくリストされていないのと同じデフォルト値が与えられるという事実のために、私は[paragraph last]を達成する方法を見ません

うまくいけば、私の3つの回避策のうちの1つが役に立つことを証明するでしょう。がんばろう!

0
SethMerrick

WordPressはSethMerrickが示唆しているように値のない属性を破棄しませんが、あなたが期待するようには扱いません。あなたの例では、あなたはisset($atts['last'])をチェックすることができないでしょうが、 "last"は値として名前のない属性に渡されます。この場合、これはTRUEになります:($atts[0] == 'last')。そのため、「last」の値を持つすべての属性をチェックするためにforeachループを実行できます。

10
kingjeffrey

[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ループは、整数インデックスの属性に対して安全です。
6
M Miller

私はこれが古いことを知っています、しかし私は答えのどれもが完全でコンパクトな答えであると感じませんでした。多くの人があなたの値が存在するかどうかを見つけるために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
}
4
Mike

ここで受け入れられた答えは間違っていると正しいです。フレーズ:

「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関数の最初の行としての$attscustom_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'] !== falsetrueですなぜなら"any value at all" !== false

すべてが言った、これはあなたが望むことをし、ユーザーエラーに対して回復力があると思う。

1
Infinity Media

私はこれを見つけた: 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
}
1
benoît