在WooCommerce Admin产品列表中,我已经 for each 产品添加了一个带有简单按钮的输入框,它应该会更新库存数量.例如,如果我输入‘5’,然后点击‘刷新’按钮,我注意到什么都没有发生,产品库存数量也没有更新.

有没有我应该用来描述更新过程的特定术语?

需要指出的是,我在unctions.php文件中使用了这段代码.

add_action( 'manage_product_posts_custom_column', 'custom_product_is_in_stock_column_content', 10, 2 );
function custom_product_is_in_stock_column_content( $column, $product_id ) {
    switch ( $column ) {
        case 'is_in_stock':
            echo '<div class="stock-box">';
            echo '<form method="post">';
            echo '<input type="number" class="stock-input" name="stock_value" value="' . ( get_post_meta( $product_id, '_stock_status', true ) == 'instock' ? 1 : 0 ) . '" min="0">';
            echo '<button type="submit" class="stock-button" name="update_stock">&#8635;</button>';
            echo '</form>';
            echo '</div>';
            break;
    }
}

add_action( 'admin_post_update_stock', 'update_product_stock' );
function update_product_stock() {
    if ( isset( $_POST['stock_value'] ) && isset( $_POST['update_stock'] ) ) {
        $stock_value = intval( $_POST['stock_value'] );
        $product_id = isset( $_POST['post_ID'] ) ? intval( $_POST['post_ID'] ) : 0;

        if ( $product_id > 0 ) {
            $new_status = $stock_value > 0 ? 'instock' : 'outofstock';
            wc_update_product_stock_status( $product_id, $new_status );
        }
    }

    wp_safe_redirect( admin_url( 'edit.php?post_type=product' ) );
    exit;
}

推荐答案

您混淆了产品库存状态和产品库存数量.

现在,该功能需要jQuery/JavaScript/AJAX,才能从这些定制输入字段更新产品库存数量.

代码:

// Add input fields to stock status column
add_action( 'manage_product_posts_custom_column', 'product_stock_quantity_column_content', 10, 2 );
function product_stock_quantity_column_content( $column, $product_id ) {
    if ( $column === 'is_in_stock' ) {
        global $product;

        if( $product->get_manage_stock() ) {
            printf('<div style="margin-bottom:5px;width:120px">
            <input type="number" name="stock_qty-%d" value="%d" style="width:80px">
            <button type="button" class="update-qty button button-primary" data-id="%d">&#8635;</button>
            <span class="message-%d" style="display:none"></span></div>', 
            $product_id, $product->get_stock_quantity('edit'), $product_id, $product_id);
        }
    }     
}

// WP Admin Ajax receiver
add_action('wp_ajax_update_stock_quantity', 'update_stock_quantity_ajax');
function update_stock_quantity_ajax() {
    if (isset($_POST['product_id']) && isset($_POST['update_qty'])) {
        $product = wc_get_product(intval($_POST['product_id']));

        $product->set_stock_quantity(intval($_POST['update_qty']));
        echo $product->save(); // We return the product Id when saved, as a response.
    }
    wp_die(); // Exit silently (Always at the end to avoid an Error 500)
}

// jQuery Ajax
add_action('admin_footer', 'update_stock_quantity_js');
function update_stock_quantity_js() {
    global $pagenow, $typenow;

    if( 'edit.php' === $pagenow && 'product' === $typenow ) :
    ?>
    <script id="update-stock-qty" type="text/javascript">
        jQuery(function($) {
            $('body').on('click', 'button.update-qty', function() {
                const productID = $(this).data('id'),
                      updateQty = $('input[name=stock_qty-'+productID+']').val();
                $.ajax({
                    url:  '<?php echo admin_url( 'admin-ajax.php' ); ?>',
                    type: 'POST',
                    data: {
                        'action':     'update_stock_quantity',
                        'product_id': productID,
                        'update_qty': updateQty,
                    },
                    success: function(response) {
                        if ( response > 0 ) {
                            $('.message-'+response).html(' Updated').css('color','green').fadeIn().delay(1500).fadeOut();
                        }
                    },
                    error: function(error) {
                        $('.message-'+productID).html(' Error').css('color','green').fadeIn().delay(1500).fadeOut();
                        console.log(error);
                    }
                });
            });
        });
    </script>
    <?php
    endif;
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

相关:Save a custom field value via ajax in WooCommerce Admin product list

Php相关问答推荐

如何在Livewire中验证多个 Select 字段

Laravel 9如何过滤$的项目与结果?

尽管包含目标日期,但日期范围比较仍有意外输出

邮箱打开跟踪器不工作时发送邮件使用laravel调度程序

以编程方式更新现有Yith WooCommerce Booking的状态

Laravel 10 -扩展现有的artisan命令?

WooCommerce短代码,显示特定产品的购物车徽章中的当前数量

如何使用MS Graph PHP SDK V2下载文件

将购物车按钮重定向到Checkout-Wooccommerce

Filament v3:具有 hasMany 和 BelongsTo 的关系管理器

Symfony:从控制器内部调用自定义命令

如何判断php中wordpress路径之外的文件夹是否存在?

无法在 Laravel 中实例化抽象类 ProductAbstract

在shopware 6.5上可以使用什么事件来判断刚刚支付的订单的状态

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

在WooCommerce单产品页面中显示特价产品的节省金额

Xdebug 不会在断点处停止

fopen 功能不断向我发送我重新加载网页时已发布的重复版本的表单

检测字符串是否包含Letter with Tilde或Letter + Combining Tilde

多排序子数组 - 包含范围数据的子数组