it-swarm.com.de

<p> -Tag unterbricht die Shortcode-Ausgabe (andere Lösungen funktionieren nicht)

Ich bin gerade auf ein seltsames Problem gestoßen. Meine Shortcode-Ausgabe ist so etwas wie

'<span class="link_container"><a href="#">'.$content.'</a></span>    
<div class="upgrade_box">
some more divs here
</div>'

wird durch einen zufälligen </p>-schließenden Tag unterbrochen, der nach </span> eingefügt wird

Das Ändern der wpautop-Priorität hat nicht funktioniert. Die einzige Lösung, die zu funktionieren schien, war das Entfernen des Wpautop-Filters insgesamt, was offensichtlich keine so gute Lösung ist.

P.S. Ich verwende das wp 2015-Theme auf meiner Test-Site, daher scheint es kein Thema zu sein, mit dem Forest-Theme Probleme zu haben.

1
Igor Yavych

Probieren Sie diese Funktion aus und fügen Sie Ihren Shortcode in das Array ein

// (OPT) STOP SHORTCODES THAT DON'T USE INLINE CONTENT FROM BEING WRAPPED IN A P TAG (until WP fixes this)

// ** NOTE -> BE SURE TO change the array to the shortcodes you are using!

add_filter('the_content', 'the_content_filter');
function the_content_filter($content) {
    // array of custom shortcodes requiring the fix
    $block = join("|",array( 'shortcode_name' ));
    // opening tag
    $rep = preg_replace("/(<p>)?\[($block)(\s[^\]]+)?\](<\/p>|<br \/>)?/","[$2$3]",$content);
    // closing tag
    $rep = preg_replace("/(<p>)?\[\/($block)](<\/p>|<br \/>)?/","[/$2]",$rep);
    return $rep;
}
1
NickFMC

Ausgehend von @ nickfmcs Kommentar ist hier eine überarbeitete Version für das neueste WordPress, die die richtige Priorität für den Filter verwendet und auch einige Probleme mit dem regulären Ausdruck behebt.

Hinweis: Es ist am besten, jeden Blockformat-Shortcode in einer eigenen Zeile zu belassen (separater Absatz im WYSIWYG-Editor).

<?php

add_filter('the_content', function ($content) {
    $blocks = 'columns|column';

    $replace = [
        "/(?:<p>)?\[($blocks)(\s[^\]]+)?\](?:<\/p>|<br\s*\/?>)?/" => '[$1$2]',
        "/(?:<p>)?\[\/($blocks)\](?:<\/p>|<br\s*\/?>)?/" => '[/$1]',
    ];

    return preg_replace(array_keys($replace), array_values($replace), $content);
}, '10.1');

Ersetzen Sie die Variable $blocks natürlich durch Ihre eigenen Shortcodes.

0
Corey