Come iniettare contenuto dopo il tag <body>
Vorrei iniettare alcuni elementi direttamente dopo il tag <body>
.
È possibile farlo utilizzando solo gli hook di WordPress?

WordPress 5.2.0 ha introdotto l'hook wp_body_open
(dettagliato nel codex di WordPress)
// Aggiungi codice dopo il tag body aperto.
add_action( 'wp_body_open', 'wpdoc_add_custom_body_open_code' );
function wpdoc_add_custom_body_open_code() {
echo '<!-- codice personalizzato -->';
}

Dopo aver letto questa risposta ho realizzato questo.
ob_start();
add_action('shutdown', function() {
if ( is_admin() ) {
return;
}
$final = '';
$levels = ob_get_level();
for ($i = 0; $i < $levels; $i++){
$final .= ob_get_clean();
}
echo apply_filters('final_output', $final);
}, 0);
add_filter('final_output', function($output) {
if ( is_admin() ) {
return;
}
$after_body = apply_filters('after_body','');
$output = preg_replace("/(\<body.*\>)/", "$1".$after_body, $output);
return $output;
});
add_filter('after_body',function($after_body){
$after_body.='<div class="content">Il mio contenuto</div>';
return $after_body;
});
I primi due filtri "shutdown" e "final_output" sono le funzioni principali. Potrebbero far parte di un plugin. Dopo che sono stati creati, puoi utilizzare il nuovo filtro after_body per aggiungere ciò che desideri dopo il tag body.
In questo caso ho aggiunto un semplice div, quindi il risultato finale è stato questo:
<body><div class="content">Il mio contenuto</div>
Ciò che è interessante è che con questa espressione regolare non devi preoccuparti di danneggiare ciò che è all'interno del tag body. Una classe, per esempio, o qualsiasi altra cosa

Non sono riuscito a trovare alcun esempio funzionante online, ma ho ottenuto una soluzione e spero che possa aiutare qualcuno.
jQuery(document).ready( function($) {
$('body').prepend('<h1>Hello world</h1>');
});
https://wordpress.org/support/topic/add_action-right-after-ltbodygt-tag

Solo per farti sapere che, con quell'aiuto ho creato questo plugin http://woocomercescratchdiscount.themefantasy.com/

Se stai utilizzando Genesis di StudioPress, c'è un hook che puoi usare come quello che utilizzo per i plugin di Facebook:
add_action( 'genesis_before', 'fn_AddFacebook' );
function fn_AddFacebook(){
$script='
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8";
fjs.parentNode.insertBefore(js, fjs);
}(document, \'script\', \'facebook-jssdk\'));';
echo $script;
}
Questo metodo funziona per me. È essenzialmente la stessa cosa di aggiungere il tuo hook personalizzato, come nella risposta #1 (con cui sono d'accordo sia la migliore).
Tuttavia... se sei come me e crei siti utilizzando qualsiasi template scelto dal cliente, non mi piace aggiungere i miei hook in quel modo. Mantengo tutto il mio codice in una directory separata e lo collego al functions.php. Quindi, utilizzerei la soluzione jQuery per aggiungerlo al DOM dopo il caricamento.
Comunque, ho testato l'idea di Ralf912 con l'output buffer. È molto interessante. Direi che, se hai bisogno di assicurarti che il tuo codice venga eseguito correttamente e sulla stessa pagina e che debba essere assolutamente presente, senza dover modificare il template, questa è una buona idea.

Puoi creare un plugin basato su JavaScript che utilizza prependTo
per posizionare un tag subito dopo il tag body iniziale. Dai un'occhiata qui per un riferimento.

Sì, è abbastanza semplice:
add_action( 'init', 'test_start_buffer', 0, 0 );
function test_start_buffer(){
ob_start( 'test_get_buffer' );
}
function test_get_buffer( $buffer){
return preg_replace( '#<body.+>#', '<body>', $buffer);
}
La prima funzione registrerà una callback per il buffering dell'output. La seconda funzione è la callback e modificherà e restituirà l'HTML. Si prega di leggere il manuale PHP sul buffering dell'output per maggiori informazioni.
