В настоящее время я пытаюсь разработать плагин, который будет встраивать Google Earth Tour в WP пост/страницу с помощью шорткода.
Проблема, с которой я сталкиваюсь, заключается в том, что для загрузки тура мне нужно добавить onload="init()"
в тег <body>
.
Я могу изменить конкретный файл шаблона, но так как он для релиза, мне нужно добавить его динамически через хук. Есть идеи?
Еще немного покопался и нашел "лучший" способ заставить его работать (Google затрудняет внедрение их чертовых туров по Земле, а их гаджет не работает).
Я закончил тем, что сделал плагин , который использует комбинацию шорткода и настраиваемого поля.
А вот и решение 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()
может вызывать только одну вещь ... поэтому никто другой не может подключить что-либо к этому или добавить собственный скрипт. Лучше сделать ваш плагин настолько незаметным, насколько это возможно, чтобы другие плагины не мешали или наоборот.
Вот подход. Я полагаю, что вы бы добавили вызов 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');
?>
Не обращая внимания на потенциальную возможность сделать это с помощью 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'
в верхнем регистре и т. д.?)
Вот некоторый 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.