有什么方法可以覆盖我的 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;
}
我在 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;
}