Php 在订单中添加到购物车自定义字段数据

Php 在订单中添加到购物车自定义字段数据,php,wordpress,woocommerce,cart,orders,Php,Wordpress,Woocommerce,Cart,Orders,在WooCommerce中,当产品添加到cookie中的购物车时,我将设置一个自定义字段: add_action( 'init', 'wpcd_set_cookie', 1 ); function wpcd_set_cookie() { if(isset( $_POST[ 'idp' ] ) ) : $cookie_value = sanitize_text_field( $_POST[ 'idp' ] ); setcookie( 'idp', $cook

在WooCommerce中,当产品添加到cookie中的购物车时,我将设置一个自定义字段:

add_action( 'init', 'wpcd_set_cookie', 1 );
function wpcd_set_cookie() {
    if(isset( $_POST[ 'idp' ] ) ) :
        $cookie_value = sanitize_text_field( $_POST[ 'idp' ] );
        setcookie( 'idp', $cookie_value, time() + (86400 * 999), '/' ); // 86400 = 1 day            
        header("Refresh:0");            
    endif;
}
cookie设置正确,但我无法在此挂钩中获取其值:

add_action('woocommerce_order_status_completed', 'ustanovka_oplaty');
function ustanovka_oplaty( $order_id) {

    $idp = isset( $_COOKIE['idp'] ) ? $_COOKIE['idp'] : 'not set';

    // this $idp = 'not set ' why?  

    add_post_meta($order_id, 'wpcf-idvopros', $idp, true);
}
为什么?

我如何解决这个问题


编辑-我的表单将产品添加到购物车:


回答原因:

这是因为cookie设置在客户端(在客户浏览器中)。
woocommerce\u order\u status\u completed
是后端woocommerce进程,无法访问该cookie数据

现在您应该忘记cookies并使用以下代码:

1) 在购物车项目中保存“idp”自定义字段值

add_filter( 'woocommerce_add_cart_item_data', 'save_custom_product_field_in_cart', 10, 2 );
function save_custom_product_field_in_cart( $cart_item_data, $product_id ) {
    if( isset( $_POST['idp'] ) )
        $cart_item_data[ 'idp' ] = sanitize_text_field($_POST['idp']);

    return $cart_item_data;
}
2) 在订单元数据中保存“idp”自定义字段值(暂时):

3) 要完成此操作,请重新访问函数:

add_action('woocommerce_order_status_completed', 'ustanovka_oplaty');
function ustanovka_oplaty( $order_id) {

    $idp = get_post_meta( $order_id, '_idvopros_temp', true );
    if ( ! empty( $idp ) ) {
        update_post_meta($order_id, 'wpcf-idvopros', $idp );
        delete_post_meta($order_id, '_idvopros_temp' );
    }
}

这应该可以工作

@pan1ka您何时和/或在哪里发布自定义字段中的
'idp'
值?@LoicTheAztec。。幸运的是,你是这方面的专家,似乎可以帮助pan1ka解决问题。我对这个问题进行了审查,并根据措辞发现了相似之处。@LoicTheAztec在用户将产品添加到购物车后,我设置为“idp”。正常情况下会记录正确的值,如果查看订单擦除上的cookie,则“idp”设置正确。但是,在函数内部,值“idp”返回为“not set”。@LoicTheAztec看起来$\u COOKIE在我的钩子中不起作用,但我不明白为什么。@LoicTheAztec您不理解我,我在向自定义订单字段写入数据方面没有问题。成功付款后,我无法传输产品添加到订单的页面ID的值。如何在woocommerce\u order\u status\u completed action hook中获取此数据?添加操作(“商业、订单、状态、完成”、“ustanovka操作”);函数ustanovka_oplaty($order_id){$target_product_id=429;foreach($order_id->get_order()as$key=>$value){if($value['product_id']==$target_product_id){$idp=$value['idp'];}这是真代码吗?
add_action('woocommerce_order_status_completed', 'ustanovka_oplaty');
function ustanovka_oplaty( $order_id) {

    $idp = get_post_meta( $order_id, '_idvopros_temp', true );
    if ( ! empty( $idp ) ) {
        update_post_meta($order_id, 'wpcf-idvopros', $idp );
        delete_post_meta($order_id, '_idvopros_temp' );
    }
}