使用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更新覆盖。
那么改变这段代码的正确方法是什么?
答案 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