No momento, estou tentando desenvolver um plug-in que incorpore um tour do Google Earth em um post/página WP por meio de um shortcode.
O problema que estou enfrentando é que, para o passeio carregar, eu tenho que adicionar uma onload="init()"
na tag <body>
.
Eu posso modificar um arquivo de modelo específico, mas como isso é para o lançamento, eu preciso adicioná-lo dinamicamente através de um gancho. Alguma ideia?
Fiz um pouco mais de escavação e encontrei uma maneira "melhor" de fazê-lo funcionar (o Google dificulta a inserção de seus Earth Tours, e seu gadget não funciona).
Acabei fazendo um plugin que usa uma combinação de um shortcode e um campo personalizado.
E aqui está uma solução jQuery (como Mike sugeriu em seu primeiro comentário).
function add_my_scripts() {
wp_enqueue_script('jquery');
wp_enqueue_script('my_init_script', SCRIPTSRC, 'jquery', '1.0');
}
add_action('init', 'add_my_scripts');
Em seguida, adicione um script ao seu plug-in que faça isso:
jQuery.noConflict();
jQuery(document).ready(function($) {
init();
}
Isso iniciará o jQuery em nenhum modo de conflito (se já não estiver) e adicionará uma chamada ao método init()
quando o documento estiver pronto. É um método mais seguro de usar que body onready()
porque a função onready()
só pode chamar uma coisa ... então ninguém mais pode ligar nada a isso ou adicionar um script personalizado. É melhor deixar seu plug-in o mais discreto possível, para que outros plug-ins não interfiram ou vice-versa.
Aqui está uma abordagem. Você adicionaria a chamada add_action()
dentro do seu gancho, eu acredito. O JavaScript I include presume que a função init já tenha sido definida. Se não, então isso irá falhar, mas incluir o script parece ser um problema que você já resolveu, se estou entendendo bem. Note que você não precisa necessariamente adicioná-lo a wp_foot
, você pode facilmente adicioná-lo a 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');
?>
Ignorando o potencial para fazer isso com jQuery, uma coisa que você pode fazer é ligar o filtro template_include
e usar ob_start()
com um retorno de chamada. Seu callback pode então fazer uma pesquisa de string em '<body'
e substituí-lo por '<body onload="init()"'
como o código a seguir faz. Você deve ser capaz de soltá-lo diretamente no seu plugin, apenas certifique-se de alterar os nomes para seguir a convenção de nomenclatura do seu 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);
}
Note que eu não presumo que o código acima seja totalmente robusto ainda se eu fosse você. Eu duvido que ele lidará com todos os casos do Edge desde que eu o juntei para responder sua pergunta, mas minimamente ele mostra como realizar o caso normal, e então com algum teste de caso de uso eu tenho certeza que você conseguirá lidar com tudo os casos importantes do Edge (como se o '<BODY'
fosse maiúsculo, etc?)
Aqui está um pouco de JavaScript para adicionar dinamicamente um retorno de chamada ao carregamento da página, com ou sem 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' );
No seu caso, você apenas substituiria o my_onload_callbacks pelo seu método init.