Cómo ordenar una función 'query_posts' por el campo personalizado, al tiempo que limita los mensajes de otro campo personalizado

StackOverflow https://stackoverflow.com/questions/4111255

  •  29-09-2019
  •  | 
  •  

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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top