it-swarm-ru.tech

Добавление нагрузки к телу

В настоящее время я пытаюсь разработать плагин, который будет встраивать Google Earth Tour в WP пост/страницу с помощью шорткода.

Проблема, с которой я сталкиваюсь, заключается в том, что для загрузки тура мне нужно добавить onload="init()" в тег <body>.

Я могу изменить конкретный файл шаблона, но так как он для релиза, мне нужно добавить его динамически через хук. Есть идеи?

5
Norcross

Еще немного покопался и нашел "лучший" способ заставить его работать (Google затрудняет внедрение их чертовых туров по Земле, а их гаджет не работает).

Я закончил тем, что сделал плагин , который использует комбинацию шорткода и настраиваемого поля.

0
Norcross

А вот и решение jQuery (как предложил Майк в своем первом комментарии).

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

Затем добавьте скрипт в ваш плагин, который делает это:

jQuery.noConflict();

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

Это запустит jQuery в режиме без конфликтов (если это еще не сделано) и добавит вызов метода init(), когда документ будет готов. Этот метод безопаснее использовать, чем body onready(), потому что функция onready() может вызывать только одну вещь ... поэтому никто другой не может подключить что-либо к этому или добавить собственный скрипт. Лучше сделать ваш плагин настолько незаметным, насколько это возможно, чтобы другие плагины не мешали или наоборот.

9
EAMann

Вот подход. Я полагаю, что вы бы добавили вызов add_action() в свой хук. JavaScript, который я включаю, предполагает, что функция init уже определена. Если это не так, то это не удастся, но включение сценария кажется проблемой, которую вы уже решили, если я вас правильно понял. Обратите внимание, что вам не обязательно добавлять его в wp_foot, вы также можете легко добавить его в 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

Не обращая внимания на потенциальную возможность сделать это с помощью jQuery, можно сделать только одну вещь: подключить фильтр template_include и использовать ob_start()с обратным вызовом. Ваш обратный вызов может затем выполнить поиск строки в '<body' и заменить его на '<body onload="init()"', как это делает следующий код. Вы должны иметь возможность добавить его непосредственно в свой плагин, просто не забудьте изменить имена в соответствии с собственным соглашением об именах вашего плагина:

<?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);
}

Обратите внимание, что я не буду считать приведенный выше код полностью надежным на вашем месте. Я сомневаюсь, что он будет обрабатывать все случаи Edge, так как я просто собрал их вместе, чтобы ответить на ваш вопрос, но минимально он покажет вам, как выполнить нормальный случай, а затем, после некоторого тестирования варианта использования, я уверен, что вы получите его, чтобы обработать все важные случаи Edge (например, что, если '<BODY' в верхнем регистре и т. д.?)

2
MikeSchinkel

Вот некоторый JavaScript для динамического добавления обратного вызова к загрузке страницы, с или без 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' );

В вашем случае вы просто замените my_onload_callbacks вашим методом init.

1
Annika Backstrom