Как настроить цены продуктов WooCommerce, используя простые и переменные продукты, на одной странице, в категории, в магазине и на других страницах - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу настроить отображение цен на товары WooCommerce (с простыми и переменными товарами) на странице отдельного продукта, странице категории, странице поиска, странице магазина и других страницах (исключая страницу оформления заказа и страницу корзины) следующим образом:

  1. Простой продукт a: Цена продажи не определена i) Страница сведений о продукте (отдельная страница продукта): Показать обычную цену ii) Категория, Поиск и другие страницы (кроме корзины и заказа) Показать обычную цену (такая же, как указано выше) b: Продажная цена определена i) Страница сведений о продукте: показать продажную цену (исключить обычную цену) ii) Категория, поиск и другие страницы (кроме корзины и заказа) Показать продажную цену
  2. Переменная Продукт a: вариант по умолчанию Не определеноСлучай 1: Цена продажи не определена i) Страница сведений о продукте (страница одного продукта): Показать обычную цену самого низкого варианта ii) Категория, Поиск и другие страницы (кроме корзины и оформления заказа) Показать обычную цену самого низкого варианта (То же, что и выше) Случай 2:Цена продажи определена i) Страница сведений о продукте (страница с одним продуктом):Показывать самую низкую цену вариации (из объединения продаж и обычных цен) I) если самая низкая цена является обычной ценой, показывать только обычную цену II), если самая низкая цена является продажной ценой, показать цену продажи (отменить обычную цену того же идентификатора варианта) ii) Категория, поиски другие страницы (кроме корзины и оформления заказа) Показывать только самую низкую цену вариации (из объединения продаж и обычных цен). b: Задано отклонение по умолчанию. Случай 1: Цена продажи не определена. i) Страница сведений о продукте (страница отдельного продукта): Показывает обычную цену варианта по умолчанию.ii) Категория, страница поиска и другие страницы (кроме корзины и оформления заказа). Отображение обычной цены варианта по умолчанию (аналогично описанному выше). Случай 2: цена продажи определена. i) Страница сведений о продукте (страница отдельного продукта): отображение цены продажи варианта по умолчанию (исключение из списка обычного).Цена того же идентификатора вариации) 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 $ 50, Рег-цена Var2 $ 80, Цена продажи $ 40, Рег-цена Var3 $ 75 Цена продажи $ 60, Рег-цена Var4 $ 100.Этот продукт не имеет набора вариантов по умолчанию.Цена на один продукт должна выглядеть как (80 долларов), а затем 40 долларов.Который кажется правильным.Но проблема в выпадающем списке, когда я выбираю вариант var1, цена, показанная ниже, составляет (80 долларов), а затем 40 долларов, где, как и должно быть, 50 долларов.Для всех вариантов при изменении с var1 на var4 каждый раз, когда он показывает (80 долларов), вычеркивается 40 долларов.

Случай 2: Если у продукта есть 4 варианта: стандартная цена Var1 50 долларов, стандартная цена Var2 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, но не повезло.

Я буду очень рад, если кто-то может предложить какое-либо решение для решения проблемы.

Я делаю все это, создавая плагин только для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...