Kuerzlich habe ich ein kleines Akkordeon-Plugin fuer WordPress geschrieben, mit dem ich auf einer meiner Seiten eine Art “Spoiler” bauen wollte. Dies wollte ich mit Shortcodes und einem Attribut (Ueberschrift) loesen.

Damit in dem Akkordeon jedoch weitere Shortcodes verwendet werden koennen, also zum Beispiel Shortcodes fuer mehrere Spalten oder spezielle Formatierungen, muss beim schreiben der Shortcode-Funktion eine Kleinigkeit beachtet werden.

So gibt man in der Shortcode-Funktion des Plugins den Inhalt zwischen zwei Shortcodes aus:

$content

Sollen jetzt jedoch verschachtelte Shortcodes ermoeglicht werden, muss noch eine Methode um den zuvor genannten Teil gelegt werden:

do_shortcode($content)

So kann man, vorrausgesetzt andere Entwickler haben dies auch beachtet, Shortcodes beliebig oft verschachteln.

Ich fand wichtig, das auf meinem Merkzettel stehen zu haben.

Hier noch die ganze Funktion der Vollstaendigkeit halber:

Falsch:

function accordionwrap( $atts, $content = null ) {
    extract(shortcode_atts(array(
        "headline" => 'no headline set!'
    ), $atts));
    return '<section id="akkordeon">
    <div>
        <div>
            <div>' . $headline . '</div>
        </div>
        <div>
            <p>' . $content . '</p>
        </div>
    </div>
</section>';
}

Richtig:

function accordionwrap( $atts, $content = null ) {
    extract(shortcode_atts(array(
        "headline" => 'no headline set!'
    ), $atts));
    return '<section id="akkordeon">
    <div>
        <div>
            <div>' . $headline . '</div>
        </div>
        <div>
            <p>' . do_shortcode($content) . '</p>
        </div>
    </div>
</section>';
}

2 thoughts on “Verschachtelte Shortcodes bei WordPress

  1. Bin gerade damit beschäftigt. Es funktioniert leider nicht bei mir, bei verschachtelten div-Elementen, auch mit do_shortcode($content) nicht.
    So etwas geht nicht, finde grade keine Lösung..


    [div class="row marginbottom23 paddingbottom23"]
    [div class="col-md-12"]
    [div class="col-md-6 col-xs-12 paddingleft46 paddingright23"]
    bla
    [/div]
    [div class="col-md-6 col-xs-12 paddingleft46 paddingright23"]
    bla
    [/div]
    [/div]
    [/div]

Leave a Reply

Your email address will not be published.