Как автоматически изменить статус продукта с черновика на опубликованный при изменении количества на складе с 0 на 1

Вопрос или проблема

Как автоматически изменить статус товара с черновика на опубликованный, когда количество на складе изменяется с 0 на 1? Я пытаюсь скрыть недоступные товары.

Это поможет?

add_action( 'save_post_product', 'sew_chg_status', 10,2 );
function sew_chg_status( $post_id, $post ){
    $product = new WC_Product( $post_id ); // создаем продукт WC с данными поста
    if ( 0 < $_POST['_stock'] ){ // если данные о запасах от WC строго больше 0
        $product->set_status( 'publish' ); // меняем статус товара
    }
}

$args = array(
    'post_type'      => 'product',
    'posts_per_page' => -1,
    'post_status'    => 'draft',
    'fields'         => 'ids', // дублируем - не назначено
    'meta_query'     => array(
        array(

            'key'    => '_stock_status',
            'value'  => 'instock',
        )

    ),
);

$loop_arg            = new WP_Query( $args );

$loop_ids            = $loop_arg->posts;

foreach($loop_ids as $loop      => $loop_id){
   
    wp_update_post( array( 'ID' => $loop_id, 
                  'post_status' => 'publish' ) );
    wp_reset_query();
    echo "<script>console.log('Обновление товара с черновика на опубликованный');</script>";
}

Ответ или решение

Для автоматической смены статуса товара с "черновик" (draft) на "опубликованный" (published) при изменении количества на складе с 0 на 1 в WooCommerce, вы можете использовать хук save_post_product. Ниже представлен полный код, который решает вашу задачу.

  1. Добавление функции, которая изменяет статус товара:
add_action( 'save_post_product', 'change_product_status_on_stock_update', 10, 2 );

function change_product_status_on_stock_update( $post_id, $post ) {
    // Проверяем, есть ли данные о запасах
    if ( isset( $_POST['_stock'] ) ) {
        $stock_quantity = intval( $_POST['_stock'] ); // Получаем количество на складе

        // Если количество на складе больше нуля
        if ( $stock_quantity > 0 ) {
            $product = new WC_Product( $post_id ); // Создаем объект товара
            $product->set_status( 'publish' ); // Меняем статус товара на 'опубликованный'
            $product->save(); // Сохраняем изменения
        }
    }
}
  1. Обновление статуса всех черновиков при наличии на складе:

Если вы хотите обновить статус всех товаров с черновика на опубликованный, если их количество на складе больше 0, используй следующий код:

function update_draft_products_to_published() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'draft',
        'fields'         => 'ids',
        'meta_query'     => array(
            array(
                'key'   => '_stock_status',
                'value' => 'instock',
            ),
        ),
    );

    $products = new WP_Query( $args );

    if ( $products->have_posts() ) {
        foreach ( $products->posts as $product_id ) {
            wp_update_post( array(
                'ID'          => $product_id,
                'post_status' => 'publish'
            ) );
            // Выводим сообщение в консоль для отладки
            echo "<script>console.log('Товар обновляется с черновика на опубликованный');</script>";
        }
    }
}
  1. Запустите обновление после сохранения:

Если вы хотите, чтобы эта функция выполнялась автоматически при загрузке страницы администрирования WooCommerce, добавьте следующий хук (например, на странице плагинов):

add_action( 'admin_init', 'update_draft_products_to_published' );

Эти куски кода позволят вам автоматически изменять статус товара из черновика в опубликованный, когда он становится доступным на складе. Обязательно тестируйте изменения на тестовом сайте, прежде чем применять их в рабочей среде.

Оцените материал
Добавить комментарий

Капча загружается...