web-dev-qa-db-fra.com

Insérer du code après la balise <body> sans utiliser functions.php?

J'écris actuellement un plugin dans lequel les utilisateurs peuvent choisir s'ils souhaitent insérer une balise Google Analytics ou une balise GTM (gestionnaire de balises Google). J'ai déjà compris comment insérer le code après la balise.

Au moment où le code est inséré via une fonction personnalisée dans le function.php de mon thème et en appelant la fonction dans les thèmes header.php

Header.php

<?php wp_after_body();?>

Functions.php

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

Mais je me demandais s’il existe une solution dans laquelle je peux utiliser mon fichier de plug-in pour insérer le code après la balise (je n'ai donc pas à changer de fichier de thème chaque fois que j'utilise le plug-in).

J'ai déjà essayé ceci:

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

1
Daan Slurink

Puisque vous voulez que votre plugin soit indépendant du thème, vous devrez compter sur des points d'ancrage que vous pouvez supposer présents dans n'importe quel thème décent. Pour le moment, vous ne pouvez compter que sur wp_head et wp_footer. Un crochet juste après la balise <body>est en discussion , mais même s'il serait déclaré standard aujourd'hui, des milliers de thèmes existants ne l'implémenteraient pas. Donc ça ne sert à rien.

L'option que vous avez essayée ne fait que tamponner la plus grande partie de la page, vous permettant de modifier le contenu du tampon avant son impression. Cela devrait fonctionner, même s'il est loin d'être élégant et pourrait facilement interférer avec les autres plugins en utilisant une sorte de tampon.

Donc, non, il n'y a pas de moyen WordPressy direct de le faire de manière fiable. Ce que vous pourriez faire dans un plugin, cependant, est de le résoudre avec json. L'idée est assez simple, même si cela demandera du travail (et probablement une courbe d'apprentissage).

Hooking into wp_head ajoute un fichier de script jQuery qui ajoute un élément DOM juste après la balise <body> et utilisez l'api restante pour appeler la fonction qui générerait normalement le code que vous souhaitez utiliser à cet endroit.

1
cjbj

Je crains que ce ne soit pas possible pour le moment. Ceci est complètement sur le territoire du thème, et vous dépendez toujours du code du thème.

MAIS!! Il y a un hack simple que vous pouvez utiliser, pour une insertion de code pas compliquée. Je dis que c'est un bidouillage, et vous verrez pourquoi.

La seule chose sur laquelle vous pouvez compter qui existera dans 99,99% des thèmes est <body <?php body_class(); ?>>. Nous pouvons donc utiliser un crochet de filtre pour ajouter une autre "classe" à la balise body, sauf que ... ce ne sera pas une classe. Regardez ce code:

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
        ) 
    );
} );

Qu'avons-nous fait ici? Nous avons d’abord ajouté "> pour fermer l’élément body. Ensuite, vous pouvez insérer le code HTML que vous voulez. La dernière partie est également obligatoire. Pour gérer la fermeture réelle de l’élément body, nous devons créer quelque chose qui ne casse pas notre modèle, ainsi un champ de saisie masqué devrait bien fonctionner. Nous ajoutons <input type="hidden, mais sans fermer avec "> car la fonction body_class() le fera pour nous.

Notez qu'il est possible que ceci entre en collision avec d'autres filtres sur body_class, en fonction de la priorité. Pour gérer cela, vous pouvez intégrer cela dans un autre crochet d’action qui se déclenchera une fois le thème chargé, par exemple get_header. Dans ce cas, le code complet serait:

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
            ) );
    } );
});

Même si cela fait peut-être ce que vous voulez, je ne peux pas vraiment le recommander.

1
dboris