有什么方法可以覆盖我的 functions.php 中的 get_stock_quantity 吗?

Any way to Overwrite get_stock_quantity in my functions.php?

我在 Wordpress Multisite 中工作,并试图确保从基本站点表中获取所有股票信息。我试图在我的主题 functions.php 中覆盖 get_stock_quantity() woocomerce 函数。我发现的是

public function get_stock_quantity( $context = 'view' ) {
    return $this->get_prop( 'stock_quantity', $context );
}

现在这既不是过滤器也不是动作。我覆盖了一个过滤器

add_filter( 'woocommerce_product_get_stock_quantity', 'wcs_custom_get_stock_quantity', 1, 2);

function wcs_custom_get_stock_quantity( $availability, $_product ) {
    global $wpdb;
    $productQuantity = $wpdb->get_results( 'SELECT * FROM '.$wpdb->base_prefix.'postmeta WHERE post_id = '.$_product->get_id() ." AND meta_key = '_stock'", OBJECT );
    return $productQuantity[0]->meta_value;
}

但是 woocommerce_product_get_stock_quantity 只适用于产品列表页面。单个产品编辑页面使用 get_stock_quantity.

如何在不更改核心文件的情况下覆盖它? 谢谢

更改 get_stock_quantity() 方法的正确方法取决于产品。正如您已经注意到查看源代码时您看到的那样:

return $this->get_prop( 'stock_quantity', $context );

现在 get_prop() 方法是 WC_Data class 的一部分,并且有一个通用的过滤器钩子:

$value = apply_filters( $this->get_hook_prefix() . $prop, $value, $this );

如果您查看 get_hook_prefix() 方法,您会发现:

return 'woocommerce_' . $this->object_type . '_get_';

对于产品变体,object_type 是:product_variation
对于其他产品,object_type 是:product
$prop 参数是 stock_quantity

知道您可以构建相关的过滤器挂钩。试试这个:

add_filter( 'woocommerce_product_get_stock_quantity' ,'custom_get_stock_quantity', 10, 2 );
add_filter( 'woocommerce_product_variation_get_stock_quantity' ,'custom_get_stock_quantity', 10, 2 );
function custom_get_stock_quantity( $value, $product ) {
    $value = 15; // <== Just for testing
    return $value;
}

因此,对于产品变体,您可以使用 woocommerce_product_variation_get_stock_quantity 过滤器挂钩。
对于其他情况 woocommerce_product_get_stock_quantity 过滤器挂钩

您可以更新数据库,但请记住,每次您发布产品以及更新产品时,都会执行一次此代码


    add_filter( 'woocommerce_product_get_stock_quantity' ,'custom_get_stock_quantity', 10, 2 );
    add_filter( 'woocommerce_product_variation_get_stock_quantity' ,'custom_get_stock_quantity', 10, 2 );
    function custom_get_stock_quantity( $value, $product ) {
        $value = 15; // <== Just for testing
        //update dabatabase:
        update_post_meta( $product->get_id(), '_stock', $value );
        return $value;
    }

据我了解,您可以使用 $product->set_stock($value);以及在数据库中设置值

    add_filter( 'woocommerce_product_get_stock_quantity' ,'custom_get_stock_quantity', 10, 2 );
add_filter( 'woocommerce_product_variation_get_stock_quantity' ,'custom_get_stock_quantity', 10, 2 );
function custom_get_stock_quantity( $value, $product ) {
    $value = 15; // <== Just for testing
    //update dabatabase:
   $product->set_stock($value);
    return $value;
}