【问题标题】:Get Woocommerce to Manage Stock as a default让 Woocommerce 默认管理库存
【发布时间】:2021-01-05 22:46:21
【问题描述】:

是否有一个钩子可以允许在全球范围内的 woocommerce 中设置库存 > 管理库存复选框?

我所有的产品都是单件数量,所以总是要记得检查它似乎很反 D.R.Y,尤其是对于其他员工。

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

    虽然这相当晚了,因为您询问了一个钩子:虽然似乎没有专门用于打开 Manage Stock 选项的钩子、动作或函数,但您仍然可以挂钩到 post save 功能并以这种方式自动启用它,因为它只是一个 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 的其他地方对更大的库存数量产生连锁反应,但是当您处理单数量商品时,我猜您可能没问题。

    更新(使用 $update):

    从 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');
        }
    }
    

    (感谢Dylan 提醒有关特定帖子类型的保存)

    【讨论】:

    • 非常感谢您提供此代码,太好了!唯一的问题是,即使尝试增加数量,它也只能保存为 1 个产品。但现在还可以:)
    • @Iggy Yup - 如前所述,每次保存产品时都会执行该挂钩。您可能需要在其中添加条件以检查它是否是新帖子。我现在会更新我的答案。
    • 你是天才!你可以发布一个这样的插件,真的很有用。如果我只有一种产品库存,我什至添加了一些 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; }
    • 这比使用 JavaScript 要好得多。从 WordPress 3.7 开始,您还可以使用动态的 save_post_{$post->post_type} 钩子,它将转换为 save_post_product。然后,您可以删除 post_type 条件。
    • @Dylan 好点 - 我已经更新了我的答案。我总是忘记这一点!
    【解决方案2】:

    有点晚了,但其他人需要这样做...我在其他地方找到了大部分代码,但我没有找到它的链接了。稍微调整了一下,这就是我最终得到的(添加到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
      }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 也可以,但只有在保存产品后才能使用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多