Inserire HTML subito dopo il tag <body>
Sto utilizzando il tema WordPress Twenty Twelve (per essere precisi, un tema child).
Vorrei sapere come inserire del codice HTML subito dopo l'apertura del tag body, utilizzando solo functions.php e non modificando header.php.
È possibile?

Twenty Twelve non ha alcun hook che venga eseguito immediatamente dopo il tag di apertura <body>
.
Pertanto, nel tuo child theme che estende il tema genitore Twenty Twelve, copia il file header.php
nella directory del tuo child theme.
Apri il file header.php
nel tuo child theme e subito dopo il tag di apertura body aggiungi un action hook al quale potrai agganciarti tramite il tuo file functions.php
.
Ad esempio, nel tuo file twenty-twelve-child/header.php
:
<body <?php body_class(); ?>>
<?php do_action('after_body_open_tag'); ?>
Poi nel tuo file twenty-twelve-child/functions.php
:
function custom_content_after_body_open_tag() {
?>
<div>Il mio contenuto personalizzato</div>
<?php
}
add_action('after_body_open_tag', 'custom_content_after_body_open_tag');
Questo verrà quindi renderizzato nel tuo HTML come:
<body>
<div>Il mio contenuto personalizzato</div>
Lettura consigliata:
https://developer.wordpress.org/reference/functions/do_action/
AGGIORNAMENTO: LUGLIO 2019
Come commentato da Junaid Bhura, a partire da WordPress 5.2 è stata introdotta una nuova funzione helper per i temi wp_body_open
pensata per essere utilizzata come altre funzioni helper quali wp_head
e wp_footer
.
Ad esempio:
<html>
<head>
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<!-- CONTENUTO DEL BODY QUI -->
<?php wp_footer(); ?>
</body>
</html>
Nel file functions.php del tuo tema (o in un altro posto appropriato)
function custom_content_after_body_open_tag() {
?>
<div>Il mio contenuto personalizzato</div>
<?php
}
add_action('wp_body_open', 'custom_content_after_body_open_tag');
IMPORTANTE
Dovresti assicurarti che l'hook esista all'interno del tema nel quale vuoi iniettare il contenuto, poiché potrebbe non essere ancora ampiamente adottato dalla community.
Se NON esiste, dovrai comunque seguire il principio di estendere il tema con un child theme con l'eccezione che TU dovresti usare:
<?php wp_body_open(); ?>
...invece di OPPURE in aggiunta a:
<?php do_action('after_body_open_tag'); ?>
Lettura consigliata:
https://developer.wordpress.org/reference/functions/wp_body_open/

Grazie. Proverò questo approccio.
C'è qualche altro modo per farlo senza aggiungere il file header.php?
Ad esempio usando qualcosa come preg_replace?

Potresti farlo, ad esempio agganciandoti a template_include
o simile, tuttavia è fortemente sconsigliato perché non solo è inefficiente, ma potrebbe essere molto inaffidabile se qualcosa cambiasse nel tema genitore a causa di un aggiornamento. Estendere il tema genitore usando un child theme è la best practice, è prevedibile e atteso, inoltre ti dà un grande controllo, come nell'esempio mostrato sopra. Comunque se vuoi usare preg_replace
sta a te...

Grazie ancora.
Sto usando il tuo codice e funziona bene.
In realtà la mia domanda era dal punto di vista di un child theme ma usando semplicemente il functions.php del tema figlio.
Ma comunque dopo aver implementato il tuo codice, mi rendo conto che è semplice, leggero e diretto.

Da WordPress 5.2, è disponibile un tag standard: wp_body_open() : https://developer.wordpress.org/reference/functions/wp_body_open/

Una soluzione molto, molto, molto sporca sarebbe:
/* Inserisci il codice di tracciamento o altre cose direttamente dopo l'apertura del BODY */
add_filter('body_class', 'wps_add_tracking_body', PHP_INT_MAX); // assicurati che sia l'ultimo filtro nella coda
function wps_add_tracking_body($classes) {
// chiudi il tag <body>, inserisci il codice, apri qualche altro tag con una variabile senza senso
$classes[] = '"><script> /* fai quello che vuoi */ </script><noscript></noscript novar="';
return $classes;
}

Sembra che wp sia abbastanza intelligente, in realtà viene aggiunto al body! Se è un meta tag allora verrà iniettato nell'header, altrimenti verrà mostrato nel body.

Credo che @cjbj abbia ragione. Sembra che sia il browser a spostarlo nel body, non WordPress. Visualizza il codice sorgente di una pagina dove l'hai inserito nell'head e lo troverai lì.

Non farlo! Questo creerà HTML non valido inserendo il <div>
nell'<head>
. Il browser cercherà di risolvere il problema chiudendo l'head (inserendo </head>
) appena prima del <div>
. Questo può rompere la tua pagina, perché tutto ciò che viene dopo il <div>
inserito finirà nel body invece che nell'head.
