You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WooCommerce后台商品列表添加库存恢复/增量按钮?

WooCommerce后台商品列表添加缺货商品库存操作列

以下是完整实现代码,包含列添加、缺货判断、按钮渲染、AJAX库存更新及前端无刷新反馈:

1. 添加自定义列

add_filter( 'manage_edit-product_columns', 'add_stock_action_admin_column', 9999 );
function add_stock_action_admin_column( $columns ){
    // 新增库存操作列,可自行调整列名和位置
    $columns['stock-action'] = '库存操作';
    return $columns;
}

2. 渲染列内容(仅缺货商品显示按钮)

add_action( 'manage_product_posts_custom_column', 'render_stock_action_column_content', 10, 2 );
function render_stock_action_column_content( $column, $product_id ){
    if ( $column !== 'stock-action' ) return;

    $product = wc_get_product( $product_id );
    // 仅对启用库存管理且缺货的商品显示操作按钮
    if ( !$product->is_in_stock() && $product->managing_stock() ) {
        // 生成安全验证nonce
        $nonce = wp_create_nonce( 'update_product_stock_nonce' );
        
        // 恢复库存按钮(默认设为1,可自行修改)
        echo '<button class="button button-small stock-restore" data-product-id="' . esc_attr( $product_id ) . '" data-nonce="' . esc_attr( $nonce ) . '">恢复库存</button> ';
        
        // 增加1个库存按钮
        echo '<button class="button button-small stock-increment" data-product-id="' . esc_attr( $product_id ) . '" data-nonce="' . esc_attr( $nonce ) . '">+1库存</button>';
    }
}

3. 处理AJAX库存更新请求

add_action( 'wp_ajax_update_product_stock', 'handle_product_stock_update' );
function handle_product_stock_update() {
    // 验证安全权限
    if ( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'update_product_stock_nonce' ) || !current_user_can( 'manage_woocommerce' ) ) {
        wp_send_json_error( '权限验证失败' );
    }

    $product_id = intval( $_POST['product_id'] );
    $action = sanitize_text_field( $_POST['action_type'] );
    $product = wc_get_product( $product_id );

    if ( !$product || !$product->managing_stock() ) {
        wp_send_json_error( '商品不存在或未启用库存管理' );
    }

    // 根据操作类型更新库存
    switch ( $action ) {
        case 'restore':
            $product->set_stock_quantity( 1 ); // 可修改为你需要的默认恢复数量
            break;
        case 'increment':
            $current_stock = $product->get_stock_quantity();
            $product->set_stock_quantity( $current_stock + 1 );
            break;
        default:
            wp_send_json_error( '无效操作类型' );
    }

    $product->save();
    wp_send_json_success( array( 'new_stock' => $product->get_stock_quantity() ) );
}

4. 添加前端AJAX交互脚本

add_action( 'admin_footer', 'stock_action_admin_script' );
function stock_action_admin_script() {
    // 仅在商品列表页面加载脚本
    if ( get_current_screen()->id !== 'edit-product' ) return;
    ?>
    <script>
        jQuery(document).ready(function($){
            // 恢复库存按钮点击事件
            $('.stock-restore').on('click', function(){
                var $btn = $(this);
                updateStock( $btn, 'restore' );
            });

            // 增量库存按钮点击事件
            $('.stock-increment').on('click', function(){
                var $btn = $(this);
                updateStock( $btn, 'increment' );
            });

            // 通用库存更新函数
            function updateStock( $btn, actionType ){
                var productId = $btn.data('product-id');
                var nonce = $btn.data('nonce');

                $btn.prop('disabled', true).text('处理中...');

                $.ajax({
                    url: ajaxurl,
                    type: 'POST',
                    data: {
                        action: 'update_product_stock',
                        product_id: productId,
                        action_type: actionType,
                        nonce: nonce
                    },
                    success: function(response){
                        if (response.success){
                            // 更新按钮状态并提示完成
                            $btn.text('已完成').delay(1000).fadeOut();
                            // 同步刷新当前行的库存列显示
                            $btn.closest('tr').find('.column-stock').text(response.data.new_stock);
                        } else {
                            alert('操作失败:' + response.data);
                            $btn.prop('disabled', false).text( actionType === 'restore' ? '恢复库存' : '+1库存' );
                        }
                    },
                    error: function(){
                        alert('网络错误,请重试');
                        $btn.prop('disabled', false).text( actionType === 'restore' ? '恢复库存' : '+1库存' );
                    }
                });
            }
        });
    </script>
    <?php
}

使用说明:

  • 将代码添加到主题functions.php文件或自定义插件中即可生效
  • 若需调整恢复库存的默认数量,修改set_stock_quantity(1)中的数值即可
  • 操作完成后会无刷新更新当前行的库存显示,避免页面重载
  • 仅对启用库存管理的缺货商品显示操作按钮

内容的提问来源于stack exchange,提问作者George Obonyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:45:53