【问题标题】:Woocommerce "woocommerce_product_get_price" issueWoocommerce“woocommerce_product_get_price”问题
【发布时间】:2018-08-02 18:30:27
【问题描述】:

显示自定义价格的过滤器“woocommerce_product_get_price”有效,但我偶然发现此过滤器在单个产品页面中触发了五次,在存档产品页面中触发了六次。我已经通过以下方式检查了包含 var_damp 的内容:

add_filter('woocommerce_product_get_price', 'get_ws_price', 10, 2);

function get_ws_price($price, $product){

    var_dump('HI!');

    $price = 99.99;

    return $price;

}

这对我来说是个问题,我使用这个过滤器来执行复杂的代码并且重复它们很多次。

我做错了什么? 有没有其他方法可以用另一个钩子修改产品的价格?

【问题讨论】:

    标签: wordpress filter woocommerce hook


    【解决方案1】:

    您可以选择不使用过滤器并编写自己的函数来替换get_price_html()。使用新功能,您可以覆盖您的 WooCommerce 模板,例如单个产品页面 woocommerce\templates\single-product\price.php,并用您自己的自定义函数替换对该函数的任何调用。这样它只会被调用一次。

    【讨论】:

    • 我尝试修改模板,但无法访问“WC_Product_Simple Object”的属性,它们都受到保护。我的情况有点特殊,但应该很容易解决。产品在没有价格的情况下加载到 WP 数据库中,当用户记录产品视图时,他们调用 Web 服务以根据用户的属性下载价格。出于这个原因,钩子“woocommerce_product_get_price”非常有用,因为它修改了产品对象,我可以在购物车中毫无问题地处理它。
    • 您可以访问全局 $post 变量,然后您可以从 $post->ID 创建自己的 WC_Product_Simple 对象。
    【解决方案2】:

    WooCommerce 也有这个问题,它通过缓存来解决。它使用 WordPress get_transient() 和 set_transient() 将版本保存在 WordPress 数据库中。这允许计算用于多个请求。此外,计算保存在全局对象中,因此可以在单个请求中从内存中的对象中检索计算。

    文件 '...\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-variable-data-store-cpt.php' 中的 WC_Product_Variable_Data_Store_CPT::read_price_data() 就是一个很好的例子这种技术。

    【讨论】:

    • 工作正常!谢谢!
    • 真的很抱歉,伙计们,我有同样的问题,但我真的不明白这如何回答 OP 的问题。我遗漏了一些东西,如何使用这条信息?
    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 2020-07-31
    • 2018-11-19
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2019-10-17
    相关资源
    最近更新 更多