Insertar HTML justo después de la etiqueta <body> en WordPress
Estoy usando el tema Twenty Twelve de WordPress (una versión child para ser exactos).
Quiero saber cómo insertar algo de HTML justo después de la apertura de body, usando solo functions.php y sin modificar header.php.
¿Es esto posible?

Twenty Twelve no tiene ningún hook que se ejecute inmediatamente después de la etiqueta de apertura <body>
.
Por lo tanto, en tu tema hijo que extiende el tema padre Twenty Twelve, copia el archivo header.php
al directorio de tu tema hijo.
Abre el archivo header.php
en tu tema hijo y justo después de la etiqueta de apertura del body añade un action hook al que luego podrás engancharte a través de tu archivo functions.php
.
Por ejemplo, en tu archivo twenty-twelve-child/header.php
:
<body <?php body_class(); ?>>
<?php do_action('after_body_open_tag'); ?>
Luego en tu archivo twenty-twelve-child/functions.php
:
function custom_content_after_body_open_tag() {
?>
<div>Mi Contenido Personalizado</div>
<?php
}
add_action('after_body_open_tag', 'custom_content_after_body_open_tag');
Esto se renderizará en tu HTML como:
<body>
<div>Mi Contenido Personalizado</div>
Lectura recomendada:
https://developer.wordpress.org/reference/functions/do_action/
ACTUALIZACIÓN: JULIO, 2019
Como comentó Junaid Bhura, a partir de WordPress 5.2 se ha introducido una nueva función auxiliar para temas wp_body_open
que está destinada a usarse de manera similar a otras funciones auxiliares como wp_head
y wp_footer
.
Por ejemplo:
<html>
<head>
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<!-- CONTENIDO DEL BODY AQUÍ -->
<?php wp_footer(); ?>
</body>
</html>
En el archivo functions.php de tu tema (o en otro lugar adecuado)
function custom_content_after_body_open_tag() {
?>
<div>Mi Contenido Personalizado</div>
<?php
}
add_action('wp_body_open', 'custom_content_after_body_open_tag');
IMPORTANTE
Debes asegurarte de que el hook exista dentro del tema en el que deseas inyectar contenido, ya que puede que aún no haya sido ampliamente adoptado por la comunidad.
Si NO existe, aún necesitarás seguir el principio de extender el tema con un tema hijo con la excepción de que TÚ usarías:
<?php wp_body_open(); ?>
...en lugar de O además de:
<?php do_action('after_body_open_tag'); ?>
Lectura recomendada:
https://developer.wordpress.org/reference/functions/wp_body_open/

Gracias. Lo intentaré.
¿Hay alguna otra forma de hacerlo sin agregar el header.php?
¿Como algo usando preg_replace?

Podrías hacerlo, por ejemplo enganchándote a template_include
o similar, sin embargo se desaconseja encarecidamente hacer eso porque no solo es ineficiente, sino que podría ser muy poco fiable si algo cambia en el tema padre debido a una actualización. Extender el tema padre usando un tema hijo es la mejor práctica, es predecible y esperado, además te da un gran control, como usar el ejemplo mostrado anteriormente. Pero si quieres usar preg_replace
eso depende de ti...

Gracias nuevamente.
Estoy usando tu código y funciona bien.
En realidad mi pregunta era desde la perspectiva de un tema hijo pero simplemente usando el functions.php del tema hijo.
Pero de todos modos, después de implementar tu código, me doy cuenta de que es sencillo, liviano y simple.

Desde WordPress 5.2, ahora hay una etiqueta estándar disponible: wp_body_open() : https://developer.wordpress.org/reference/functions/wp_body_open/

Una solución muy, muy, muy sucia sería:
/* Insertar código de seguimiento u otras cosas directamente después de que se abra el BODY */
add_filter('body_class', 'wps_add_tracking_body', PHP_INT_MAX); // asegurarse de que sea el último filtro en la cola
function wps_add_tracking_body($classes) {
// cerrar la etiqueta <body>, insertar código, abrir alguna otra etiqueta con variable sin sentido
$classes[] = '"><script> /* hacer lo que sea */ </script><noscript></noscript novar="';
return $classes;
}

Bueno, WordPress parece ser lo suficientemente inteligente, ¡en realidad se agrega al body! Si es un meta tag se inyectará dentro del header, de lo contrario se mostrará en el body.

Creo que @cjbj tiene razón. Parece que es el navegador el que lo mueve al body, no WordPress. Si ves el código fuente de una página donde lo has insertado en el head, ahí es donde lo encontrarás.

¡No hagas esto! Esto creará HTML inválido al insertar el <div>
en el <head>
. El navegador intentará corregirlo cerrando el head (insertando </head>
) justo antes del <div>
. Esto puede romper tu página, porque todo lo que vaya después del <div>
insertado ahora estará en el body y no en el head.
