2015-10-19 14 views
6

In wp_query, è possibile creare una query complessa in modo che possa ordinare in base a campi condizionali o calcolati? quello che sto cercando di fare è qualcosa di simile al seguente query in MySql:In wp_query, come posso ordinare per campi complessi calcolati o condizionali?

SELECT *, field1, field2 
    case when field1+field2 > some_value then 1 else 2 end as my_alias 
FROM my_table 
ORDER BY my_alias ASC 

voglio costruire query come questo usando WP_Query, è possibile? se sì, come posso farlo?

+0

perché non utilizzare solo query sql personalizzate - https://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query? – aeryaguzov

+0

@aeryaguzov perché sto sovrascrivendo qualche codice plugin di WordPress e voglio solo aggiungere l'ordine per istruzione alla long wp_query che ho già. – Aghiad

+0

Hai a che fare con una tabella personalizzata? 'WP_Query' può essere utilizzato solo per interrogare post e post personalizzati. Per tutte le tabelle personalizzate (una che è stata aggiunta da un plugin per esempio) è necessario utilizzare ['WPDB'] (https://codex.wordpress.org/Class_Reference/wpdb). – vard

risposta

0

io cosa si usa, e provare questo,

<?php 
    global $wpdb; 
    $result = $wpdb->get_results("SELECT *, field1, field2 case when field1+field2 > some_value then 1 else 2 end as my_alias FROM my_table ORDER BY my_alias ASC"); 
    print_r($result); 
?> 

Guardate questa Click Here

1

Non vedo alcun modo per fare questo con un unico WP_Query come meta_query non consentire tale flessibilità, anche se è possibile fare tre domande distinte poi (codice non testato) merge :

// Get ongoing events 
$ongoing = new WP_Query(array(
    'post_type' => 'event', 
    'meta_key' => 'date_from', 
    'orderby' => 'meta_value', 
    'order' => 'ASC', 
    'meta_query' => array(
     'relation' => 'AND', 
     array(
      'key' => 'date_from', 
      'value' => date('Y-m-d'), 
      'compare' => '<=', 
      'type' => 'DATE' 
     ), 
     array(
      'key' => 'date_to', 
      'value' => date('Y-m-d'), 
      'compare' => '>=', 
      'type' => 'DATE' 
     ) 
    ) 
)); 
foreach($ongoing as $key => $ongoing_post) { 
    $ongoing_post->event_status = 'ongoing'; 
    $ongoing[$key] = $ongoing_post; 
} 

// Get upcoming events 
$upcoming = new WP_Query(array(
    'post_type' => 'event', 
    'meta_key' => 'date_from', 
    'orderby' => 'meta_value', 
    'order' => 'ASC', 
    'meta_query' => array(
     array(
      'key' => 'date_from', 
      'value' => date('Y-m-d'), 
      'compare' => '>', 
      'type' => 'DATE' 
     ) 
    ) 
)); 
foreach($upcoming as $key => $upcoming_post) { 
    $upcoming_post->event_status = 'upcoming'; 
    $upcoming[$key] = $upcoming_post; 
} 

// Get past events 
$past = new WP_Query(array(
    'post_type' => 'event', 
    'meta_key' => 'date_from', 
    'orderby' => 'meta_value', 
    'order' => 'DESC', 
    'meta_query' => array(
     array(
      'key' => 'date_to', 
      'value' => date('Y-m-d'), 
      'compare' => '<', 
      'type' => 'DATE' 
     ) 
    ) 
)); 
foreach($past as $key => $past_post) { 
    $past_post->past_status = 'past'; 
    $past[$key] = $past_post; 
} 

// Merge'em all 
$events = array_merge($ongoing, $upcoming, $past); 

la cosa è quello di utilizzare meta_query per confrontare i valori di meta con la data effettiva (si consiglia di cambiare il formato della data a seconda del modo in cui sono memorizzati in date_from e date_to campi), e fare un po 'di cappio subito dopo aggiungere una proprietà a tutti i post oggetto con il diritto event_status su cui puoi lavorare durante la visualizzazione dei messaggi.

Forse c'è un modo intelligente per raggiungere questo attraverso WP_Query filters ma sarebbe necessaria un'indagine più approfondita all'interno del codice sorgente WP_Query in quanto non è realmente documentato all'interno del codice.

+1

Grazie a @vard per il tuo tempo, avevo bisogno che fosse in una singola query perché ho l'impaginazione ei parametri per esso sono nella query stessa. comunque ho finito per aggiungere un nuovo campo personalizzato per lo stato, e lo sto aggiornando quando necessario in modo da poter ordinare da questo campo, e funziona :) – Aghiad

Problemi correlati