如何在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
相关产品推荐
相关产品推荐

