如何正确覆盖Woocommerce wc_format_sale_price函数?

时间:2017-09-18 14:47:10

标签: woocommerce

我正在努力完成这项任务,我真的可以使用一些帮助。首先,在有人将此标记为偏离主题之前,我已经在这里和其他网站上阅读了所有问题和答案。没有运气。

我正在尝试编辑位于 wc-formatting-functions.php 中的 wc_format_sale_price 函数的HTML输出。

原始代码是:

function wc_format_sale_price( $regular_price, $sale_price ) {
$price = '<del>' . ( is_numeric( $regular_price ) ? wc_price( $regular_price ) : $regular_price ) . '</del> <ins>' . ( is_numeric( $sale_price ) ? wc_price( $sale_price ) : $sale_price ) . '</ins>';
return apply_filters( 'woocommerce_format_sale_price', $price, $regular_price, $sale_price );

如您所见,价格已封装在HTML元素<del><ins>中。

我确实试图直接更改HTML,但效果很好。

function wc_format_sale_price( $regular_price, $sale_price ) {
$price = '<div id="priceBefore" style="font-size: 16px;" class="old-price">' . ( is_numeric( $regular_price ) ? wc_price( $regular_price ) : $regular_price ) . '</div> <div id="priceAfter" style="font-size: 24px;" class="price">' . ( is_numeric( $sale_price ) ? wc_price( $sale_price ) : $sale_price ) . '</div>';
return apply_filters( 'woocommerce_format_sale_price', $price, $regular_price, $sale_price );

问题是我不想更改WC核心文件,因为这是一种不好的做法,每次店主更新WC插件时都会删除更改。 经过一些研究后,我确信这应该在我的主题的functions.php文件中使用过滤器来完成,但是有关此功能的所有教程和文章都非常混乱。我确实试图跟随他们中的一些,我最终得到了空白页,重复的价格和类似的东西。

我知道过滤器和操作是Wordpress / Woocommerce主题开发的alpha和omega,但我尝试让它们工作只是失败。

1 个答案:

答案 0 :(得分:0)

我实际上发现了如何解决这个问题。 我做了一些更多的研究,我在Stack Overflow上找到了这个答案:https://stackoverflow.com/a/45112008/6361752用户名为 LoicTheAztec 指出 woocommerce_format_sale_price 钩子接受三个参数。所以我将 $ price 添加为我的过滤功能的第三个参数,现在它可以正常工作。

我在主题 functions.php 文件中添加的最终解决方案如下所示:

add_filter('woocommerce_format_sale_price', 'ss_format_sale_price', 100, 3);
function ss_format_sale_price( $price, $regular_price, $sale_price ) {
    $output_ss_price = '<div id="priceBefore" style="font-size: 16px;" class="old-price">' . ( is_numeric( $regular_price ) ? wc_price( $regular_price ) : $regular_price ) . '</div> <div id="priceAfter" style="font-size: 24px;" class="price">' . ( is_numeric( $sale_price ) ? wc_price( $sale_price ) : $sale_price ) . '</div>';
    return $output_ss_price;
}

我发布这个答案只是为了确保不再浪费时间在这么简单的事情上。

我还想知道更多的事情。当我的过滤函数需要接受三个参数才能正常工作时,原始函数如何仅使用两个参数并且完美无缺地工作?有什么想法吗?