Ordenar publicaciones por valores numéricos más cercanos

3

Estoy usando tipos de publicaciones personalizadas para mostrar las propiedades y tener un campo de precio personalizado asignado a cada publicación. En la página de propiedades, quiero mostrar una lista de cuatro propiedades con precios similares, dos menores o iguales al precio de la propiedad actual y dos mayores que el precio actual. Ordenar propiedades numéricamente por precio es bastante fácil con wp_query, pero ¿cómo solo muestro los valores más cercanos al precio de la propiedad actual?

    
pregunta Sam 10.05.2012 - 19:23

2 respuestas

2

Una posibilidad es una consulta SQL directa similar a la dado aquí .

Pero no estoy convencido de que sea mucho más eficiente que 2 consultas, todas manejadas por WordPress:

No se ha probado

$price =0; //Price of current property
$id=0; //Property (post) ID.

$args = array(
    'post_type' => 'property',
    'post__not_in'=>array($id),
    'posts_per_page'=> 2,
    'meta_query' => array(array(
        'key' => 'price',
        'value' => $price,
        'type' => 'numeric',
        'compare' => '>='
        )),
     'meta_key'=> 'price',
     'orderby'=>'meta_value_num',
     'order'=>'ASC'
    );

 $two_above = get_posts($args);

 //Put their IDs along with current property ID in an array
 $ids = array_values(wp_list_pluck($two_above, 'ID'));
 array_push($ids, $id);

 //Exclude returned properties and current property from next query
 $args['post__not_in'] = $ids;

 $args['meta_query']['compare'] = '<=';
 $args['order'] = 'DESC';

 $two_below = get_posts($args);
    
respondido por el Stephen Harris 11.05.2012 - 04:15
-1

Editar

Gracias por llamarme, es la única manera de mejorar.

La consulta actualizada se vería así:

$args = array(
    'post_type' => 'POST',
    'meta_query' => array(
        'key' => 'PRICE',
        'value' => array( ($price - 2), ($price + 2)),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
        );
    );

Gracias de nuevo, Kaiser por hacerme hacer lo correcto.

Lo más rápido que puedes hacer es crear tu propia consulta usando $wpdb . La función más básica se vería así:

function my_custom_get ($price) {
    global $wpdb;
    $min_price = $price - 2;
    $max_price = $price + 2;

    $sql_query = "
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts, $wpdb->postmeta
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
        AND $wpdb->postmeta.meta_key = 'PRICE' 
        AND $wpdb->postmeta.meta_value < $max_price
        AND $wpdb->postmeta.meta_value > $min_price
        AND $wpdb->posts.post_status = 'publish' 
        AND $wpdb->posts.post_type = 'PRODUCT'
        AND $wpdb->posts.post_date < NOW()
        ORDER BY $wpdb->posts.post_date DESC
        ";
    return $wpdb->get_results($querystr, OBJECT);
}

No olvide cambiar los valores de meta_key y post_type para que se ajusten a su aplicación específica. Espero que esto ayude!

    
respondido por el Alex Lane 10.05.2012 - 19:31

Lea otras preguntas en las etiquetas