WooCommerce PayPal Pro网关get_post_data函数兼容性警告求助
嘿,我之前帮不少人处理过这类老版本插件的兼容性警告问题,先给你拆解下原因,再给几个靠谱的解决办法:
为啥会出现这个警告?
这是PHP的方法签名兼容性检查在起作用:你用的PayPal Pro PayFlow网关子类WC_Gateway_PayPal_Pro_PayFlow里,get_post_data($order)方法声明带了一个$order参数,但它继承的WooCommerce父类WC_Settings_API里的get_post_data()方法是没有参数的。PHP默认会把这种签名不匹配的情况当成警告打出来,每天几千次确实挺烦人的。
解决方案按优先级来:
1. 优先更新所有相关组件(最推荐)
你当前用的版本都太老了——WordPress 4.9.5、WooCommerce 3.3.5、PayPal Pro网关4.3.3,这些版本的插件在后续更新里几乎肯定已经修复了这个签名不兼容的小问题。
更新前一定要先备份网站文件和数据库,避免出意外。然后按顺序更新:先更WordPress核心,再更WooCommerce,最后更PayPal Pro网关插件。更新完去看错误日志,大概率这个警告就消失了。
2. 手动改代码(没法更新时用)
如果因为某些限制不能更新插件,那可以直接修改网关的代码来修复:
方法A:直接调整子类方法参数
找到PayPal Pro网关插件目录里的includes/class-wc-gateway-paypal-pro-payflow.php文件,找到get_post_data方法的声明:
public function get_post_data($order) { // 原方法里的代码 }
把它改成允许参数可选的形式:
public function get_post_data($order = null) { // 原代码完全不动 }
这样既符合父类的方法签名,又不会影响原有功能——因为实际调用这个方法的时候都会传入$order参数,= null只是为了兼容父类的无参声明。
方法B:用钩子覆盖(更安全,不怕更新丢修改)
要是不想直接改插件文件(毕竟插件更新后修改会丢失),可以在你当前主题的functions.php里加这段代码:
add_action('plugins_loaded', function() { if (class_exists('WC_Gateway_PayPal_Pro_PayFlow')) { // 建一个子类覆盖原方法 class WC_Gateway_PayPal_Pro_PayFlow_Fixed extends WC_Gateway_PayPal_Pro_PayFlow { public function get_post_data($order = null) { return parent::get_post_data($order); } } // 替换掉原来的网关类 remove_action('plugins_loaded', array('WC_Gateway_PayPal_Pro_PayFlow', 'init')); add_action('plugins_loaded', array('WC_Gateway_PayPal_Pro_PayFlow_Fixed', 'init')); } });
这种方式不会碰插件的核心文件,后续插件更新后如果还没修复,这段代码还能继续用;要是更新后问题解决了,删掉这段代码就行。
3. 临时屏蔽警告(不推荐,应急用)
要是你急需先把日志降下来,作为临时过渡,可以改下wp-config.php里的错误报告级别,屏蔽这类警告:
// 替换原来的WP_DEBUG相关配置 define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); // 只报告致命错误和解析错误,屏蔽警告 error_reporting(E_ERROR | E_PARSE);
注意:这只是把警告藏起来了,根本问题没解决,长期用可能会漏掉其他重要错误,所以尽量只当临时救急的办法。
内容的提问来源于stack exchange,提问作者Patrick Moore

