web-dev-qa-db-fra.com

Ajout de surcharge au corps

J'essaie actuellement de développer un plugin qui incorporera une visite Google Earth dans un post/page WP via un shortcode.

Le problème que je rencontre est que, pour que la visite soit chargée, je dois ajouter une onload="init()" à la balise <body>.

Je peux modifier un fichier de modèle spécifique, mais comme il s'agit d'une version, je dois l'ajouter dynamiquement via un hook. Des idées?

5
Norcross

Nous avons creusé un peu plus et avons trouvé un "meilleur" moyen de le faire fonctionner (Google rend difficile l'intégration de leur fichu Earth Tours, et leur gadget ne fonctionne pas).

J'ai fini par créer un plugin qui combine un shortcode et un champ personnalisé.

0
Norcross

Et voici une solution jQuery (comme Mike l’a suggéré dans son premier commentaire).

function add_my_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('my_init_script', SCRIPTSRC, 'jquery', '1.0');
}
add_action('init', 'add_my_scripts');

Ajoutez ensuite un script à votre plug-in qui fait ceci:

jQuery.noConflict();

jQuery(document).ready(function($) {
    init();
}

Cela démarrera jQuery en mode sans conflit (s'il ne l'est pas déjà) et ajoutera un appel à la méthode init() lorsque le document sera prêt. C'est une méthode plus sûre que body onready() car la fonction onready() ne peut appeler qu'une seule chose ... afin que personne d'autre ne puisse y accrocher quoi que ce soit ou ajouter un script personnalisé. Il est préférable de rendre votre plug-in aussi discret que possible afin que les autres plug-ins n'interfèrent pas ou vice-versa.

9
EAMann

Voici une approche. Vous ajouteriez l'appel add_action() dans votre crochet, je crois. Le code JavaScript que j'inclut suppose que la fonction init a déjà été définie. Si ce n'est pas le cas, cela échouera, mais l'inclusion du script semble être un problème que vous avez déjà résolu si je vous comprends bien. Notez que vous n'avez pas nécessairement besoin de l'ajouter à wp_foot, vous pouvez aussi l'ajouter facilement à wp_head:

<?php

function mypluginprefix_onload_init() { ?>
<script language="text/javascript">
// check for the standards-compliant way to add onload events
if ( typeof(window.addEventListener) !== 'undefined' )
    window.addEventListener( "load", init, false );
// or the older msie nonstandard way
else if ( typeof(window.attachEvent) !== 'undefined' ) {
    window.attachEvent( "onload", init );
}
</script>
<?php }

// this goes in your hook
add_action('wp_foot', 'mypluginprefix_onload_event');
?>
4
artlung

En ignorant la possibilité de faire cela avec jQuery, vous pouvez: accrocher le filtre template_include et utiliser ob_start()avec un rappel. Votre rappel peut alors effectuer une recherche de chaîne sur '<body' et le remplacer par '<body onload="init()"' comme le fait le code suivant. Vous devriez pouvoir le déposer directement dans votre plugin. Assurez-vous simplement de changer les noms pour suivre la convention de nommage de votre plugin:

<?php
add_filter('template_include','start_buffer_capture',1);
function start_buffer_capture($template) {
  ob_start('end_buffer_capture');  // Start Page Buffer
  return $template;
}
function end_buffer_capture($buffer) {
  return str_replace('<body','<body onload="init()"',$buffer);
}

Notez que je ne supposerais pas que le code ci-dessus soit totalement robuste si je vous étais. Je doute que tous les cas Edge soient pris en charge, car je viens de l'assembler pour répondre à votre question, mais cela vous montre au minimum comment réaliser le cas normal. Ensuite, avec quelques tests de cas d'utilisation, je suis sûr que vous saurez tout gérer les cas Edge importants (comme ce qui se passe si '<BODY' est en majuscule, etc.?)

2
MikeSchinkel

Voici du code JavaScript pour ajouter dynamiquement un rappel au chargement de la page, avec ou sans jQuery:

function add_onload() {
    ?>
    <script type="text/javascript">
    my_onload_callback = function() { alert('Hello!'); }; // test function

    if( typeof jQuery == "function" ) { 
        jQuery(my_onload_callback); // document.ready
    } else {
        document.getElementsByTagName('body')[0].onload = my_onload_callback; // body.onload
    }
    </script>
    <?php
}
add_action( 'wp_footer', 'add_onload' );

Dans votre cas, il vous suffirait de remplacer my_onload_callbacks par votre méthode init.

1
Annika Backstrom