Come iniettare contenuto dopo il tag <body>

20 nov 2012, 23:56:47
Visualizzazioni: 17.7K
Voti: 4

Vorrei iniettare alcuni elementi direttamente dopo il tag <body>.

È possibile farlo utilizzando solo gli hook di WordPress?

2
Commenti

Per favore, Nippysaurus, fallo senza hackerare ciò che non ha bisogno di essere hackerato... @kaiser ha la risposta corretta :)

brasofilo brasofilo
21 nov 2012 05:45:35

Dovrò crederti sulla parola... Alla fine ho optato per un child template quindi non ho implementato nessuna di queste soluzioni :) Sono molto nuovo nello sviluppo WordPress (questo è il mio secondo sito) quindi è interessante vedere come risolvere questo tipo di problemi.

Nippysaurus Nippysaurus
21 nov 2012 06:45:13
Tutte le risposte alla domanda 7
0

Aggiungi semplicemente un hook personalizzato al tuo template:

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

WordPress 5.2.0 ha introdotto l'hook wp_body_open (dettagliato nel codex di WordPress)

// Aggiungi codice dopo il tag body aperto.
add_action( 'wp_body_open', 'wpdoc_add_custom_body_open_code' );
 
function wpdoc_add_custom_body_open_code() {
    echo '<!-- codice personalizzato -->';
}
9 mar 2021 14:45:37
0

Dopo aver letto questa risposta ho realizzato questo.

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">Il mio contenuto</div>';
    return $after_body;
});

I primi due filtri "shutdown" e "final_output" sono le funzioni principali. Potrebbero far parte di un plugin. Dopo che sono stati creati, puoi utilizzare il nuovo filtro after_body per aggiungere ciò che desideri dopo il tag body.

In questo caso ho aggiunto un semplice div, quindi il risultato finale è stato questo:

<body><div class="content">Il mio contenuto</div>

Ciò che è interessante è che con questa espressione regolare non devi preoccuparti di danneggiare ciò che è all'interno del tag body. Una classe, per esempio, o qualsiasi altra cosa

23 nov 2016 20:15:17
1

Non sono riuscito a trovare alcun esempio funzionante online, ma ho ottenuto una soluzione e spero che possa aiutare qualcuno.

 jQuery(document).ready( function($) {
  $('body').prepend('<h1>Hello world</h1>');
 });

https://wordpress.org/support/topic/add_action-right-after-ltbodygt-tag

5 ott 2014 21:59:52
Commenti

Solo per farti sapere che, con quell'aiuto ho creato questo plugin http://woocomercescratchdiscount.themefantasy.com/

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

Se stai utilizzando Genesis di StudioPress, c'è un hook che puoi usare come quello che utilizzo per i plugin di 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;
}

Questo metodo funziona per me. È essenzialmente la stessa cosa di aggiungere il tuo hook personalizzato, come nella risposta #1 (con cui sono d'accordo sia la migliore).

Tuttavia... se sei come me e crei siti utilizzando qualsiasi template scelto dal cliente, non mi piace aggiungere i miei hook in quel modo. Mantengo tutto il mio codice in una directory separata e lo collego al functions.php. Quindi, utilizzerei la soluzione jQuery per aggiungerlo al DOM dopo il caricamento.

Comunque, ho testato l'idea di Ralf912 con l'output buffer. È molto interessante. Direi che, se hai bisogno di assicurarti che il tuo codice venga eseguito correttamente e sulla stessa pagina e che debba essere assolutamente presente, senza dover modificare il template, questa è una buona idea.

18 nov 2016 02:11:41
4

Puoi creare un plugin basato su JavaScript che utilizza prependTo per posizionare un tag subito dopo il tag body iniziale. Dai un'occhiata qui per un riferimento.

21 nov 2012 00:28:59
Commenti

E se il visitatore del sito ha disabilitato JavaScript?

Ralf912 Ralf912
21 nov 2012 01:38:21

Questo è l'hack più hackeroso di sempre :p

Nippysaurus Nippysaurus
21 nov 2012 01:53:21

@Nippysaurus Infatti (+1), ma l'output buffering non è certo meglio.

kaiser kaiser
21 nov 2012 02:41:40

@kaiser Pensi al buffering dell'output annidato. Questo a volte è un po' complicato. Usare il buffering dell'output con una callback non è così complicato perché la callback verrà chiamata su ogni chiamata della funzione ob_ e prima della chiamata della funzione ob_.

Ralf912 Ralf912
21 nov 2012 21:56:37
0

Sì, è abbastanza semplice:

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 prima funzione registrerà una callback per il buffering dell'output. La seconda funzione è la callback e modificherà e restituirà l'HTML. Si prega di leggere il manuale PHP sul buffering dell'output per maggiori informazioni.

21 nov 2012 01:34:10