web-dev-qa-db-ja.com

ショートコード属性が新しい行にある場合、wpautop()がargs配列を壊す

いくつかの属性を持つカスタムショートコードタグがあり、その属性を新しい行に表示できるようにしたいと思います。

[component
    attr1 ="value1"
    attr2 ="value of the second one"
    attr3 ="another"
    attr4 ="value"
    ...
    attrN ="valueN"]

この要件の背後にある理由は、いくつかの属性がコンテンツでかなり冗長になる可能性があることです。残念ながら、wpautop()$atts配列を壊すいくつかの厄介な特別なマークアップを追加します(php print_r($atts)を使用)。

Array ( [0] => attr1 [1] => ="value1"
/> [3] => attr2 = [4] => "value [5] => of [6] => the [7] => second [8] => one"
/> [10] => "" //...and more like this)

属性をインラインで試した

[component attr1 ="value1" attr2 ="value of the second one" ="value"... attrN ="valueN"]

そして、出力は予想通りです。

Array ( [attr1] => value1 [attr2] => value of the second one [attr3] => //...and so on)

意図的に属性を持たせ、$args配列を壊す余分なマークアップを回避する方法はありますか?

ショートコード[component]を登録するために使用する関数は、次のような値を抽出します。

function component_func( $atts, $content = null ) {
extract( shortcode_atts( array(
    'attr1' => 'attr1',
    'attr2' => 'attr2',
    'attr3' => 'attr3',
    ), $atts ) );
    // more code
}

次に、それらの抽出された変数を使って別の配列を作成します

3
Luca

わかりました、私はこのようにしてショートコードが作成されたのを見たことがないので、シナリオをテストするために少しコードをまとめました。そして、私は標準のショートコードフォーマットでうまく動作するコードで同じ結果を得ます。

標準ショートコードフォーマット

[ショートコードname1 = "値1" name2 = "値2"]

これはwpautop()の結果ではないと思いますが、ショートコードの属性が解析される方法の結果です。上記の例を見ると、ショートコードと名前=>値のペアを区切るために引用符で囲まれていない唯一の空白が使用されていることがわかります(つまり、名前と '='の間にスペースがなく、各name => valueの間にスペースが1つのみペア)。この文脈では、<br/>も空白と見なされます。

私はショートコード解析の特定の内部構造について詳しく調べていないので、役立つフックやフィルタに関する提案はできません。おそらく別のユーザーがここでいくつかのアイデアを持っています。

あなたがあなたのショートコードをあなたがそれのようにフォーマットしなければならないならば、私はあなたがあなたのショートコード関数に渡される配列を解析するためにカスタムコードを書かなければならないと思います。すべての値はそこにあるので、それらを元に戻すことができるはずです。

別の選択肢として、エンドユーザーが値を入力してコンテンツにショートコードを入力するためのフォームを提供することが考えられます。

私の答えの更新

私の答えに関する何かが私を悩ませていたので、私は再び見ました。そして、あなたは正しいですwpautop()はページの出力に影響を及ぼしています。しかし、それがあなたのショートコードの問題の原因ではないと思います。

1
Steve