Cum să injectezi conținut după tag-ul <body> în WordPress

20 nov. 2012, 23:56:47
Vizualizări: 17.7K
Voturi: 4

Doresc să injectez niște elemente direct după tag-ul <body>.

Este posibil acest lucru folosind doar hook-uri WordPress?

2
Comentarii

Te rog, Nippysaurus, fă-o fără să hack-ui tot ce nu trebuie hack-uit... @kaiser are răspunsul corect :)

brasofilo brasofilo
21 nov. 2012 05:45:35

Trebuie să te cred pe cuvânt în privința asta... Am ajuns să folosesc un șablon child, așa că nu am implementat niciuna din aceste soluții :) Sunt foarte nou în dezvoltarea WordPress (acesta este al doilea meu site), așa că e interesant să văd cum se rezolvă astfel de probleme.

Nippysaurus Nippysaurus
21 nov. 2012 06:45:13
Toate răspunsurile la întrebare 7
0

Doar adaugă un cârlig personalizat în șablonul tău:

<body>
<?php do_action( 'wpse73370_custom_hook' ); ?>
21 nov. 2012 02:42:37
0

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 -->';
}
9 mar. 2021 14:45:37
0

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

23 nov. 2016 20:15:17
1

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

5 oct. 2014 21:59:52
Comentarii

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

Sabir Abdul Gafoor Shaikh Sabir Abdul Gafoor Shaikh
10 mar. 2015 15:14:18
0

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ă.

18 nov. 2016 02:11:41
4

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ță.

21 nov. 2012 00:28:59
Comentarii

Și dacă vizitatorul site-ului a dezactivat JavaScript?

Ralf912 Ralf912
21 nov. 2012 01:38:21

Acesta este cel mai hackit hack dintotdeauna :p

Nippysaurus Nippysaurus
21 nov. 2012 01:53:21

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

kaiser kaiser
21 nov. 2012 02:41:40

@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_.

Ralf912 Ralf912
21 nov. 2012 21:56:37
0

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.

21 nov. 2012 01:34:10