解决函数WP_Scripts::localize的调用方法不正确问题

nZone 2023年7月20日更新于1 年前 共868字 18行代码 预计4分钟 评论 104
阿里云折扣】服务器活动对比【腾讯云秒杀

最近居然都沉浸在调试优化主题代码中,上次解决已弃用调用函数has_cap时使用的参数问题,这次的错误提示更棘手:

Notice: 函数 WP_Scripts::localize 的调用方法不正确。 $l10n参数必须是一个数组。若要将任意数据传递给脚本,请改用wp_add_inline_script()函数。 请查阅https://wordpress.org/documentation/article/debugging-in-wordpress 调试WordPress来获取更多信息。 (这个消息是在5.7.0版本添加的。) in www.nzonex.com\wp-includes\functions.php on line 5865

这个问题问ChatGPT,思路也是找函数 WP_Scripts::localize,搜索整个主题文件根本没有这个函数,系统文件\wp-includes\functions.wp-scripts.php里是有个,但还是注释的。搜索关键词10n,一个媒体上传的文件,根本就不是问题所在。

其实正确的函数应该是:wp_localize_script,在WordPress中,WP_Scripts::localize函数是一个内部函数,实际上并不是直接可调用的全局函数。它是由wp_localize_script函数调用的内部方法。在wp_localize_script函数中,会创建一个WP_Scripts对象并调用其localize方法来添加本地化脚本(Localize Script)。之前搜索到很多,把代码修正,要么问题依旧,要么又出新问题。

百度无果。谷歌翻到WordPress论坛里说的都是插件问题,我把插件目录改了,也是一样,这之前试过把插件全禁也是一样,我是很肯定是主题文件问题,之前没有关注错误提示的位置,今天思路是看源代码,先找到错误位置,不用先改,而是直接删除,这能快速排查。

WP_Scripts::localize错误原因

首先定位到header.php头部文件,把wp_head();这行删掉,错误没了,当然,内容也没了。因为是文章页才有这个问题,目录页首页都是没有,但查文章页只是模板,没什么问题。于是查wp_head关键词,重点排查inc目录下的这几个文件:config.php、function.php,以及inc.php。

不断删除排查,功夫不负有心人,终于在function.php文件中排查到这段代码:

if ( is_singular() ) {
wp_enqueue_script( 'fancybox', get_template_directory_uri() . '/js/fancybox.js', array(), version, true);

if (zm_get_option('no_admin')) {
wp_localize_script( 'script', 'wpl_ajax_url', get_template_directory_uri() . '/inc/admin-ajax.php');

} else {
wp_localize_script( 'script', 'wpl_ajax_url', admin_url() . "admin-ajax.php");
}
}

这段删掉,那错误提示没了,预感这个代码如果修正,问题应该就能解决。修正如下:

if ( is_singular() ) {
wp_enqueue_script( 'fancybox', get_template_directory_uri() . '/js/fancybox.js', array(), '1.0.0', true);

$ajax_url = zm_get_option('no_admin') ? get_template_directory_uri() . '/inc/admin-ajax.php' : admin_url('admin-ajax.php');

$script = 'var wpl_ajax_url = "' . esc_url( $ajax_url ) . '";';
wp_add_inline_script( 'fancybox', $script );
}

在这个修正后的代码中,首先定义了$ajax_url变量,用于根据zm_get_option('no_admin')的值选择不同的URL。然后,使用wp_add_inline_script()函数将wpl_ajax_url变量以内联脚本的形式传递给fancybox脚本。这样可以避免使用wp_localize_script()并正确地传递数据给脚本。

这么改完保存,问题解决了,这段代码根本就没有$l10n这个关键词参数,反而有点被提示误导了。解决问题还是要找到问题症结所在,不然忙乎半天,跟无头苍蝇一样,到处乱窜,问题还没解决,没有比这更让人苦恼的事了。

weinxin
公众号
闹着玩下网
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: