我目前正在尝试开发一个插件,通过一个短代码将Google Earth Tour嵌入到WP帖子/页面中。
我遇到的问题是,要加载教程,我必须添加onload="init()"
进入<body>
标签
我可以修改特定的模板文件,但由于这是发布版,我需要通过挂钩动态添加它。有什么想法吗?
我目前正在尝试开发一个插件,通过一个短代码将Google Earth Tour嵌入到WP帖子/页面中。
我遇到的问题是,要加载教程,我必须添加onload="init()"
进入<body>
标签
我可以修改特定的模板文件,但由于这是发布版,我需要通过挂钩动态添加它。有什么想法吗?
做了更多的挖掘,找到了一种“更好”的方式让它工作(谷歌让他们该死的地球之旅很难嵌入,而他们的小工具不起作用)。
最后我做了一个plugin 它使用短代码和自定义字段的组合。
这里有一个jQuery解决方案(正如Mike在第一条评论中所建议的)。
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进行此操作的可能性,可以做的一件事是hook the template_include
filter and use 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);
}
请注意,如果我是您,我不会假设上述代码是完全健壮的。我怀疑它是否能处理所有的边缘案例,因为我只是把它放在一起回答你的问题,但它至少向你展示了如何完成正常案例,然后通过一些用例测试,我确信你“能处理所有重要的边缘案例(比如如果\'<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\' );
在您的情况下,只需用init方法替换my\\u onload\\u回调。我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?