如何从输入框添加到订单元数据?
How can I add to the order meta from input boxes?
我正在为 wordpress 和 woocommerce 创建一个插件。在我的插件中,我使用代码 'woocommerce_before_checkout_form' 在结帐表单上方插入了一个输入框。订单完成后,我希望能够将该输入的值添加到订单的元数据中。为此,我在插件的 functions.php 文件中创建了这段代码:
add_action( 'woocommerce_checkout_update_order_meta', 'add_input_meta', 1, 2 );
function add_input_meta( $order_id, $posted ) {
$inputsData = $_POST['InputBox'];
update_post_meta( $order_id, 'my_key', $inputsData);
}
问题是,它 return 每次都是 NULL。我创建了下面的代码来查看 $_POST 的值,它得出了 'array(0) { }'
function debugthing( $content ) {
$content .=var_dump($_POST);
return $content;
die();
}
add_filter( 'the_content', 'debugthing' );
关于造成这种情况的原因,我已经想尽所有办法。有人可以帮忙吗?
$_POST,甚至 php://input return 一个空数组或者什么都没有。
像这样更改挂钩优先级。
add_action( 'woocommerce_checkout_update_order_meta', 'add_input_meta', 99, 2 );
woocommerce_before_checkout_form
不是添加输入字段的正确钩子。因为这个钩子在表格之外。这解释了为什么你在 $_POST
上得到 null
- 使用
<form
in form-checkout.php#L35 中的任何钩子
- 调用
woocommerce_form_field
添加字段...
- 接下来是你需要在
process_checkout()
函数中挂钩。
一种。 woocommerce_after_checkout_validation
- 用于输入验证...
b. woocommerce_checkout_order_processed
- 已创建订单,添加元数据...
// add form fields
add_action( 'woocommerce_checkout_before_customer_details', 'woocommerce_checkout_before_customer_details' );
function woocommerce_checkout_before_customer_details() {
$args = array(
'type' => 'text',
'label' => 'My Custom field',
'description' => 'This is custom field',
'placeholder' => '',
'required' => true,
);
woocommerce_form_field( 'InputBox' , $args ); // you can call woocommerce_form_field as many as you want...
}
// validate your form field(s)
add_action( 'woocommerce_after_checkout_validation', 'woocommerce_after_checkout_validation' );
function woocommerce_after_checkout_validation() {
// $_POST['InputBox'] will be visible here...
// do your validations here... forget this hook if you don't need to validate...
// wc_add_notice( __( 'Invalid message!', 'woocommerce' ), 'error' );
// call wc_add_notice if you want to invalidate the form.
}
add_action( 'woocommerce_checkout_order_processed', 'woocommerce_checkout_order_processed' );
function woocommerce_checkout_order_processed( $order_id ) {
// we now have $order_id, you can now add your meta data....
}
我正在为 wordpress 和 woocommerce 创建一个插件。在我的插件中,我使用代码 'woocommerce_before_checkout_form' 在结帐表单上方插入了一个输入框。订单完成后,我希望能够将该输入的值添加到订单的元数据中。为此,我在插件的 functions.php 文件中创建了这段代码:
add_action( 'woocommerce_checkout_update_order_meta', 'add_input_meta', 1, 2 );
function add_input_meta( $order_id, $posted ) {
$inputsData = $_POST['InputBox'];
update_post_meta( $order_id, 'my_key', $inputsData);
}
问题是,它 return 每次都是 NULL。我创建了下面的代码来查看 $_POST 的值,它得出了 'array(0) { }'
function debugthing( $content ) {
$content .=var_dump($_POST);
return $content;
die();
}
add_filter( 'the_content', 'debugthing' );
关于造成这种情况的原因,我已经想尽所有办法。有人可以帮忙吗?
$_POST,甚至 php://input return 一个空数组或者什么都没有。
像这样更改挂钩优先级。
add_action( 'woocommerce_checkout_update_order_meta', 'add_input_meta', 99, 2 );
woocommerce_before_checkout_form
不是添加输入字段的正确钩子。因为这个钩子在表格之外。这解释了为什么你在$_POST
上得到 null
- 使用
<form
in form-checkout.php#L35 中的任何钩子
- 调用
woocommerce_form_field
添加字段... - 接下来是你需要在
process_checkout()
函数中挂钩。
一种。woocommerce_after_checkout_validation
- 用于输入验证...
b.woocommerce_checkout_order_processed
- 已创建订单,添加元数据...
// add form fields
add_action( 'woocommerce_checkout_before_customer_details', 'woocommerce_checkout_before_customer_details' );
function woocommerce_checkout_before_customer_details() {
$args = array(
'type' => 'text',
'label' => 'My Custom field',
'description' => 'This is custom field',
'placeholder' => '',
'required' => true,
);
woocommerce_form_field( 'InputBox' , $args ); // you can call woocommerce_form_field as many as you want...
}
// validate your form field(s)
add_action( 'woocommerce_after_checkout_validation', 'woocommerce_after_checkout_validation' );
function woocommerce_after_checkout_validation() {
// $_POST['InputBox'] will be visible here...
// do your validations here... forget this hook if you don't need to validate...
// wc_add_notice( __( 'Invalid message!', 'woocommerce' ), 'error' );
// call wc_add_notice if you want to invalidate the form.
}
add_action( 'woocommerce_checkout_order_processed', 'woocommerce_checkout_order_processed' );
function woocommerce_checkout_order_processed( $order_id ) {
// we now have $order_id, you can now add your meta data....
}