Cómo inyectar contenido después de <body> en WordPress
Me gustaría inyectar algunos elementos directamente después de la etiqueta <body>
.
¿Es posible hacer esto usando solo los hooks de WordPress?

WordPress 5.2.0 introdujo el hook wp_body_open
(detallado en el codex de WordPress)
// Agregar código después de la etiqueta de apertura del body.
add_action( 'wp_body_open', 'wpdoc_add_custom_body_open_code' );
function wpdoc_add_custom_body_open_code() {
echo '<!-- código personalizado -->';
}

Después de leer esta respuesta he creado esto.
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">Mi Contenido</div>';
return $after_body;
});
Los primeros dos filtros "shutdown" y "final_output" son las funciones principales. Podrían ser parte de un plugin. Una vez creados, puedes usar el nuevo filtro after_body para añadir lo que quieras después del body.
En este caso he añadido un simple div, por lo que el resultado final fue:
<body><div class="content">Mi Contenido</div>
Y lo que también es interesante es que con esta expresión regular no necesitas preocuparte por dañar lo que está dentro del body. Una clase, por ejemplo, o cualquier otra cosa.

No pude encontrar ningún ejemplo funcional en línea, pero obtuve una solución y espero que pueda ayudar a alguien.
jQuery(document).ready( function($) {
$('body').prepend('<h1>Hola mundo</h1>');
});
https://wordpress.org/support/topic/add_action-right-after-ltbodygt-tag

Solo para hacerte saber que, con esa ayuda hice este plugin http://woocomercescratchdiscount.themefantasy.com/

Si estás usando Genesis de StudioPress, hay un hook que puedes usar como el que yo utilizo para los plugins de 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; }
Eso parece funcionar para mí. Básicamente es exactamente lo mismo que agregar tu propio hook, como la respuesta #1 (con la cual estoy de acuerdo que es la mejor).
Sin embargo... si eres como yo y armas sitios usando cualquier plantilla que el cliente eligió, no me gusta agregar mis propios hooks de esa manera. Mantengo todo mi código en un directorio separado y lo enlazo al functions.php. Entonces, usaría la solución de jQuery para simplemente agregarlo al DOM después de la carga.
Sin embargo, probé la idea del buffer de salida de Ralf912. Eso es muy interesante. Diría que, si necesitas asegurarte de que tu código se ejecute correctamente y en la misma página, y que al 100% debe estar ahí, y no quieres meterte con la plantilla, esa es una buena idea.

Puedes crear un plugin basado en JavaScript que utilice prependTo
para colocar una etiqueta justo después de la etiqueta de apertura del body. Mira este ejemplo como referencia.

@Nippysaurus De hecho (+1), pero el buffering de salida no es mucho mejor.

@kaiser Piensas en el almacenamiento en búfer de salida anidado. Esto a veces es un poco complicado. Usar el almacenamiento en búfer de salida con una devolución de llamada no es tan complicado porque la devolución de llamada se ejecutará en cada llamada a ob_ y antes de la llamada a ob_.

Sí, es bastante simple:
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 primera función registrará un callback para el buffer de salida. La segunda función es el callback y modificará y retornará el HTML. Por favor lee el manual de PHP sobre el buffer de salida para más información.
