如何在单一,类别,商店和其他页面上自定义具有简单易变产品的WooCommerce产品价格

时间:2019-02-01 17:41:53

标签: woocommerce

我在下面的方式要自定义WooCommerce产品价格(有简单和变型产品)的外观在单一产品页,分类页,搜索页,店铺页面和其他页面(不包括结帐页面和购物车页面):

  1. 简单产品 a:未定义销售价格     i)产品详细信息页面(单个产品页面):         显示正常价格     ii)类别,搜索和其他页面(购物车和结帐除外)         显示常规价格(同上) b:定义的销售价格     i)产品详细信息页面:         显示销售价格(取消常规价格)     ii)类别,搜索和其他页面(购物车和结帐除外)         显示销售价格
  2. 可变产品 a:默认版本未定义     情况1:未定义销售价格         i)产品详细信息页面(单个产品页面):             显示最低变化的常规价格         ii)类别,搜索和其他页面(购物车和结帐除外)             显示最低变化的常规价格(与上述相同)     情况2:定义的销售价格         i)产品详细信息页面(单个产品页面):             显示最低的变化价格(结合销售价格和正常价格)             I)如果最低价格是正常价格,则仅显示正常价格             II)如果最低价格是销售价格显示销售价格(剔除相同变体ID的常规价格)         ii)类别,搜索和其他页面(购物车和结帐除外)             仅显示最低的变化价格(结合销售价格和正常价格) b:定义了默认版本     情况1:未定义销售价格         i)产品详细信息页面(单个产品页面):             显示默认变化的正常价格         ii)类别,搜索和其他页面(购物车和结帐除外)             显示默认变化的正常价格(与上述相同)     情况2:定义的销售价格         i)产品详细信息页面(单个产品页面):             显示默认变化的销售价格(删除相同变化ID的正常价格)         ii)类别,搜索和其他页面(购物车和结帐除外)             显示默认变化的销售价格

它是使用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,也没有运气。

如果有人可以提供任何解决方案来解决这个问题,我将非常高兴。

我通过创建一个仅用于此目的的插件来完成所有这一切。

0 个答案:

没有答案