it-swarm.com.de

Fügen Sie Ihren Code nach dem Tag <body> ein, ohne functions.php zu verwenden?

Momentan schreibe ich ein Plugin, in dem Benutzer auswählen können, ob sie ein Google Analytics-Tag oder ein GTM-Tag (Google Tag Manager) einfügen möchten. Ich habe bereits herausgefunden, wie der Code nach dem Tag eingefügt wird.

Momentan wird der Code über eine benutzerdefinierte Funktion in den function.php meines Themas eingefügt und die Funktion in den Themen header.php aufgerufen.

Header.php

<?php wp_after_body();?>

Functions.php

function wp_after_body() {
do_action('wp_after_body');
}

Aber ich habe mich gefragt, ob es eine Lösung gibt, bei der ich einfach meine Plugin-Datei verwenden kann, um den Code nach dem Tag einzufügen (sodass ich die Designdateien nicht jedes Mal ändern muss, wenn ich das Plugin verwende).

Ich habe es bereits versucht:

https://stackoverflow.com/a/27309880/7634982

1
Daan Slurink

Da Sie möchten, dass Ihr Plugin themenunabhängig ist, müssen Sie sich auf Hooks verlassen, von denen Sie annehmen können, dass sie in jedem anständig erstellten Thema vorhanden sind. Im Moment können Sie sich nur auf wp_head und wp_footer verlassen. Ein Hook direkt nach dem <body> -Tag wird gerade diskutiert , aber selbst wenn er heute als Standard deklariert würde, gäbe es immer noch Tausende von existierenden Themes, die ihn nicht implementieren. Das nützt dir also nichts.

Die Option, die Sie ausprobiert haben, puffert nur den größten Teil der Seite, sodass Sie den Inhalt des Puffers ändern können, bevor er gedruckt wird. Es sollte funktionieren, obwohl es alles andere als elegant ist und durch eine Art Pufferung leicht andere Plugins stören kann.

Nein, es gibt keine direkte WordPressy-Methode, um dies zuverlässig durchzuführen. Was Sie jedoch in einem Plugin tun können, ist es mit json zu lösen. Die Idee ist ziemlich einfach, erfordert jedoch einige Arbeit (und wahrscheinlich eine Lernkurve).

Fügen Sie in wp_head eine jquery-Skriptdatei hinzu, die direkt nach dem Tag <body> ein DOM-Element hinzufügt, und verwenden Sie die restliche API , um die Funktion aufzurufen, mit der Sie normalerweise den gewünschten Code an dieser Stelle generieren würden.

1
cjbj

Ich fürchte, das ist momentan nicht möglich. Dies liegt vollständig im Themengebiet, und Sie würden sich immer auf den Themencode verlassen.

ABER!! Es gibt einen einfachen Hack, den Sie für eine nicht komplizierte Code-Einfügung verwenden können. Ich sage, es ist ein Hack, und Sie werden sehen, warum.

Das Einzige, worauf Sie zählen können, das in 99,99% der Themen vorhanden sein wird, ist <body <?php body_class(); ?>>. Wir können also einen Filter-Hook verwenden, um dem Body-Tag eine weitere 'Klasse' hinzuzufügen, außer ... es wird keine Klasse. Schau dir diesen Code an:

add_filter( 'body_class', function ( $classes ) {
    return array_merge( 
        $classes, 
        array( '">
            <iframe src="//www.googletagmanager.com/ns.html?id=XXX-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
            <input type="hidden' // Important to handle the closing of the body element
        ) 
    );
} );

Was haben wir hier gemacht? Wir haben zuerst "> hinzugefügt, um das Element body zu schließen. Dann können Sie beliebiges HTML einfügen. Der letzte Teil ist ebenfalls obligatorisch, um das tatsächliche Schließen des Elements body zu bewältigen, müssen wir etwas erstellen, das unsere Vorlage nicht beschädigt, daher sollte ein verstecktes Eingabefeld gut funktionieren. Wir fügen <input type="hidden hinzu, ohne jedoch mit "> zu schließen, da die Funktion body_class() dies für uns erledigt.

Beachten Sie, dass je nach Priorität die Möglichkeit besteht, dass dies mit einigen anderen Filtern in body_class kollidiert. Um dies zu handhaben, können Sie dies in einen anderen Aktions-Hook einbinden, der nach dem Laden des Themas ausgelöst wird, zum Beispiel get_header. In diesem Fall wäre der vollständige Code:

add_action( 'get_header', function() {
    add_filter( 'body_class', function ( $classes ) {
        return array_merge(
            $classes,
            array( '">
            <iframe src="//www.googletagmanager.com/ns.html?id=XXX-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
            <input type="hidden' // Important to handle the closing of the body element
            ) );
    } );
});

Auch wenn dies möglicherweise das tut, was Sie wollen, kann ich dies nicht wirklich empfehlen.

1
dboris