web-dev-qa-db-ja.com

属性内のショートコードを許可する

私はWPサイトのいくつかの記事についてウィキペディアのようなインフォボックスを作りたいです。最も論理的なことは、カスタムショートコードを使用することです。固定の順序のフィールドを持つテーブル風のマークアップを返します。このようなものをややエミュレートして設定します。

 <!--MediaWiki markup-->
 {{infobox-cd
 |name=Abbey Road"
 |cover=[[File:laserdisc.jpg]]
 |artist=[[The Bombay Beach Boys]]
 |country={{flag id=mx}} Argentina<br />{{flag id=dk}} Vanuatu (post-production)
 |rating={{stars no=3}}
 |prev=[[The Wall]]
 |next=[[Born in the U.S.A.]]
 }}

それでも、私は属性の内側に大括弧を入れている間にショートコードが壊れるため、何年もの間よりリテラルなアプローチでそれらを使用することを妨げられてきました。理論的には動作するはずですが、ショートコードの正規表現がショートコード内の最初の右大括弧(])で停止するためではありません。

[foo bar="[baz /]"]content[/foo]

それは "出力":

[foo bar="[baz /]

他にどのようにしてこのマークアップを機能させることができるか、または同じ目標を持つ何か他のものを得ることができるかわかりません。

4
peroyomas

申し訳ありませんが、 Shortcode API でご覧になることができるように、括弧はまだショートコードを使用できません。しかしながら、括弧を使うことを許す囲みショートコードを使うことは可能です。これを実証しましょう。

ショートコード:[foo bar="No brackets here!"]...use [brackets] here[/foo]

このようなショートコードをfunctions.phpに次のように追加できます。

add_shortcode( 'foo', 'foo_shortcode' );
function foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );
  return '<p>' . $bar . ' ' . $content . '</p>';
}

括弧内のコンテンツを別のショートコードとして実行することもできます。

ショートコード:[foo bar="No shortcodes here!"]...use [shortcodes] here[/foo]

add_shortcode( 'foo', 'execute_foo_shortcode' );
function execute_foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );
  return '<p>' . $bar . ' ' . do_shortcode($content) . '</p>';
}

しかし、単純にしましょう。ショートコード自体の中に角かっこを追加しないのはなぜですか。

ショートコード:[foo bar="shortcode"]

そしてあなたのfunctions.phpの中に

add_shortcode( 'foo', 'build_foo_shortcode' );
function build_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    return '<p>' . do_shortcode( '[' . $bar . ']' ) . '</p>';
  endif;
}

あなたが自分の種類のショートコードを使い続けたいのであれば、角括弧の周りを移動して類似のものを追加して、正規表現で認識して置き換えることができます。

ショートコード:[foo bar="Use your ___shortcode___ here"]

あなたのfunctions.phpの中で、___shortcode___[shortcode]に置き換えて、そしてそれをdo_shortcode()を介して再び実行することができます

add_shortcode( 'foo', 'regex_foo_shortcode' );
function regex_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    $foo_bar = preg_replace_callback("/(.*)_{3}(.*)_{3}(.*)/", function($m) {
        return $m[1] . do_shortcode('[' . $m[2] . ']') . $m[3];
    }, $bar);
    return '<p>' . $foo_bar . '</p>';
  endif;
}

さて、今は少し複雑ですね。別の方法(ショートコードでやりたくない場合)はカスタムフィールドです。 カスタムフィールド はデフォルトで利用可能で、 画面オプション で切り替えることができます。

the_meta() を使用するか、または get_post_meta() 関数で取得して、テーマ内で簡単に出力することができます。さらに、(ショートコードと比較して)イン/アウトを扱うのがより簡単で、編集者の誰もそれらの利用可能なショートコードの全てを覚えている必要はありません。

プラグインのインターフェース または を使って高度なカスタムフィールドを簡単に生成することもできますし、独自にカスタマイズすることもできます 。とにかくあなたは制限なしであなたのテキストエディタの下または横にNice入力フィールドを持つことになります(ファイルアップロード、日付ピッカーなど)。これは次のようになります。

enter image description here

3
Sven