得到通知是 wordpress “WP_Scripts::localize 被错误地调用”

完整消息:注意:WP_Scripts::localize 调用不正确。 $l10n 参数必须是一个数组。要将任意数据传递给脚本,请改用 wp_add_inline_script() 函数。有关更多信息,请参阅 WordPress 中的调试。 (此消息是在 5.7.0 版中添加的。)在 /home3/dduconne/public_html/wp-includes/functions.php 的第 5313 行

在将 wordpress 更新到 5.7.0 后出现

stack overflow Getting notice is wordpress "WP_Scripts::localize was called incorrectly"
原文答案
author avatar

接受的答案

这是 Wordpress 5.7 中出现的新警告。如果您不想看到它,并且仍然希望将 WP_DEBUG 设置为 true,则可以通过在主题的 functions.php 中添加以下示例来禁用该消息:

 add_filter('doing_it_wrong_trigger_error', function () {return false;}, 10, 0);

答案:

作者头像

好的,因为有很多观点,而之前的答案只是把它扔到地毯下。

是的,它现在是一个警告,但谁知道会发生什么,这是一个警告是有原因的,禁用某些东西并不能解决它,开发人员现在将其设置为警告是有原因的。

在我们等待插件开发者最终解决问题的同时,您可以通过在 php.ini 中启用 php_xdebug 来找出问题的根源。我建议不要在调试后离开它,因为我不确定启用它的性能成本。

php_xdebug 将返回所有受影响文件的堆栈,从那里您可以追踪到问题的根源。一旦找到源,修复就很容易了。罪魁祸首很可能是 wp_localize_script() ,它要求最后一个参数是 array()

所以你会发现这样的事情:

wp_localize_script( 'handle', 'object_name', 'l10n_culprit_string' );

应该变成:

wp_localize_script( 'handle', 'object_name', array( 'l10n_culprit_string' ) );

问题的解决方案来自 here

作者头像

如果您使用的是 wp5.7 和 php7.4,现在是一个通知,但更改为 php8 可能会被报告为错误。对我来说,当我(在我自己的代码中)将传递的值更改为数组时(是的,可能在所涉及的 js 中也需要一些更改),一切正常。

作者头像

这是因为您的WordPress安装中的一个PHP脚本之一使用WP_LOCALIZE_SCRIPT()通过AJAX请求将一些PHP变量传递给JS脚本,这不再是好的练习。这可以在插件内,也可以在您的自定义主题或Child-Theme的功能中。如果wp_localize_script()不在儿童主题或自定义主题的函数中,请尝试以下操作:

1.备份您的网站
2.停用所有插件
3.将它们一个一个重新激活,直到您再次收到通知
4.当通知再次显示时,这意味着您刚刚重新激活的插件使用wp_localize_script()错误的方式
5.如果不是最新的,请尝试更新它(如果您愿意):也许通知将消失
6.如果它已经是最新的,或者您不想更新它,请在wp-content/插件中搜索相应的插件文件夹
7.打开它,然后尝试查找调用wp_localize_script()的文件(s),您也可以将CLI与服务器的终端一起使用,以在文件中查找字符串。例如,如果您的服务器在Linux上运行:GREP -H -R“ wp_localize_script()” /root /root /pathtopluginfolder |剪切-D:-F1
8.然后,替换代码如下:

旧的看起来几乎应该这样:

wp_enqueue_script( 'wpdocs-my-script', 'https://url-to/my-script.js' );
wp_localize_script( 'wpdocs-my-script', 'MYSCRIPT', array(
    'ajaxUrl' => admin_url( 'admin-ajax.php' ),
    'otherParam' => 'some value',
) );

新的一个 :

wp_enqueue_script( 'wpdocs-my-script', 'https://url-to/my-script.js' );
wp_add_inline_script( 'wpdocs-my-script', 'const MYSCRIPT = ' . json_encode( array(
    'ajaxUrl' => admin_url( 'admin-ajax.php' ),
    'otherParam' => 'some value',
) ), 'before' );

请注意,您需要在WP_ADD_INLINE_SCRIPT函数中添加“之前”为第三个参数。

完成后,通知不应再显示。如果是这样,请联系插件开发人员以告诉他有关此信息的信息,以便它可以成为下一个更新的一部分。

有关更多信息,请参见Jules Colle在此页面上的评论: https://developer.wordpress.org/reference/functions/wp_add_inline_script/