【问题标题】:Get added to cart custom field data in WooCommerce order在 WooCommerce 订单中添加到购物车自定义字段数据
【发布时间】:2018-06-30 12:52:08
【问题描述】:

在 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);
}

为什么?

我该如何解决这个问题?


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

<form action="<?php the_permalink(); ?>" id="PaySumForm" method="post">

    <input type="hidden"  name="idp" id="idp" value="<?php echo $post->ID; ?>" class="required requiredField " />

    <button type="contsubmit" class="payb qbutton">buy</button>

</form>

【问题讨论】:

  • @pan1ka 您何时和/或在何处发布自定义字段中的 'idp' 值?
  • @LoicTheAztec.. 幸运的是,您是这方面的专家,似乎可以帮助 pan1ka。我有这个问题需要审核,并根据其措辞发现了相似之处。
  • @LoicTheAztec 在用户将产品添加到购物车后,我设置了“idp”。正确的值被正常记录,如果您查看订单擦除上的 cookie,则“idp”设置正确。但是,在函数内部,值“idp”返回为“未设置”。
  • @LoicTheAztec 似乎 $ _COOKIE 在我的钩子中不起作用,但我不明白为什么。
  • @LoicTheAztec 你不明白我的意思,我将数据写入自定义订单字段没有问题。成功付款后,我无法将添加产品的页面 ID 的值转移到订单中。

标签: php wordpress woocommerce cart orders


【解决方案1】:

回答原因:

这是因为在客户端设置了一个 cookie(在客户浏览器中)woocommerce_order_status_completed 是一个后端 Woocommerce 进程,无法访问该 cookie 数据。

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

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”自定义字段值(临时):

add_action( 'woocommerce_checkout_update_order_meta', 'save_idvopros_as_order_meta', 10, 3 );
function save_idvopros_as_order_meta( $order_id, $data ) {
    foreach(WC()->cart->get_cart() as $cart_item)
        $idp = empty($cart_item['idp']) ? 'no' : $cart_item['idp'];
    update_post_meta($order_id, '_idvopros_temp', $idp, true);
}

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' );
    }
}

这应该可以工作

【讨论】:

  • 如何在 woocommerce_order_status_completed 动作挂钩中获取这些数据? add_action('woocommerce_order_status_completed', 'ustanovka_oplaty');功能 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'] ; } } 这是真正的代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2018-06-08
  • 2017-10-14
  • 2018-05-18
  • 2019-10-15
  • 2021-01-21
  • 2018-05-31
相关资源
最近更新 更多