如何从WooCommerce的订单商品中获取购物车商品密钥

问题描述 投票:1回答:1

我已经在购物车中为产品创建了产品附加组件。我将每个产品与保存到文件系统的图像相关联,因此当您查看订单时,可以看到使用该产品创建的图像。

order with image association

保存图像后,购物车项目会获得自定义键。此自定义键在Cookie中使用,以通过结帐过程携带图像的路径

if (!function_exists('force_individual_cart_items')) {
    function force_individual_cart_items( $cart_item_data, $product_id ){
      $unique_cart_item_key = md5( microtime().rand() );
      $cart_item_data['unique_key'] = $unique_cart_item_key;

        if (isset($_COOKIE['CustomImagePath'])) {// if image path exists that needs to be saved
            $imagePath = $_COOKIE['CustomImagePath']; // get image path
            $imagePaths = (isset($_COOKIE['ImagePaths']) ? json_decode(stripslashes(html_entity_decode($_COOKIE['ImagePaths'])), true) : array());
            $imagePaths[$unique_cart_item_key] = $imagePath; //asscoiate image path with product cart key
            setcookie('ImagePaths', json_encode($imagePaths),0,'/'); // save association in image paths cookie
            unset($_COOKIE['CustomImagePath']);
            setcookie('CustomImagePath', null, -1, '/');
        }
      return $cart_item_data;
    }
}
add_filter( 'woocommerce_add_cart_item_data','force_individual_cart_items', 10, 2 );


创建订单后,我将新行添加到woocommerce_item_meta表中,并带有“自定义图像”的meta_key。我遇到的问题是将订单商品与cart_item_key相关联。(在woocommerce_thankyou挂钩中)

        global $wpdb, $wp;
        $query = "SELECT order_item_id FROM wp_woocommerce_order_items WHERE order_id = $order_id";
        $result = $wpdb->get_results($query, true);
        $imagePaths = json_decode(stripslashes(html_entity_decode($_COOKIE['ImagePaths'])), true);

        foreach ($result as $order_item) {
            $item_id = $order_item->order_item_id;
        }
        $cart_item_custom_key = NOT AVAILABLE IN THE ORDER ITEM
        $filePath = $_COOKIE[$cart_item_custom_key];
        $wpdb->insert('wp_woocommerce_order_itemmeta', array('order_item_id'=>$post->ID, "meta_key"=>'Custom Image', 'meta_value'=>$filePath))

例如,假设用户选择了3张图片。在购物车中,第一个产品的自定义键为1,第二个产品的自定义键为2,第三个产品的自定义键为3。$woocommerce->cart->get_cart_contents()[cart_item_key]['unique_key'];我可以在访问购物车时获得该唯一密钥。但是,一旦创建订单,order_item就没有该密钥。一阶,二阶和三阶不再具有自定义键。因此,我无法从具有关联密钥的cookie中获取图像。

$filePath = $_COOKIE[ ? KEY NO LONGER EXISTS ? ];
$wpdb->insert('wp_woocommerce_order_itemmeta', array('order_item_id'=>$post->ID, "meta_key"=>'Custom Image', 'meta_value'=>$filePath));

有一种方法可以检索该购物车商品所具有的密钥,因为订单商品似乎没有它?

php wordpress woocommerce cart orders
1个回答
0
投票

如果只需要获取购物车商品密钥,请使用以下方式将其另存为自定义隐藏订单商品元数据

add_action('woocommerce_checkout_create_order_line_item', 'save_cart_item_key_as_custom_order_item_metadata', 10, 4 );
function save_cart_item_key_as_custom_order_item_metadata( $item, $cart_item_key, $values, $order ) {
    // Save the cart item key as hidden order item meta data
    $item->update_meta_data( '_cart_item_key', $cart_item_key );
}

代码进入您的活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。

要获得此购物车商品密钥,您将使用类似以下商品的订单商品:

// Get the WC_Order Object from order ID (if needed)
$order = wc_get_order( $order_id );

// Loop though order items
foreach ( $order->get_items() as $item ){
    // Get the corresponding cart item key
    $cart_item_key = get_meta( '_cart_item_key' );
}

我的意见:您正在使事情变得比应有的复杂得多……

1]最好不要使用Cookie,而最好使用WC_Sessions(如果确实需要这样做)。但是最好在产品页面上在隐藏的输入字段中添加所有必需的数据 ...

2)当通过woocommerce_add_cart_item_data(因此不需要cookie或其他东西)将产品添加到购物车时,最好将all必需数据设置为自定义购物车项目数据。

3)另外,出于多种原因,您也不应该使用woocommerce_thankyou操作挂钩添加订单项自定义元数据,因为它具有专门的挂钩:创建订单后,您可以使用woocommerce_checkout_create_order_line_item操作挂钩保存您的< [自定义购物车商品数据作为订单商品元数据。

例如,使用您提供的代码,我无能为力。
© www.soinside.com 2019 - 2024. All rights reserved.