• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Вывод максимальной и минимальной цены товара в категории

sergiocharm

Опытный
можешь подсказать как в категории вывести минимальную и максимальную стоимость товаров? Надо для заполнения такой строки в описании:
Цена на <?php woocommerce_page_title(); ?> от min руб. до max руб.
 

supersvetodiod

Опытный
это???
/** * Получает экстремальнве значения ценв в категории товара * @param $term_id - id категории товара * * @return mixed */ function wpp_get_extremes_price_in_product_cat( $term_id ) { global $wpdb; $sql = " SELECT MIN( meta_value ) as min_price , MAX( meta_value ) as max_price FROM {$wpdb->posts} INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id) INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id) WHERE ( {$wpdb->term_relationships}.term_taxonomy_id IN (%d) ) AND {$wpdb->posts}.post_type = 'product' AND {$wpdb->posts}.post_status = 'publish' AND {$wpdb->postmeta}.meta_key = '_price' "; $result = $wpdb->get_results( $wpdb->prepare( $sql, $term_id ) ); return $result[ 0 ]; }
 

sergiocharm

Опытный
пробовали прежде чем предлагать? это то и я нагуглил, но почему то не срабатывает
 

supersvetodiod

Опытный
мало гуглить. может надо еще и голову включить? готовых вариантов под ваши нужды и ваши темы мало кто предлагает. есть основа. а дальше подумать надо чуть-чуть
 

sergiocharm

Опытный
пробовали прежде чем предлагать? это то и я нагуглил, но почему то не срабатывает
ну так помоги включить, я же на форум за помощью пришел.
Вставляю сейчас вот так
<?php
/**
* Получает экстремальнве значения ценв в категории товара
* @param $term_id - id категории товара
*
* @return mixed
*/
function wpp_get_extremes_price_in_product_cat( $id ) {

global $wpdb;
$sql = "
SELECT MIN( meta_value ) as min_price , MAX( meta_value ) as max_price
FROM {$wpdb->posts}
INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)
INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)
WHERE
( {$wpdb->term_relationships}.term_taxonomy_id IN (%d) )
AND {$wpdb->posts}.post_type = 'product'
AND {$wpdb->posts}.post_status = 'publish'
AND {$wpdb->postmeta}.meta_key = '_price'
";

$result = $wpdb->get_results( $wpdb->prepare( $sql, $id ) );

return $result[ 0 ];

}
$id = get_queried_object_id();
$extremes = wpp_get_extremes_price_in_product_cat($id); //id категории товара
printf('цена от %d до %d',$extremes->min_price ,$extremes->max_price );
?>
но получаю от 0 до 0 руб.
 

denism300

Новичок
вот взятый из какого-то плагина и доработанный мной код получения минимальной и максимальной цены с учетом налогов и скидок
PHP:
<?php defined('ABSPATH') || exit;
class Extremes_Price
{
    public static function additional_taxes($additional_taxes, $res = array())
    {
        if (!empty($additional_taxes)) {
            $t = explode('+', $additional_taxes);
            if (!empty($t) and is_array($t)) {
                foreach ($t as $string) {
                    $tmp = explode(':', $string);
                    $tax_slug = $tmp[0];
                    $tax_terms = explode(',', $tmp[1]);
                    $slugs = array();
                    foreach ($tax_terms as $term_id) {
                        $term = get_term(intval($term_id), $tax_slug);
                        if (is_object($term)) {
                            $slugs[] = $term->slug;
                        }
                    }
                    if (!empty($slugs)) {
                        $res[] = array(
                            'taxonomy' => $tax_slug,
                            'field' => 'slug',
                            'terms' => $slugs
                        );
                    }
                }
            }
        }
        return $res;
    }

    public static function get_price($additional_taxes = "")
    {
        global $wpdb, $wp_the_query;
        $args = $wp_the_query->query_vars;
        $tax_query = isset($args['tax_query']) ? $args['tax_query'] : array();
        if (is_object($wp_the_query->tax_query)) {
            $tax_query = $wp_the_query->tax_query->queries;
        }
        $meta_query = isset($args['meta_query']) ? $args['meta_query'] : array();
        $tax_query = self::additional_taxes($additional_taxes, $tax_query);
        $temp_arr = array();
        if (isset($args['taxonomy']) and isset($args[$args['taxonomy']]) and !empty($args[$args['taxonomy']])) {
            $temp_arr = explode(',', $args[$args['taxonomy']]);
            if (!$temp_arr or count($temp_arr) < 1) {
                $temp_arr = array();
            }
        }
        if (!empty($args['taxonomy']) && !empty($args['term'])) {
            $tax_query[] = array(
                'taxonomy' => $args['taxonomy'],
                'terms' => (empty($temp_arr)) ? array($args['term']) : $temp_arr,
                'field' => 'slug',
            );
        }
        if (!empty($meta_query) and is_array($meta_query)) {
            foreach ($meta_query as $key => $query) {
                if (!empty($query['price_filter']) || !empty($query['rating_filter'])) {
                    unset($meta_query[$key]);
                }
            }
        }
        $meta_query = new WP_Meta_Query($meta_query);
        $tax_query = new WP_Tax_Query($tax_query);
        $meta_query_sql = $meta_query->get_sql('post', $wpdb->posts, 'ID');
        $tax_query_sql = $tax_query->get_sql($wpdb->posts, 'ID');
        $sql = "SELECT min( FLOOR( price_meta.meta_value + 0.0) ) as min_price, max( CEILING( price_meta.meta_value + 0.0) )as max_price FROM {$wpdb->posts} ";
        $sql .= " LEFT JOIN {$wpdb->postmeta} as price_meta ON {$wpdb->posts}.ID = price_meta.post_id " . $tax_query_sql['join'] . $meta_query_sql['join'];
        $sql .= " WHERE {$wpdb->posts}.post_type = 'product'
        AND {$wpdb->posts}.post_status = 'publish'
        AND price_meta.meta_key IN ('" . implode("','", array_map('esc_sql', apply_filters('woocommerce_price_filter_meta_keys', array('_price')))) . "')
        AND price_meta.meta_value > '' ";
        $sql .= $tax_query_sql['where'] . $meta_query_sql['where'];
        return $wpdb->get_row($sql);
    }

    public static function get_max_price($additional_taxes = "")
    {
        $prices = self::get_price($additional_taxes);
        $max = ceil($prices->max_price);
        return $max;
    }

    public static function get_min_price($additional_taxes = "")
    {
        $prices = self::get_price($additional_taxes);
        $min = floor($prices->min_price);
        return $min;
    }
}
Пользоваться так:
PHP:
require_once(get_stylesheet_directory() . 'путь_к_файлу_с_кодом');
$extremes_price = new Extremes_Price;
$min_price = $extremes_price->get_min_price();
$max_price = $extremes_price->get_max_price();
 
  • Like
Реакции: ADv
Сверху Снизу