Получите Woocommerce для управления запасами по умолчанию

Есть ли ловушка, позволяющая установить флажок Инвентарь> Управление запасами в woocommerce глобально?

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


person SWL    schedule 09.04.2013    source источник


Ответы (3)


Немного поздно, но вот как это сделать… Я нашел большую часть этого кода где-то еще, но у меня больше нет ссылки на то, где я его нашел. Немного подправили, и вот что у меня получилось (добавить в functions.php):

add_action( 'admin_enqueue_scripts', 'wc_default_variation_stock_quantity' );
function wc_default_variation_stock_quantity() {
  global $pagenow, $woocommerce;

  $default_stock_quantity = 1;
  $screen = get_current_screen();

  if ( ( $pagenow == 'post-new.php' || $pagenow == 'post.php' || $pagenow == 'edit.php' ) && $screen->post_type == 'product' ) {

    ?>
<!-- uncomment this if jquery if it hasn't been included
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
-->
    <script type="text/javascript">
    jQuery(document).ready(function(){
        if ( !jQuery( '#_manage_stock' ).attr('checked') ) {
          jQuery( '#_manage_stock' ).attr('checked', 'checked');
        }
        if ( '' === jQuery( '#_stock' ).val() ) {
          jQuery( '#_stock' ).val(<?php echo $default_stock_quantity; ?>);
        }
    });
    </script>
    <?php
  }
}
person user2441782    schedule 31.05.2013

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

add_action('save_post', 'myWoo_savePost', 10, 2);

function myWoo_savePost($postID, $post) {
    if (isset($post->post_type) && $post->post_type == 'product') {

        update_post_meta($post->ID, '_manage_stock', 'yes');
    }
}

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

update_post_meta($post->ID, '_stock', '1');

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

Я не уверен, имеет ли это влияние где-либо еще в WooCommerce для больших запасов, но, поскольку вы имеете дело с товарами с одним количеством, я предполагаю, что вы, вероятно, в порядке.

Обновление (с обновлением $):

Начиная с Wordpress 3.7, третий параметр был добавлен в save_post, чтобы вы могли легко определить, это создается новое сообщение или обновляется существующее сообщение. Таким образом, вы можете активировать указанную выше функцию только при создании нового сообщения (что, возможно, является желаемым эффектом):

add_action('save_post_product', 'myWoo_savePost', 10, 3);

function myWoo_savePost($postID, $post, $update) {
    if (!$update) {
        //  $update is false if we're creating a new post
        update_post_meta($post->ID, '_manage_stock', 'yes');
        update_post_meta($post->ID, '_stock', '1');
    }
}

(Спасибо Дилану за напоминание о сохранениях для конкретных типов записей)

person indextwo    schedule 25.08.2014
comment
Большое спасибо за этот код, просто здорово! единственная проблема заключается в том, что даже при попытке увеличить количество сохраняется только 1 продукт. Но пока ладно :) - person Iggy; 22.12.2015
comment
@Iggy Yup - как уже упоминалось, он будет выполнять эту ловушку каждый раз при сохранении продукта. Вы можете добавить туда условие, чтобы проверить, является ли это новым сообщением. Я обновлю свой ответ сейчас. - person indextwo; 22.12.2015
comment
Вы - гений! вы можете выпустить такой плагин, это действительно полезно. Я даже добавил CSS, чтобы скрыть количество, если в наличии только один товар. /* product page, hide qty for 1 product */ .single-product div.product form.cart .quantity .qty { margin-right: 1em; } .single-product div.product form.cart .button { float: none; } .single-product div.product form.cart .quantity .qty[max="1"] { visibility: hidden; display: none; } - person Iggy; 22.12.2015
comment
Это намного лучше, чем использование JavaScript. В WordPress 3.7 вы также можете использовать динамический хук save_post_{$post->post_type}, который будет преобразовываться в save_post_product. Затем вы можете удалить условное выражение post_type. - person Dylan; 05.10.2016
comment
@Dylan Хороший вопрос - я обновил свой ответ. Я всегда об этом забываю! - person indextwo; 05.10.2016

У Woocommerce теперь есть собственный крючок для сохранения продукта. Для простого продукта это woocommerce_process_product_meta_simple.

Перед обновлением меты мы должны сначала убедиться, что _manage_stock пуст, т.е. флажок не установлен, поэтому он срабатывает только для продуктов, которые еще не были установлены.

Затем переключите управление запасом и установите номер запаса по умолчанию.

function manage_stock_default( $post_id ) {
    if (empty($_POST['_manage_stock'])) {
      update_post_meta($post_id, '_manage_stock', 'yes');
      update_post_meta($post_id, '_stock', '1');
    }
}
add_action( 'woocommerce_process_product_meta_simple', 'manage_stock_default');
person Zac    schedule 18.09.2017
comment
тоже работает, но только после сохранения товара - person Iggy; 03.01.2021