woocommerce版本:Version: 9.8.1
在my-account页面,编辑账单地址后,保存时,触发错误:
Warning: Undefined variable $field_values in C:\wamp64\www\html\wp-content\plugins\woocommerce\src\Blocks\Domain\Services\CheckoutFieldsFrontend.php on line 319

/**
* Get posted additional field values.
*
* @param string $location The location to get fields for.
* @param string $group The group to get fields for.
* @param boolean $sanitize Whether to sanitize the field values.
* @return array The posted field values and sanitized field values.
*/
protected function get_posted_additional_field_values( $location, $group, $sanitize = true ) {
$additional_fields = $this->checkout_fields_controller->get_fields_for_location( $location );
// phpcs:disable WordPress.Security.NonceVerification.Missing
foreach ( $additional_fields as $field_key => $field_data ) {
$post_key = CheckoutFields::get_group_key( $group ) . $field_key;
$field_values[ $field_key ] = wc_clean( wp_unslash( $_POST[ $post_key ] ?? '' ) );
if ( $sanitize ) {
$field_values[ $field_key ] = $this->checkout_fields_controller->sanitize_field( $field_key, $field_values[ $field_key ] );
}
}
// phpcs:enable WordPress.Security.NonceVerification.Missing
return $field_values;
}
分析代码,是获取$additional_fields时为空,导致foreach直接跳过,造成$field_values为定义就直接返回,因此触发页面报错。
$additional_fields代表自定义额外字段,例如商家添加的自定义表单字段(如公司税号、特殊说明等)。
这应该是woo插件bug吧,我先自己修复下,到时随官方解决bug再更新。
protected function get_posted_additional_field_values( $location, $group, $sanitize = true ) {
$additional_fields = $this->checkout_fields_controller->get_fields_for_location( $location );
// bug修复
// 如果没有额外字段,直接返回空数组
if ( empty( $additional_fields ) ) {
return array();
}
$field_values = array();
// phpcs:disable WordPress.Security.NonceVerification.Missing
foreach ( $additional_fields as $field_key => $field_data ) {
$post_key = CheckoutFields::get_group_key( $group ) . $field_key;
$field_values[ $field_key ] = wc_clean( wp_unslash( $_POST[ $post_key ] ?? '' ) );
if ( $sanitize ) {
$field_values[ $field_key ] = $this->checkout_fields_controller->sanitize_field( $field_key, $field_values[ $field_key ] );
}
}
// phpcs:enable WordPress.Security.NonceVerification.Missing
return $field_values;
}