Cómo ordenar una función 'query_posts' por el campo personalizado, al tiempo que limita los mensajes de otro campo personalizado
Pregunta
Estoy consultar una serie de mensajes en WP con la siguiente función:
<?php
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array(
'post_type' => array('post', 'real-estate'),
'meta_key' => 'Time Available',
'meta_compare' => '<=',
'meta_value' => $thirtydays,
'paged' => $paged ));
?>
bien Esta parte está trabajando. Se trata básicamente de tirar todos mis mensajes Inmobiliaria, pero sólo devolver los resultados que tienen un 'tiempo disponible' de 30 días o menos.
Necesito que esto también ordenar los mensajes en orden ascendente de menor a mayor uso de los datos de otro campo personalizado, 'precio'.
Siempre que añado el 'orderby' => 'meta_value', 'meta_key' => 'Price'
estándar ya no muestra los resultados dentro de los 30 días.
¿Hay alguna manera de combinar estos dos? Y es posible añadir un botón que Vuelve a ejecutar la consulta y el tipo de precio, habitaciones, etc? O es demasiado específico para WP?
Solución
Creo que esto proporcionará desea que necesita. Es una llamada PostsOrderedByMetaQuery
clase que se extiende WP_Query
y acepta nueva 'orderby_meta_key'
argumentos y 'orderby_order'
:
class PostsOrderedByMetaQuery extends WP_Query {
var $posts_ordered_by_meta = true;
var $orderby_order = 'ASC';
var $orderby_meta_key;
function __construct($args=array()) {
add_filter('posts_join',array(&$this,'posts_join'),10,2);
add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
$this->posts_ordered_by_meta = true;
$this->orderby_meta_key = $args['orderby_meta_key'];
unset($args['orderby_meta_key']);
if (!empty($args['orderby_order'])) {
$this->orderby_order = $args['orderby_order'];
unset($args['orderby_order']);
}
parent::query($args);
}
function posts_join($join,$query) {
if (isset($query->posts_ordered_by_meta)) {
global $wpdb;
$join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
}
return $join;
}
function posts_orderby($orderby,$query) {
if (isset($query->posts_ordered_by_meta)) {
global $wpdb;
$orderby = "postmeta_price.meta_value {$this->orderby_order}";
}
return $orderby;
}
}
lo llamaría así:
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
'post_type' => array('post', 'real-estate'),
'meta_key' => 'Time Available',
'meta_compare' => '<=',
'meta_value' => $thirtydays,
'paged' => $paged,
'orderby_meta_key' => 'Price',
'orderby_order' => 'DESC',
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Puede copiar la clase PostsOrderedByMetaQuery
de archivo functions.php
de su tema, o se puede usar dentro de un archivo .php
de un plugin que puede ser escrito.
Si desea probar rápidamente que he publicado una versión autónoma del código a Gist que se puede descargar y copiar a raíz de su servidor web como test.php
, modificar para su caso de uso, y luego solicitar a su navegador usando una URL como http://example.com/test.php
.
Espero que esto ayude.
-Mike
P.S. Esta respuesta es muy similar a una respuesta que acabo de dar más en WordPress respuestas , que es el sitio de la hermana de Stackoverflow donde la gran cantidad de entusiastas de WordPress como yo responder a las preguntas diaria. Es posible que desee ver que responder demasiado porque tiene un poco más de explicación y porque es posible que desee ver WordPress Respuestas . Esperamos que considere publicar sus preguntas sobre WordPress no demasiado en el futuro?
Otros consejos
Debido 'orderby' => 'meta_value'
requiere meta_key
, y su meta_key
ya está en uso para una comparación, creo que no se puede hacer esto. meta_key
sólo acepta un único valor y no una serie de opciones. Esta es sin duda una limitación y le animo a abrir una solicitud si no encuentra una solución.
Por lo que el botón para volver a ejecutar la consulta, usted podría simplemente recargar la página y pasar una variable de consulta para cambiar el estilo. Por desgracia todavía tiene que resolver la primera parte de su pregunta.
ACTUALIZACIÓN
Siempre se puede ordenar la matriz devuelta por sí mismo utilizando PHP.
Además, no está seguro de lo que se está comprobando con el tiempo disponible, pero se podría registrar un filtro que puede ayudar a personalizar la consulta un poco más add_filter('posts_where', ...);
http://codex.wordpress.org/Function_Reference/query_posts