web-dev-qa-db-ja.com

入れ子になったショートコードを解析する方法

ネストされたショートコードは正しく解析されません。

[row]
    [col size="6"]...[/col]
    [col size="6"]
        [row]
            [col size="6"]...[/col]
            [col size="6"]...[/col]
        [/row]
    [/col]
[/row]

WordPressのドキュメント から、私はそれがWordPressのショートコードの制限であることを理解しています。それがうまくいくことはまだ可能ですか?

編集: これが私のショートコードのコードです。ネストされていなければ問題なく動作します(つまり、列のショートコードがcolのショートコード内で使用されていない)。

add_shortcode( 'row', 'row_cb' );
function row_cb( $atts, $content = null ) {             
        $output = '';
        $output .= '<div class="row">';
        $output .= do_shortcode( $content );        
        $output .= '</div>';

        return $output; 
}

add_shortcode( 'col', 'col_cb' );
function col_cb( $atts, $content = null ) {     
    extract( shortcode_atts( array(
            'size'  => '',
        ), $atts ) );


    $output = '';
    $output .= '<div class="col">';
    $output .= do_shortcode( $content );        
    $output .= '</div>';

    return $output; 
}
3
jay

実際にはそれに対する解決策があります。あなたが使っているショートコードは変数$ contentを持っていますが、フィルター do_shortcode はありません。

do_shortcode($content)

ショートコードがあるファイルを開き、do_shortcode($ content)の$ contentを変更します。それが動作します。

4
Gerard

私はネストされたショートコードのための解決策を作成しました、多分あなたはそれから何かを使うことができます。

再帰的な正規表現(|(?R))を使ったので、公式のdo_shortcodeほど速くはないかもしれませんが、同じ名前のショートコードを入れ子にすることは可能です。

私の要求は、どんなレベルのネストも可能にし、またいくつかのパラメータを含む$ attsの構造を使用するために、ショートコードの固定リストを持っていないことです。この正確な内容を埋める時期。

$ attsにも私自身の関数を書きました。私は$ attsにデフォルト値が定義されているもの(デフォルト値が定義されているものだけではありません)からのすべてのものを含みたいからです。そして、ショートコード値から来ていません。

これが私のatts関数です。

function complete_atts_with_defaults( $pairs, $atts = array() ) {
  $out = $atts;
  foreach ($pairs as $name => $default) {
    if ( array_key_exists($name, $atts)  && !empty( $atts[$name] ) ) { continue; }
    //else
    $out[$name] = $default;
  }
  return $out;
}

そして、これは他のコードです:

define( 'OUR_SHORTCODE_FULL_REGEX', '@\[([a-z0-9_]+)([^\]]*)\]((?:[^[]|(?R))+)\[\/\1\]@' );
define( 'OUR_SHORTCODE_HALF_REGEX', '@\[([a-z0-9_]+)([^\]]*)\/\]@' );

function fill_all_post_placeholders( $text, $atts = array() ) {
  //...
  $text = str_replace( '%5B', '[', $text );
  $text = str_replace( '%5D', ']', $text );

  $atts = complete_atts_with_defaults(
        array(
            'value1' => 'Hi :)',
            'value2' => '',
            'value3' => '',
        ), $atts );

  //...

  $text = preg_replace_callback( OUR_SHORTCODE_HALF_REGEX, function( $match ) use ( $atts ) { return replace_half_shortcode_placeholder( $match[1], $match[2], $atts ); }, $text );
  $text = preg_replace_callback( OUR_SHORTCODE_FULL_REGEX, function( $match ) use ( $atts ) { return replace_shortcode_placeholder( $match[1], $match[2], $match[3], $atts ); }, $text );

  return $text;
}

function replace_shortcode_placeholder( $name, $params, $content, $atts ) {
  $content = preg_replace_callback( OUR_SHORTCODE_FULL_REGEX, function( $match ) use ( $atts ) { return replace_shortcode_placeholder( $match[1], $match[2], $match[3], $atts ); }, $content );
  //   $function_to_call = '_rp_' . $name;
  //   if ( function_exists( $function_to_call ) ) { return $function_to_call( $name, $params, $atts ); }
  //   //else
  //   $value = $atts[ $name ];
  //   if ( empty( $value ) ) { return ''; }
  //   //else
  //   return $value;

  return '<br>name: '  . $name . ' <br>params: ' . $params . ' <br>content: (' . $content . ')<br><br>';
}

function replace_half_shortcode_placeholder( $name, $params, $atts ) {
  //   $function_to_call = '_rp_' . $name;
  //   if ( function_exists( $function_to_call ) ) { return $function_to_call( $name, $params, $atts ); }
  //   //else
  //   $value = $atts[ $name ];
  //   if ( empty( $value ) ) { return ''; }
  //   //else
  //   return $value;

  return '<br>name half: '  . $name . ' <br>params half: ' . $params . '<br><br>';
}

コメント欄はそのまま残しましたので、それらの機能がどのように使用されるかがわかります。

あなたがコメント付きのコードで見ることができるように、私のこれらの「ショートコード」は登録されていません、それらは異なって、動的に働きます。

また、これらのショートコードが機能するために必要な規則は、XMLの場合と同様に、自己終了タグに常に「/」を追加することです。 (コードでは、それらは "ハーフショートコード"と呼ばれています。)

このコードによって解析されたコンテンツの例(ちょっと残念です):

[show_text_if campaign="2899"]subscribing to this newsletter [show_text_if campaign="2901" field_value="'a href='http://ajshdash.com/asdhal/asdasdasd'" field_value2="айксчд асй даксчй д"]subscribing to this new newsletter[/show_text_if] [red value1="dfsdfs" value2="sdfkls dfh skjha skd"/][/show_text_if]

[color value3="askdfjajls" value4="lskdfhjsldhfs df"/]

[show_text_if_not campaign="2899"]asdklja slkd alkd alskdj alsjd alsj als jdalsk jals dalskj asjd <a href="http://example.com/experiment/" target="_blank">Experiment</a> once more hooray! [green value4="askljjlaskd"/] Я сегодня это Я и я! :)[/show_text_if_not]

[show_text_if field_name="campaign" field_value="2899"]slkjd alsjkd aljsd ajs d new[/show_text_if]

そして私は、このコードはあなたが求めたものに対する直接的な解決策ではないことを理解しています、しかしあなたはその解決策をあなた自身で解決するために多分あなたはそれのいくつかを使うことができます。

1
Olga Farber

ショートコードコールバックは次のようになります。

add_shortcode('col', 'col_cb');

add_shortcode('row', 'row_cb');

function col_cb( $atts, $content ) {
  $content = do_shortcode($content);
  // ...
}

function row_cb( $atts, $content ) {
  $content = do_shortcode($content);
  // ...
}
0
gmazzap