Cum să injectezi conținut după tag-ul <body> în WordPress
Doresc să injectez niște elemente direct după tag-ul <body>
.
Este posibil acest lucru folosind doar hook-uri WordPress?

WordPress 5.2.0 a introdus cârligul wp_body_open
(detaliat în WordPress codex)
// Adaugă cod după deschiderea tag-ului body.
add_action( 'wp_body_open', 'wpdoc_add_custom_body_open_code' );
function wpdoc_add_custom_body_open_code() {
echo '<!-- cod personalizat -->';
}

După citirea acestui răspuns am realizat acest cod.
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">Conținutul meu</div>';
return $after_body;
});
Primele două filtre "shutdown" și "final_output" sunt funcțiile de bază. Acestea ar putea face parte dintr-un plugin. După ce sunt create, poți folosi noul filtru after_body pentru a adăuga ce dorești după tag-ul body.
În acest caz am adăugat un simplu div, așa că rezultatul a fost:
<body><div class="content">Conținutul meu</div>
Ceea ce este interesant este că cu această expresie regulată nu trebuie să-ți faci griji că vei afecta ce este în interiorul tag-ului body. De exemplu o clasă sau orice altceva

Nu am găsit niciun exemplu funcțional online, dar am obținut o soluție și sper că poate ajuta pe cineva.
jQuery(document).ready( function($) {
$('body').prepend('<h1>Salut lume</h1>');
});
https://wordpress.org/support/topic/add_action-right-after-ltbodygt-tag

Doar să știi că, cu ajutorul acesta am realizat acest plugin http://woocomercescratchdiscount.themefantasy.com/

Dacă utilizați Genesis de la StudioPress, există un hook pe care îl puteți folosi asemănător cu cel pe care îl folosesc pentru plugin-urile 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;
}
Acest lucru pare să funcționeze pentru mine. Este practic același lucru ca și adăugarea propriului hook, ca în răspunsul #1 (cu care sunt de acord că este cel mai bun).
Totuși... dacă sunteți ca mine și construiți site-uri folosind orice șablon a ales clientul, nu-mi place să adaug hook-uri personalizate în acest fel. Păstrez toate elementele mele într-un director separat și le conectez la functions.php. Așadar, aș folosi soluția jQuery pentru a le adăuga în DOM după încărcare.
Am testat ideea lui Ralf912 cu buffer-ul de ieșire. Este foarte interesant. Aș spune că, dacă trebuie să vă asigurați că codul dumneavoastră este executat corect și pe aceeași pagină, că este 100% necesar să fie acolo și nu doriți să vă încurcați cu șablonul, aceasta este o idee bună.

Poți crea un plugin bazat pe JavaScript care folosește prependTo
pentru a plasa un tag imediat după tag-ul de început al corpului (body). Vezi aici pentru o referință.

@Nippysaurus Într-adevăr (+1), dar output buffering nu este cu nimic mai bun.

@kaiser Te gândești la bufferizarea ieșirii imbricate. Acest lucru poate fi uneori un pic complicat. Utilizarea bufferizării ieșirii cu un callback nu este atât de complicată, deoarece callback-ul va fi apelat la fiecare apel al funcției ob_ și înainte de apelul funcției ob_.

Da, este destul de simplu:
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);
}
Prima funcție va înregistra un callback pentru buffer-ul de ieșire. A doua funcție este callback-ul și va modifica și returna HTML-ul. Vă rugăm să citiți manualul PHP despre buffer-ul de ieșire pentru mai multe informații.
