命名空间下将WooCommerce逻辑移入类后$order_id失效问题
问题分析与修复
你类里的add_action调用格式错了,这才是功能失效的核心原因,跟$order_id无关。
错误根源
原init方法里的add_action写法不符合WordPress语法:
add_action( 'woocommerce_checkout_update_order_meta', array( __CLASS__, 'checkout_review_order_custom_field_update',10,1));
add_action的回调数组只需要包含类名和方法名,优先级(第3参数)、接受的参数个数(第4参数)是独立传递的,不能塞进回调数组里,这导致钩子根本没正确绑定到你的类方法。
修正后的完整代码
namespace ecpay_logistics; class SELECTABLE_LOGISTICS { public static function init(){ // 正确写法:回调数组仅存类与方法,优先级、参数个数单独传递 add_action( 'woocommerce_checkout_update_order_meta', array( __CLASS__, 'checkout_review_order_custom_field_update' ), 10, 1); } public static function checkout_review_order_custom_field_update( $order_id ) { // 增加安全判断与输入过滤,避免直接使用$_POST的风险 if ( isset( $_POST['my_split_checkbox'] ) ) { update_post_meta( $order_id, 'my_split_checkbox', sanitize_text_field( $_POST['my_split_checkbox'] ) ); } } } SELECTABLE_LOGISTICS::init();
额外调试&优化建议
- 可以在方法里加
error_log( $order_id );或者var_dump($_POST['my_split_checkbox']);,验证参数是否正常传递,快速排查问题。 - 直接使用
$_POST存在安全隐患,用sanitize_text_field过滤输入能提升安全性,还能避免未定义索引的PHP警告。 - 确认命名空间
ecpay_logistics的范围正确,没有和其他代码产生冲突。
内容的提问来源于stack exchange,提问作者Cooper
相关产品推荐
相关产品推荐

