Как получить ключ элемента корзины из позиции заказа в WooCommerce - PullRequest
1 голос
/ 30 сентября 2019

Я создал дополнительные продукты для продуктов в моей корзине. Я связываю каждый продукт с изображением, сохраненным в файловой системе, поэтому при просмотре заказа вы можете увидеть изображение, созданное с продуктом.

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 с мета-ключом «Пользовательское изображение». ». Проблема, с которой я сталкиваюсь, связана с привязкой позиции заказа к 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. 3. Используя $woocommerce->cart->get_cart_contents()[cart_item_key]['unique_key'];, я могу получить этот уникальный ключ, пока у меня есть доступ к корзине. ,Однако, как только заказ создан, у order_item этого ключа нет. Порядок один, два и три больше не имеют пользовательских ключей. Поэтому я не могу получить изображение из куки со связанным ключом.

$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));

есть ли способ получить ключ, который имел этот элемент корзины, потому что элемент заказа, похоже, не имеет его?

1 Ответ

0 голосов
/ 01 октября 2019

Если вам просто нужно , чтобы получить ключ элемента корзины , сохраните его как метаданные пользовательского скрытого заказа , используя:

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

Код входит в функции. 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 крючком (поэтому не нужно печенье или что-то еще) .

3) Также вам не следует использовать ловушку действия woocommerce_thankyou для добавления пользовательских метаданных элемента заказа по многим причинам, поскольку для этого есть специально выделенные ловушки: как только заказ создан, вы можете использовать ловушку действия woocommerce_checkout_create_order_line_item,для сохранения ваших пользовательских данных корзины в качестве метаданных элемента заказа .

С вашим предоставленным кодом я не могу помочь больше, чем, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...