我在下面的方式要自定义WooCommerce产品价格(有简单和变型产品)的外观在单一产品页,分类页,搜索页,店铺页面和其他页面(不包括结帐页面和购物车页面):
它是使用WooCommerce和在Plex上运行的网站构建的电子商务网站。
我尝试了以下代码:
add_filter( 'woocommerce_get_price_html', 'custom_price_html', 10, 2 );
function custom_price_html(){
global $product;
//echo $product->get_id();
$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
if( array_intersect($allowed_roles, $user->roles ) && !is_product() ) {
if($product->is_type('simple')){
$regular_price=$product->get_regular_price('min');
$sale_price=$product->get_sale_price('min');
if(!empty($sale_price)){
$formatted_price='<del><span class="woocommerce-Price-amount amount">'.number_format((float)$regular_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></del> ';
$formatted_price.=' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$sale_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
return $formatted_price;
}else{
$formatted_price = number_format((float)$regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
return $formatted_price;
}
}
if($product->is_type('variable')){
}
}
if( $product->is_type('simple') && !array_intersect($allowed_roles, $user->roles )){
$regular_price=$product->get_regular_price('min');
$sale_price=$product->get_sale_price('min');
if(is_product()){
if(!empty($sale_price)){
$formatted_price='<del><span class="woocommerce-Price-amount amount">'.number_format((float)$regular_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></del> ';
$formatted_price.=' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$sale_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
return $formatted_price;
}else{
$formatted_price = number_format((float)$regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
return $formatted_price;
}
}
if(is_product_category() || is_search()){
if($sale_price < $regular_price){
return number_format((float)$sale_price, 2, '.', '') .get_woocommerce_currency_symbol();
}else{
return number_format((float)$regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
}
}
}
if( $product->is_type('variable') && !array_intersect($allowed_roles, $user->roles )){
$default_attributes = $product->get_default_attributes($product);
$default_variation_id = custom_find_matching_product_variation( $product, $default_attributes );
if(empty($default_variation_id)){
$child_prices = array();
foreach ( $product->get_children() as $child_id ) {
$sale_price=get_post_meta( $child_id, '_sale_price', true );
if(!empty($sale_price)){
$child_prices['sales'][$child_id] = get_post_meta( $child_id, '_sale_price', true );
}
$child_prices['regular'][$child_id] = get_post_meta( $child_id, '_regular_price', true );
}
if(!empty($child_prices['sales'])){
asort($child_prices['sales']);
$lowest_salse_variation_id=key($child_prices['sales']);
$lowest_salse_price=$child_prices['sales'][$lowest_salse_variation_id];
}
asort($child_prices['regular']);
$lowest_regular_variation_id=key($child_prices['regular']);
$lowest_regular_price=$child_prices['regular'][$lowest_regular_variation_id];
}
if(is_product()){
$children=$product->get_children();
if(!in_array($product->get_id(),$children)){
if(!empty($default_variation_id)){
$sale_price = get_post_meta($default_variation_id, '_sale_price', true);
$regular_price = get_post_meta($default_variation_id, '_regular_price', true);
if(!empty($sale_price)){
$formatted_price='<del><span class="woocommerce-Price-amount amount">'.number_format((float)$regular_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></del> ';
$formatted_price.=' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$sale_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
return $formatted_price;
}else{
return number_format((float)$regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
}
}else{
if(!empty($lowest_salse_price) && ($lowest_salse_price < $lowest_regular_price)){
$formatted_price='<del><span class="woocommerce-Price-amount amount">'.number_format((float)$child_prices['regular'][$lowest_salse_variation_id], 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></del> ';
$formatted_price.=' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$lowest_salse_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
return $formatted_price;
}else{
if(!empty($child_prices['sales']) && array_key_exists($lowest_regular_variation_id,$child_prices['sales'])){
$formatted_price='<del><span class="woocommerce-Price-amount amount">'.number_format((float)$lowest_regular_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></del> ';
$formatted_price.=' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$child_prices['sales'][$lowest_regular_variation_id], 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
return $formatted_price;
}else{
return number_format((float)$lowest_regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
}
}
}
}
}
if(is_product_category() || is_search()){
if(empty($default_variation_id)){
if(!empty($lowest_salse_price) && ($lowest_salse_price < $lowest_regular_price)){
return ' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$lowest_salse_price, 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
}else{
if(!empty($child_prices['sales']) && array_key_exists($lowest_regular_variation_id,$child_prices['sales'])){
return ' <ins><span class="woocommerce-Price-amount amount">'.number_format((float)$child_prices['sales'][$lowest_regular_variation_id], 2, '.', '').'<span class="woocommerce-Price-currencySymbol">'.get_woocommerce_currency_symbol().'</span></span></ins>';
}else{
return number_format((float)$lowest_regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
}
}
}else{
$sale_price = get_post_meta($default_variation_id, '_sale_price', true);
$regular_price = get_post_meta($default_variation_id, '_regular_price', true);
if(!empty($sale_price)){
return number_format((float)$sale_price, 2, '.', '') .get_woocommerce_currency_symbol();
}else{
return number_format((float)$regular_price, 2, '.', '') .get_woocommerce_currency_symbol();
}
}
}
}
}
function custom_find_matching_product_variation( $product, $attributes ) {
foreach( $attributes as $key => $value ) {
if( strpos( $key, 'attribute_' ) === 0 ) {
continue;
}
unset( $attributes[ $key ] );
$attributes[ sprintf( 'attribute_%s', $key ) ] = $value;
}
if( class_exists('WC_Data_Store') ) {
$data_store = WC_Data_Store::load( 'product' );
return $data_store->find_matching_product_variation( $product, $attributes );
} else {
return $product->get_matching_variation( $attributes );
}
}
一切顺利除了可能是由于使用“woocommerce_get_price_html”的功能,对单一产品页面的可变产物表示这实际上是定制的价格后照射旁产品名称的所有变型相同的价格。
例如: 情况1:如果产品有4个变体:Var1 reg价格$ 50,var2 reg价格$ 80销售价$ 40,var3 reg价格$ 75销售价$ 60和var4 reg价格$ 100。 该产品未设置默认版本。 单一产品的价格应为($ 80),然后是$ 40。看起来是正确的。但是,当我选择变体var1时,问题出在下拉列表中,下面显示的价格是($ 80),然后是$ 40,应该显示$ 50。对于从var1更改为var4的所有变体,每次显示($ 80)时都会掉价$ 40。
情况2:如果产品有4种变体:VAR1 REG价格:$ 50时,VAR2 REG价格:$ 80出售价格:$ 40 VAR3(默认设置)REG价格:$ 75出售价格:$ 60和VAR4 REG价格:$ 100中。 单一产品的价格应为($ 75),然后是$ 60。看起来是正确的。但是,当我选择变体var1时,问题出在下拉列表中,下面显示的价格是($ 75),然后是$ 60,应该显示$ 50。对于从var1更改为var4的所有变体,每次显示($ 75)都折中了$ 60。
那是主要问题。
如果对可变产品不使用“ woocommerce_get_price_html”,对可变产品不使用“ woocommerce_variable_price_html”和“ woocommerce_dropdown_variation_attribute_options_html”,对于简单产品则不使用“ woocommerce_single_price_html”,则简单产品价格格式在类别页面,商店页面,搜索结果和其他页面中保持不变产品出现在循环中。
我正在尝试在各个论坛上发布的各种示例,包括stackoverflow,也没有运气。
如果有人可以提供任何解决方案来解决这个问题,我将非常高兴。
我通过创建一个仅用于此目的的插件来完成所有这一切。