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

ОТВЕТ

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

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

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

add_filter( ‘woocommerce_add_cart_item_data’, ‘add_custom_cart_item_data’, 10, 3);

functionadd_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_Order_Item_Product set_product_id() метод для сохранения вашего CTP Id в качестве идентификатора продукта, например:

Проснувшись однажды утром после беспокойного сна, Грегор Замза обнаружил, что он у себя в постели превратился в страшное насекомое.

add_action( ‘woocommerce_checkout_create_order_line_item’, ‘save_cpt_id_to_order_item_data’);

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 ) {

        // Set the product ID

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

functionaction_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_product_id(); // Get the CTP ID

 

        // Your code goes here

    }

}

или

add_action( ‘woocommerce_order_status_changed’, ‘action_order_status_changed_callback’);

functionaction_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_product_id(); // Get the CTP ID

 

           // Your code goes here

        }

    }

}