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

时间:2016-03-15 11:59:57

标签: php wordpress woocommerce metadata

我正在为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);

}

问题是,每次都返回NULL。我创建了下面的代码,看看$ _POST的值是什么,它带来了'array(0){}'

function debugthing( $content ) {
    $content .=var_dump($_POST);
    return $content;
    die();
}
add_filter( 'the_content', 'debugthing' );

我已经筋疲力尽了所有关于造成这种情况的想法。有人可以帮忙吗?

$ _ POST,甚至php://输入返回一个空数组或绝对没有。

2 个答案:

答案 0 :(得分:2)

  1. woocommerce_before_checkout_form不是添加输入字段的右钩子。因为这个钩子在表格之外。这解释了为什么您在$_POST
  2. 上获得空值
  3. 使用form-checkout.php#L35
  4. <form内的任何一个钩子
  5. 致电woocommerce_form_field以添加字段...
  6. 接下来你需要挂钩process_checkout()函数。
    一个。 woocommerce_after_checkout_validation - 用于输入验证...
    woocommerce_checkout_order_processed - 创建订单,添加元数据...

  7. // 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....
    }
    

答案 1 :(得分:0)

像这样更改你的钩子优先级。

    add_action( 'woocommerce_checkout_update_order_meta', 'add_input_meta', 99, 2 );