@trenton

Как получить минимальное и максимальное значение цифрового мета-поля, но не цены?

Это вообще кусок большого фильтра, но я пощу пока что только кусок, с которым не разобрался, остальное не по этой теме.
Вот по цене минимальное и максимальное значение берется из базы в куске, где $sql.
Что нужно вписать вместо price_meta.meta_value, чтобы точно так же получить из базы минимальное и максимальное значение своего мета-поля? Тип ввода тоже number.
Или как вариант прицепиться к дефолтным мета-полям вукоммерса, как длина-ширина-высота продукта. Что для них вписать вместо price_meta.meta_value? Где брать эти значения?
Как я понимаю, это напрямую sql запрос, только в коде. Я в sql не очень понимаю.

protected function get_filtered_price() {
        global $wpdb;

        $args       = wc()->query->get_main_query()->query_vars;
        $tax_query  = isset( $args['tax_query'] ) ? $args['tax_query'] : array();
        $meta_query = isset( $args['meta_query'] ) ? $args['meta_query'] : array();

        if ( ! is_post_type_archive( 'product' ) && ! empty( $args['taxonomy'] ) && ! empty( $args['term'] ) ) {
            $tax_query[] = array(
                'taxonomy' => $args['taxonomy'],
                'terms'    => array( $args['term'] ),
                'field'    => 'slug',
            );
        }

        foreach ( $meta_query + $tax_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 ) ) as min_price, max( CEILING( price_meta.meta_value ) ) 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 IN ('" . implode( "','", array_map( 'esc_sql', apply_filters( 'woocommerce_price_filter_post_type', array( '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'];

        $search = WC_Query::get_main_search_query_sql();
        if ( $search ) {
            $sql .= ' AND ' . $search;
        }

        return $wpdb->get_row( $sql ); // WPCS: unprepared SQL ok.
    }
  • Вопрос задан
  • 23 просмотра
Пригласить эксперта
Ответы на вопрос 1
@lavren
Я возможно сейчас предложу устаревшее решение тк взято из старого проекта. Но рабочее

function out_meta_value($meta, $post_type, $out = 'MAX') {
    global $wpdb;
    return $wpdb->get_var(
        $wpdb->prepare("
			SELECT {$out}( cast( meta_value as unsigned) ) FROM {$wpdb->postmeta} pm
			LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
			WHERE pm.meta_key = '%s'
			AND p.post_status = 'publish'
			AND p.post_type = '%s'",
            $meta,
            $post_type
        )
    );
}

$minPrice = out_meta_value('_new_price', 'product', 'MIN');
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы