web-dev-qa-db-ja.com

ショートコードで無価値な属性を処理する方法

HTMLエレメントの中には、<input disabled /><video autoplay />などの無価値な属性を受け入れるものがあります

デフォルトで自動再生を無効にしたい(=属性をまったく省略したい)が、オプションで有効にしたいというショートコードでこのケースをどのように処理するのですか。

考えられるシナリオ

// [video]
<video>

// [video autoplay]
<video autoplay="autoplay"> // using XML syntax

// [video autoplay="autoplay"]
<video autoplay="autoplay"> 

// [video autoplay="false"]
<video autoplay="false"> // value doesn't matter - video will still auto play

これを行うための標準的な方法は、のようには役に立ちません。デフォルト値は使いたくありません。

// http://codex.wordpress.org/Shortcode_API#Attributes
function my_shortcode_handler( $atts, $content = null ) {
    extract( shortcode_atts( array(
        'attr_1' => 'attribute 1 default',
        'attr_2' => 'attribute 2 default',
    // ...etc
    ), $atts ) );
}

私は間違いなくこの問題に関する私自身のハックを見つけることができます、しかしこれをするためのかなりの方法があるなら私は興味があります。

2
Jan Beck

ショートコード値として0および1を使用し、それを使用してHTML属性を表示または非表示にします。

要素inputと属性requiredを使った例:

function input_shortcode( $atts )
{
    $values = shortcode_atts(
        array (
            'type'     => 'text',
            'value'    => '',
            'name'     => '',
            'id'       => '',
            'required' => 0,
        ),
        $atts
    );

    $values = array_map( 'esc_attr', $values );

    return sprintf(
        '<input type="%1$s"%2$s%3$s%4$s%5$s>',
        $values[ 'type' ], // 1
        '' === $values[ 'name' ]     ? '' : ' ' . $values[ 'name' ], // 2
        '' === $values[ 'value' ]    ? '' : ' ' . $values[ 'value' ], // 3
        '' === $values[ 'id' ]       ? '' : ' ' . $values[ 'id' ], // 4
        0  === $values[ 'required' ] ? '' : ' required' // 5
    );
}

extract() を使用しないでください。今まで.

2
fuxia

名前のない属性は、まだショートコードハンドラに渡されています。名前でアクセスすることはできません。

数字キーで属性をループしてautoplay値の存在をチェックすることで、[video autoplay]バリアントを実現できます。

類似の質問を参照してください - ショートコードだが等号なし?

1
Rarst