Вопрос или проблема
Как автоматически изменить статус товара с черновика на опубликованный, когда количество на складе изменяется с 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
. Ниже представлен полный код, который решает вашу задачу.
- Добавление функции, которая изменяет статус товара:
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(); // Сохраняем изменения
}
}
}
- Обновление статуса всех черновиков при наличии на складе:
Если вы хотите обновить статус всех товаров с черновика на опубликованный, если их количество на складе больше 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>";
}
}
}
- Запустите обновление после сохранения:
Если вы хотите, чтобы эта функция выполнялась автоматически при загрузке страницы администрирования WooCommerce, добавьте следующий хук (например, на странице плагинов):
add_action( 'admin_init', 'update_draft_products_to_published' );
Эти куски кода позволят вам автоматически изменять статус товара из черновика в опубликованный, когда он становится доступным на складе. Обязательно тестируйте изменения на тестовом сайте, прежде чем применять их в рабочей среде.