WP_query: meta_key con regola personalizzata per valore specifico

5 mag 2013, 20:59:11
Visualizzazioni: 22.6K
Voti: 2

Sono un po' bloccato con un codice WP_Query. Ecco qui:

$args = array(
      'post_type' => 'post',
      'meta_query'=> array(
          'key' => 'karma',
          'compare' => '>=',
          'value' => 0,
          'type' => 'numeric'),
        'posts_per_page' => 9,
        'meta_key' => 'karma',
        'orderby' => 'meta_value_num', 
        'order' => 'DESC',
        'post__not_in' => $dont_show_me
    );

Quello che voglio fare:

Mostrare tutti i post con karma >= 0 (funziona bene con questo codice). MA se ci sono post con karma = 100 mostrarne solo 3 + il resto dei post.

Esempi: 9 post con karma = 150, 133, 100, 100, 100, 100, 100, 33, 11.

Voglio mostrare: 150, 133, 100, 100, 100, 33, 11. (Sono consentiti solo 3 post con karma = 100).

Avete qualche idea su come realizzarlo? Forse un add_filter('posts_where');?

AGGIORNAMENTO: Ok, sono riuscito a farlo funzionare, basandomi sulla risposta di @s_ha_dum. È un po' complicato, ma il risultato funziona ;)

$args = array(
       // Controlla gli ultimi 9 post con karma = 100
       'post_type' => 'post',
       'meta_query'=> array(
          array(
              'key' => 'karma',
              'compare' => '=', 
              'value' => 100,
              'type' => 'numeric'
           )
        ),
       'posts_per_page' => 9,
       'meta_key' => 'karma',
       'orderby' => 'meta_value_num', 
       'order' => 'DESC',
       'post__not_in' => $dont_show_me
    );
    $karma_qry = new WP_Query($args);

    if (!empty($karma_qry->posts)) {
        $i = 0;
        foreach ($karma_qry->posts as $p) {
            $i++;
            // Controlla se ci sono più di 3 post con karma = 100
            // Aggiungili nell'array $dont_show_me 
            if($i > 3){
                $dont_show_me[] = $p->ID;
            }
        }
    }

    // Imposta la query finale che esclude i post aggiuntivi con karma = 100
    $args['meta_query'][0]['compare'] = '>=';
    $args['meta_query'][0]['value'] = 0;
    $args['post__not_in'] = $dont_show_me;

    $wp_query = new WP_Query($args);
0
Tutte le risposte alla domanda 1
4

Un meta_query è un array di array. Guarda gli esempi nel Codex.

 $args = array(
   'post_type' => 'my_custom_post_type',
   'meta_key' => 'age',
   'orderby' => 'meta_value_num',
   'order' => 'ASC',
   'meta_query' => array(
       array(
           'key' => 'age',
           'value' => array(3, 4),
           'compare' => 'IN',
       )
   )
 );
 $query = new WP_Query($args);

Quello che hai è solo un array. Questo potrebbe causare problemi. Quello che vuoi fare è questo:

$args = array(
   'post_type' => 'post',
   'meta_query'=> array(
      array(
          'key' => 'karma',
          'compare' => '>=', // limita a "valore karma = 100"
          'value' => 0, // limita a "valore karma = 100"
          'type' => 'numeric'
       )
    ),
   'posts_per_page' => 9,
   'meta_key' => 'karma',
   'orderby' => 'meta_value_num', 
   'order' => 'DESC',
   'post__not_in' => $dont_show_me
);

Tuttavia, per arrivare alla domanda stessa, non puoi fare una logica così complessa come quella che ti serve...

Mostra tutti i post con karma >= 0 (funziona bene con questo codice). MA se ci sono post con karma = 100 mostra solo 3 di essi + il resto dei post.

... con un singolo WP_Query. Sembra che tu voglia estrarre 3, e solo 3, post con karma maggiore di 100, e riempire il resto con qualsiasi altro post. Sarebbe complicato con SQL puro. Penso che sia possibile in SQL ma dovrei pensarci molto per esserne sicuro, per non parlare di farlo funzionare.

Suggerirei due query: una per ottenere i "maggiore di 100" e una seconda per ottenere il resto.

$dont_show_me = array(1);
$args = array(
   'post_type' => 'post',
   'meta_query'=> array(
      array(
          'key' => 'karma',
          'compare' => '>=', 
          'value' => 100,
          'type' => 'numeric'
       )
    ),
   'posts_per_page' => 3,
   'meta_key' => 'karma',
   'orderby' => 'meta_value_num', 
   'order' => 'DESC',
   'post__not_in' => $dont_show_me
);
$karma_qry = new WP_Query($args);

if (!empty($karma_qry->posts)) {
  $args['posts_per_page'] = 9 - $karma_qry->found_posts;
  $args['meta_query'][0]['value'] = 0;
  foreach ($karma_qry->posts as $p) {
      // assumendo che $dont_show_me sia un array
      $dont_show_me[] = $p->ID;
  }
  $args['post__not_in'] = $dont_show_me;
} else {
  $args['posts_per_page'] = 9;
  $args['meta_query'][0]['value'] = 0;
}

$the_rest_qry = new WP_Query($args);

Non posso testarlo perché non ho i tuoi dati karma sul mio server, ma sono abbastanza sicuro che sia corretto. Dovrebbe portarti almeno sulla buona strada.

5 mag 2013 21:40:22
Commenti

Grazie per la tua risposta. Ma il tuo codice mostra solo i post con karma = 100. Voglio mostrare tutti i post con karma >= 0 MA se il post ha karma = 100 mostrare solo 3 di essi. (Modificherò la mia domanda).

hawkidoki hawkidoki
5 mag 2013 22:12:37

@hawkidoki : vedi la modifica.

s_ha_dum s_ha_dum
6 mag 2013 00:12:49

Soluzione davvero interessante! Per gli altri, c'è un errore verso la fine del tuo codice $args['post__no_in'] (dovrebbe essere post__not_in).

La tua soluzione sembra funzionare, devo solo sistemarla un po', ma l'idea è ottima :) Grazie mille!

hawkidoki hawkidoki
6 mag 2013 01:23:41

@hawkidoki : Correggerò quell'errore. Grazie. Sia le domande che le risposte qui sono modificate dalla community, come un wiki. Puoi correggere errori come quello anche tu stesso.

s_ha_dum s_ha_dum
6 mag 2013 02:39:11