有没有办法在我的functions.php中覆盖get_stock_quantity?

时间:2017-12-02 18:41:37

标签: wordpress woocommerce multisite

我正在使用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文件的情况下覆盖它? 感谢

3 个答案:

答案 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;
    }