1

したがって、別のネストされたショートコードの問題。[slide] と [prg] の 2 つのショートコードがあります。どちらもショートコードを囲んでいます。[prg] は [slide] にネストされています。しかし [prg] は解釈されません。2 つのショートコードは別々に機能します。do_shortcode() 関数は知っていますが、機能していないようです。理由はわかりません。

ここに私が書いたコードがあります:

add_action( 'init', 'register_shortcodes');

function make_slide($atts, $content = null) {
    extract(shortcode_atts(array(
      'num' => 1,
   ), $atts));

    $post_title = get_the_title($post->ID);
    $wrap = '<div class="slide slide-'.$num.'"><h1 class="h2-like projet_title">'.$post_title.'</h1>'.$content.'</div>';
    return $wrap;
}

function wrap_paragraph($atts, $content = null)
{
    $content = do_shortcode($content); //I've tried several solutions but none've worked.
    return '<p>'.$content.'</p>';
}

function register_shortcodes(){
    add_shortcode('slide', 'make_slide');
    add_shortcode('prg', 'wrap_paragraph');
}

そして、これがhtmlエディターでの私の投稿(カスタム投稿タイプ)の内容です:

[slide num="1"]<img title="4a6c2a605946a_1080x733" src="http://localhost:8888/labs/noway/wordpress_1/wp-content/uploads/2012/09/4a6c2a605946a_1080x733-460x312.jpg" alt="4a6c2a605946a_1080x733" width="460" height="312" />

[prg]Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa.[/prg][/slide]

このサイト、sitepoint.com や speckyboy.com などの他の投稿、およびwordpress codex のいくつかの投稿を読みましたが、回答がうまくいきません。おそらく、function.php ファイルでショートコードを正しい方法で実装していないからでしょうか?

誰かが私を助けることができれば? 何が機能しないのかを本当に理解したいです。よろしくお願いします。英語が下手で申し訳ありませんが、理解していただければ幸いです。

編集 コメントを終了する前に愚かに検証したので、次のとおりです。

@maiorano さん、こんにちは。ご協力ありがとうございます。完璧に機能しました。ただし、コードが本当に優れていても、MCE エディターでの人間の介入をできるだけ少なくして、メディア ライブラリから直接画像を取得する必要があるため、そのまま使用することはできません。しかし、それは私に神の道を学ばせました。

また、トップレベルのショートコードに do_shortcode を使用することをテストしましたが、奇妙な結果が得られました: < p > が < div > の外に強制送還されたため、混乱しました。

したがって、私を妨げていたのは、そのトップレベルの do_shortcode っぽいものと、おそらく私の add_shortcode() がショートコードの後に​​宣言されたという事実の組み合わせだったようです。

4

1 に答える 1

1

問題は、トップレベルのショートコード "[slide]" がdo_shortcode()そのコンテンツで実行されていないことです。いくつかの指針:

画像属性をショートコード属性として含めることをお勧めします。これにより、マークアップの量が減り、デフォルトを定義できるようになります。

「init」コールバック内でショートコードを定義する必要もありません。グローバル スコープで実行できます。

add_shortcode('slide', 'make_slide');
add_shortcode('prg', 'wrap_paragraph');
function make_slide($atts, $content = null)
{
    extract(shortcode_atts(array(
      'num' => 1,
      'title' => false,
      'src' => get_bloginfo('stylesheet_directory').'/images/notfound.jpg', //Default image if none provided
      'alt' => false,
      'width' => false,
      'height' => false,
   ), $atts));

    $title = $title ? " title=\"$title\"" : '';
    $alt = $alt ? " alt=\"$alt\"" : '';
    $width = $width ? " width=\"$width\"" : '';
    $height = $height ? " height=\"$height\"" : '';

    $img = "<img src=\"$src\"".$title.$alt.$width.$height." />";

    $post_title = get_the_title($post->ID);
    $wrap = '<div class="slide slide-'.$num.'"><h1 class="h2-like projet_title">'.$post_title.'</h1>'.$img.do_shortcode($content).'</div>';
    return $wrap;
}

function wrap_paragraph($atts, $content = null)
{
    $content = do_shortcode($content); //This is fine if you plan on nesting shortcode within this callback
    return '<p>'.$content.'</p>';
}

これを使用して、コンテンツを追加できました。

[slide num="1" title="4a6c2a605946a_1080x733" src="http://localhost:8888/labs/noway/wordpress_1/wp-content/uploads/2012/09/4a6c2a605946a_1080x733-460x312.jpg" alt="4a6c2a605946a_1080x733" width="460" height="312"][prg]Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa.[/prg][/slide]

そして得る:

<div class="slide slide-1"><h1 class="h2-like projet_title">Hello world!</h1><img width="460" height="312" alt="4a6c2a605946a_1080x733" title="4a6c2a605946a_1080x733" src="http://localhost:8888/labs/noway/wordpress_1/wp-content/uploads/2012/09/4a6c2a605946a_1080x733-460x312.jpg"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa.</p></div>
于 2012-09-18T13:25:07.930 に答える