Come ordinare una funzione 'query_posts' di campo personalizzato, limitando i messaggi di un altro campo personalizzato

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

  •  29-09-2019
  •  | 
  •  

Domanda

Sto interrogazione di una serie di post in WP con la seguente funzione:

<?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 )); 
?>
bene

Questa parte funziona. E 'fondamentalmente tirando tutti i miei post Real Estate, ma solo restituire i risultati che hanno un 'tempo a disposizione' di 30 giorni o meno.

Ho bisogno di questo per ordinare i messaggi in ordine crescente dal basso ad alto utilizzando i dati di un altro campo personalizzato, 'prezzo.'

Ogni volta che aggiungo il 'orderby' => 'meta_value', 'meta_key' => 'Price' standard di esso non mostra più i risultati entro 30 giorni.

C'è un modo posso combinare questi due? Ed è possibile aggiungere un pulsante che ri-esegue la query e sorta per prezzo, camere da letto, ecc? O è anche questo specifico per WP?

È stato utile?

Soluzione

Credo che questo fornirà volete che vi serve. E 'una chiamata PostsOrderedByMetaQuery classe che estende WP_Query e accetta nuovi argomenti 'orderby_meta_key' e '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;
  }
}

Si potrebbe chiamare in questo modo:

$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";
}

È possibile copiare la classe PostsOrderedByMetaQuery nel file functions.php del vostro tema, oppure è possibile utilizzarlo all'interno di un file .php di un plugin si può essere in forma scritta.

Se si desidera verificare rapidamente che ho postato una versione autonoma del codice per Gist, che è possibile scaricare e copiare principale del server web come test.php, modificare per il vostro caso d'uso, e quindi richiedere dal browser utilizzando un URL come http://example.com/test.php.

Spero che questo aiuti.

-Mike

P.S. Questa risposta è molto simile a una risposta che ho appena dato sopra a WordPress risposte , che è il luogo della sorella di StackOverflow, dove un sacco di appassionati di WordPress come me rispondere alle domande al giorno. Si potrebbe desiderare di vedere che rispondere anche perché ha un po 'più spiegazioni e perché si potrebbe desiderare di vedere WordPress Risposte . Spero che prenderemo in considerazione la pubblicazione delle domande di WordPress su ci anche in futuro?

Altri suggerimenti

A causa 'orderby' => 'meta_value' richiede meta_key, e la vostra meta_key è già in uso per un confronto, non credo che si può fare questo. meta_key accetta un unico valore e non una serie di opzioni. Questo è sicuramente un limite e vi incoraggio a aprire una richiesta se non si trova una soluzione.

Per quanto riguarda il pulsante di eseguire nuovamente la query, si potrebbe semplicemente ricaricare la pagina e passare una variabile query per cambiare l'ordinamento. Purtroppo si deve ancora risolvere la prima parte della sua domanda.

UPDATE

Si può sempre sorta la matrice restituita da soli, usando PHP.

Inoltre, non so cosa si sta verificando con il tempo a disposizione, ma si potrebbe registrare un filtro che può aiutarvi a personalizzare la query un po 'più add_filter('posts_where', ...); http://codex.wordpress.org/Function_Reference/query_posts

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top