使用woocommerce时,覆盖include / abstracts文件夹中包含的php函数/文件的正确方法是什么?

时间:2014-09-23 18:57:41

标签: php wordpress woocommerce

使用woocommerce时覆盖include文件夹中php文件的正确方法是什么?

作为我想改变的众多事情之一的一个例子: “我认为销售价格包含在<del></del>中是愚蠢的(<span> or <div>会更好我想要的东西),我想改变布局,所以我想改变代码

/**
 * Functions for getting parts of a price, in html, used by get_price_html.
 *
 * @param  mixed $from String or float to wrap with 'from' text
 * @param  mixed $to String or float to wrap with 'to' text
 * @return string
 */
public function get_price_html_from_to( $from, $to ) {
    return '<del>' . ( ( is_numeric( $from ) ) ? wc_price( $from ) : $from ) . '</del> <ins>' . ( ( is_numeric( $to ) ) ? wc_price( $to ) : $to ) . '</ins>';
}

在文件

plugins/woocommerce/includes/abstracts/abstract-wc-product.php

我可以在这个文件中改变它,但我知道这是不正确的做法,并且它也会被下一个woo更新覆盖。

那么改变这段代码的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

如果价格大于0,您可以通过woocommerce_sale_price_html过滤器更改价格html的值。或者,如果价格为0,您可以定位woocommerce_free_sale_price_html过滤器。请参阅get_price_html()摘要中的WC_Product方法。

如果价格大于0,这里是相关位:

if ( $this->is_on_sale() && $this->get_regular_price() ) {

    $price .= $this->get_price_html_from_to( $display_regular_price, $display_price ) . $this->get_price_suffix();

    $price = apply_filters( 'woocommerce_sale_price_html', $price, $this );

} 

因此,您可以过滤html,而不是使用WC的默认get_price_html_from_to方法,您可以使用自己的自定义标记创建自己的函数,如下所示:

add_filter( 'woocommerce_sale_price_html', 'so_26002687_sale_price_html', 10, 2);

function so_26002687_sale_price_html( $html, $product ){

    $tax_display_mode      = get_option( 'woocommerce_tax_display_shop' );
    $display_price  = $tax_display_mode == 'incl' ? $product->get_price_including_tax() : $product->get_price_excluding_tax();
    $display_regular_price = $tax_display_mode == 'incl' ? $product->get_price_including_tax( 1, $product->get_regular_price() ) : $product->get_price_excluding_tax( 1, $product->get_regular_price() );

    $html = so_26002687_get_price_html_from_to( $display_regular_price, $display_price ) . $product->get_price_suffix();

    return $html;

}

function so_26002687_get_price_html_from_to( $from, $to ) {
    return '<span class="from">' . ( ( is_numeric( $from ) ) ? wc_price( $from ) : $from ) . '</span> <span class="to">' . ( ( is_numeric( $to ) ) ? wc_price( $to ) : $to ) . '</span>';
}

然后我重复woocommerce_free_sale_price_html的过程。

答案 1 :(得分:0)

我猜您可以创建自己的文件,并在包含woocommerce中的原始文件后包含/要求它。 在您的文件中,您重新定义您需要执行的操作:

bool runkit_function_redefine ( string $funcname , string $arglist , string $code );

我认为这是你最好的选择,虽然它有点模糊。

$funcname是您要重新定义的函数的名称。

$arglist是新的参数列表(string格式!)。

$code是新代码(同样,string格式)。

希望它有所帮助。

更多信息:Redefine PHP manuals

答案 2 :(得分:0)

创建自己的类,实现WC_Product'abstract'类,并确保您的产品已注册为该类型,以便WC_Product_Factory为您提供该类的实例,而不是{ {1}}; e.g。

WC_Product