如何从输入框添加到订单元数据?

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 );
  1. woocommerce_before_checkout_form 不是添加输入字段的正确钩子。因为这个钩子在表格之外。这解释了为什么你在 $_POST
  2. 上得到 null
  3. 使用 <form in form-checkout.php#L35
  4. 中的任何钩子
  5. 调用woocommerce_form_field添加字段...
  6. 接下来是你需要在 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....
}