it-swarm.com.de

suchen Sie in Post/Pages AND Widgets AND Template-Dateien nach Shortcodes

Für die nächste Version meines Plugins www.mapsmarker.com möchte ich die CSS- und JS-Dateien des Plugins nur ausgeben, wenn der Shortcode [mapsmarker ...] verwendet wird. Für Beiträge/und Seiten habe ich bereits diesen Arbeitscode gefunden:

function lmm_detect_shortcode()
{
    global $post;
    $pattern = get_shortcode_regex();
    preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches );

    if( is_array( $matches ) && array_key_exists( 2, $matches ) && in_array( 'mapsmarker', $matches[2] ) )
    {
        echo 'shortcode is used';
    }
}
add_action( 'wp', 'lmm_detect_shortcode' );

Das Problem ist, dass die Karten auch direkt in Widgets (per Shortcode) oder Vorlagendateien eingebettet werden können, indem die Funktion do_shortcode () verwendet wird (http://www.mapsmarker.com/docs/how-to-add-maps-to- Ihre Site verwendet Template-Tags /) und der obige Code überprüft nicht, ob dies zutrifft - was dazu führt, dass die Karte nicht angezeigt wird.

Als Workaround könnte ich eine Option in den Plugin-Einstellungen hinzufügen, wenn die js/css-Dateien nur hinzugefügt werden sollen, wenn der Shortcode zu einem Beitrag oder einer Seite hinzugefügt wird, und die Beschreibung hinzufügen, um diese Einstellung zu deaktivieren, wenn eine Karte zu Widgets über hinzugefügt wird Shortcode oder Template-Dateien über do_shortcode ().

Da dies keine brauchbare Lösung ist (was langfristig zu einigen Supportanfragen führen würde), suche ich nach einer Lösung, bei der ich diese Funktion standardmäßig aktivieren kann und keine Option zu den Einstellungen hinzufügen muss , weil der Code auch prüft, ob ein Shortcode in Widgets oder über do_shortcode () in einer der Vorlagendateien wie folgt hinzugefügt wird:

....
if( ( is_array( $matches ) && array_key_exists( 2, $matches ) && in_array( 'mapsmarker', $matches[2] ) ) || ( CHECK IF SHORTCODE USED IN WIDGETS == TRUE ) || ( CHECK IF SHORTCODE USED IN TEMPLATE FILES == TRUE ) )
{
    echo 'shortcode is used';
}
.....

Mein erster Ansatz für dieses Problem bestand darin, globale Variablen zu überprüfen und festzustellen, ob ich diesen hinzugefügten Code irgendwie herausfiltern konnte, z. by $ wp_filter (array) - ein mehrdimensionales Array aller Funktionen, die Filtern/Hooks hinzugefügt wurden. Leider habe ich noch keine Lösung gefunden. Jede Hilfe wird geschätzt!

2
robertharm

Vielleicht hat mich jemand korrigiert, aber ich denke, ab Version 3.3 können Sie Skripte und Stile "inline" in einen Beitrag einreihen.

Das bedeutet: Sie können Ihr wp_enqueue_script/style in Ihre Shortcode-Funktion einfügen, und WordPress fügt sie in die Fußzeile ein, da es zu spät ist, sie in die Kopfzeile einzufügen.

Bedeutet: Es funktioniert nur, wenn der Shortcode aufgerufen wird.

Bearbeiten: als Antwort auf Nicks Kommentar unten, wo die Enqueue-Funktion hinzugefügt werden soll: Ich habe einen kurzen Test mit dem Beispiel-Shortcode aus dem Codex durchgeführt:

function caption_shortcode( $atts, $content = null ) {
    wp_enqueue_script('myscript','nonexistinglocation');
    wp_enqueue_style('mystyle','throwmeanerror');
    return '<span class="caption">' . $content . '</span>';
}

Getestet innerhalb des Beitragsinhalts und des Text-Widgets und soweit funktioniert (Ungeachtet der ungültigen URLs). Die Funktionen sollten natürlich vor der Rückkehr aufgerufen werden (und ja, machen Sie es richtig und registrieren Sie Ihr Skript und Ihre Stile vorher [ faul ])

4
ungestaltbar