我正在使用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。
如何在不更改Core文件的情况下覆盖它? 感谢
答案 0 :(得分:2)
更改get_stock_quantity()
方法的正确方法取决于产品。如您所知,查看源代码,您会看到:
return $this->get_prop( 'stock_quantity', $context );
现在get_prop()
方法是WC_Data
类的一部分,并且有一个通用的过滤器钩子:
$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
过滤器挂钩
答案 1 :(得分:0)
您可以使用过滤器woocommerce_data_get_stock_quantity
修改值。
add_filter( 'woocommerce_data_get_stock_quantity' ,'modify_woocommerce_data_get_stock_quantity', 10, 2 );
function modify_woocommerce_data_get_stock_quantity( $value, $data ) {
// Logic to modify your value here
return $value;
}
答案 2 :(得分:0)
您可以更新数据库,但是请记住,每次列出产品时以及更新产品时,都会执行此代码一次
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;
}