Пользовательские данные о типах сообщений и данные об элементах заказа в WooCommerce

Я использую плагин Диспетчер пользовательских типов записей WooCommerce вместе с WooCommerce, который позволяет использовать пользовательские типы сообщений в качестве продуктов. По большей части это работает довольно хорошо, но я хочу иметь возможность контролировать запасы и вижу проблему. В базе данных под таблицей order_item_meta product_id = 0. Поскольку product_id пуст, невозможно обновить запас по завершенной покупке.

Я знаю, что WooCommerce внесла некоторые изменения в то, где он искал, если post_type был «продуктом», а если нет, некоторые вещи не удались. Мне интересно, есть ли фильтр-хук или другой способ добавить идентификатор продукта с пользовательской функцией при оформлении заказа?

Это функция, которую я пытаюсь создать для управления пользовательским типом инвентаря, мы продаем «места» на мероприятиях. И нет, даже штатный "сток" не работает, наверное по той же причине.

function update_course_seats( $order_id ){
  $order = wc_get_order( $order_id );
  $items = $order->get_items();
  foreach ( $items as $item ) {
    $product_id = $item->get_product_id(); // this returns 0
    if ($product_id != 0) {
      wc_update_order_item_meta( $item, '_seats', 10 ); // example number
    }
  }

//add_action( 'woocommerce_payment_complete', 'update_course_seats');
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
2 371
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала вы должны использовать woocommerce_add_cart_item_data хук действия, чтобы сохранить свой пользовательский тип сообщения (CTP) Идентификатор при добавлении в корзину… Но для этого вам нужно будет отобразить на ваших страницах CTP внутри формы добавления в корзину скрытое поле с CTP. Я хотел бы:

<input type = "hidden" name = "ctpost_id" value = "<?php echo get_the_id(); ?>">

Теперь вы можете добавить эту перехваченную функцию, которая добавит в качестве пользовательских данных элемента корзины ваш идентификатор CTP:

add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 3 );
function add_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ){
    if ( isset( $_POST['ctpost_id'] ) ) {
        $cart_item_data['ctpost_id'] = wc_clean( $_POST['ctpost_id'] );
    }
    return $cart_item_data;
}

Второй хук, который нужно использовать, — это woocommerce_checkout_create_order_line_item хук действия, чтобы добавить метаданные пользовательского заказа (или внести изменения в данные позиции заказа). Этот хук срабатывает перед обработкой платежных шлюзов во время создания заказа.

Вы можете использовать метод WC_dataadd_meta_data(), чтобы сохранить свой идентификатор CTP в качестве пользовательского идентификатора CTP, например:

add_action( 'woocommerce_checkout_create_order_line_item', 'save_cpt_id_to_order_item_data', 10, 4 );
function save_cpt_id_to_order_item_data( $item, $cart_item_key, $cart_item, $order ){
    if ( isset($cart_item['ctpost_id']) && $cart_item['ctpost_id'] > 0 ) {
        // Add the custom CTP post ID
        $item->add_meta_data('_ctpost_id', $cart_item['ctpost_id'] );
    }

    // And here for example you add seats as custom cart item data 
    if ( isset($cart_item['quantity']) ) {
        $item->add_meta_data( 'Seats', $cart_item['quantity'], true );
    }
} 

Когда заказ будет оплачен, вы будете иметь возможность обновлять все необходимое, так как у вас будет ваш идентификатор поста CTP в качестве данных индивидуального заказа.


Затем, наконец, вы можете использовать woocommerce_payment_complete следующим образом:

add_action( 'woocommerce_payment_complete', 'action_payment_complete_callback', 10, 1 );
function action_payment_complete_callback( $order_id ){
    $order = wc_get_order();

    // Loop through order items
    foreach ( $order->get_items() as $item_id => $item ) {
        $ctp_id = $item->get_meta('_ctpost_id'); // Get the CTP post ID

        // Your code goes here
    }
}

Или woocommerce_order_status_changed такие хуки, как:

add_action( 'woocommerce_order_status_changed', 'action_order_status_changed_callback', 10, 4 );
function action_order_status_changed_callback( $order_id, $status_from, $status_to, $order ){
    if ( in_array( $status_to, ['processing','completed'] ) ) {
        // Loop through order items
        foreach ( $order->get_items() as $item_id => $item ) {
            $ctp_id = $item->get_meta('_ctpost_id'); // Get the CTP post ID

            // Your code goes here
        }
    }
}

Связано: Получить элементы заказа и WC_Order_Item_Product в Woocommerce 3.

Это выглядит многообещающе! Я попробую это прямо сейчас. Что касается идентификатора продукта, где у вас есть $values['custom_id'], какой метод я использую, чтобы получить его из идентификатора сообщения? Я предполагаю, что $values ​​будет содержать эту информацию?

RiotAct 10.04.2019 03:42

Другие вопросы по теме