Query personalizzata con ordinamento per meta_value di un campo personalizzato

24 apr 2011, 02:33:13
Visualizzazioni: 165K
Voti: 47

Come sapete, da WP3.0 ci sono opzioni per query personalizzate avanzate, il che è fantastico. Per questo motivo, alcuni parametri di query per i campi personalizzati come meta_key, meta_value sono stati deprecati in favore del nuovo parametro meta_query (vedi qui)

Sto cercando di realizzare una query piuttosto semplice con la nuova sintassi, interrogando i post di un certo post_type (services) che contengono una specifica meta_key (order_in_archive) - questo funziona come previsto. Tuttavia, voglio ordinare la query per meta_value, ma senza successo.

Questa è la mia query -

query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

Ho provato a usare orderby anche con meta_value_numeric e meta_value, ma in ogni caso i risultati vengono ordinati per data di pubblicazione (come fanno i post normali). Qualcuno sa come si può fare?

Grazie

0
Tutte le risposte alla domanda 8
0
40

Puoi definire la meta key per il parametro orderby utilizzando il vecchio metodo (ho testato su WP 3.1.1)...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //oppure 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);
24 apr 2011 12:31:24
3
32

Questo problema in generale è stato risolto a partire da WordPress 4.2 utilizzando query con nomi. Ad esempio:

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // a meno che il campo non sia numerico
)));

Nel mio caso, volevo ordinare in base a un campo numerico e ho dovuto utilizzare 'type' => 'NUMERIC' all'interno della meta query.

15 nov 2016 03:07:52
Commenti

Ottima scoperta sulle query con nome!

Kaji Kaji
30 lug 2017 08:15:49

Sì, anche per me le query con nome hanno risposto alla domanda.

Dalton Rooney Dalton Rooney
1 ago 2017 02:18:22

Eccellente. Non sono sicuro del significato di 'value' in quella order_clause perché non è obbligatorio dato che ordinerà comunque dal valore più alto al più basso di 'order_in_archive'.

Andrew Schultz Andrew Schultz
7 dic 2018 05:34:47
2
12

Il WP Codex risulta effettivamente confusionario quando affronta questo problema.

In realtà non è necessario il parametro meta_query per utilizzare orderby, invece utilizza il parametro meta_key, che sebbene secondo il WP Codex sia deprecato, è stato stabilito qui: Come si utilizza orderby con meta_query in Wordpress 3.1? che orderby ha ancora bisogno del meta_key.

quindi dovrebbe essere

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
24 apr 2011 03:07:14
Commenti

Beh, sì, questo è il vecchio metodo per eseguire questa query e sembra funzionare per quella specificata. Tuttavia, per query più complesse, non funzionerà. Ho scoperto che si tratta di un problema noto che è in fase di risoluzione, i dettagli possono essere trovati nei ticket trac #15031 e #17065

Maor Barazany Maor Barazany
24 apr 2011 03:14:09

Stavo utilizzando il plugin Toolset per creare attributi personalizzati, per usare lo 'slug' di un attributo personalizzato come filtro dovevo aggiungere il prefisso wpcf-. ESEMPIO: 'meta_key' => 'wpcf-order_in_archive'

johnsnails johnsnails
19 lug 2021 05:23:56
0

È semplice:

Ecco il mio codice:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

Il dettaglio principale è: includere meta_key, il mio codice non ordinava a meno che meta_key non fosse incluso, e questo è tutto:

Ecco il codice completo per una lista di immagini di directors ordinate per director_weight:

<?php 
    query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
    ) );
    while (have_posts()) : the_post();
?>  
    <li <?php echo get_field('director_weight') ?>>
        <img src="<?php echo get_field('director_imagen') ?>" alt="Foto del direttore" title="Foto del direttore">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

Ordinare per campo personalizzato WordPress

7 lug 2017 00:29:22
0

Non utilizzare query_posts.

$meta_query = new WP_Meta_Query( $meta_query_args );

$meta_query_args = array(
   'post_type' => 'services',
    'order'     => 'ASC',
    'meta_key' => 'your_key',
    'orderby'   => 'meta_value', // oppure 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

Utilizza i parametri WP_Meta_Query

7 ago 2015 14:32:13
0

Avevo una serie di date personalizzate di eventi che dovevo ordinare in ordine decrescente per data. Poiché la mia data personalizzata dell'evento era memorizzata nella tabella wp_postmeta e di solito era diversa dalle date post_date o modified, questa soluzione ha funzionato per me:

  $args = array(
    'post_type' => 'events', // il mio post type - il tuo può essere 'posts'
    'post_status' => 'publish', // ottieni solo post con questo stato
    'orderby' => 'meta_value', // ordina per il meta_value della seguente meta_key
    'meta_key' => 'my_custom_eventdate', // il nome personalizzato della meta_key
    'order'=> 'DESC' // ordina in modo decrescente
  );

  $posts = new WP_Query($args);

Puoi quindi scorrere i $posts in questo modo:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // e così via...

    // # esempio di come recupero la data del mio evento
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}
19 gen 2017 22:00:51
0

La seguente soluzione funziona:

$args = array(
    'post_type' => 'services',
    'order' => 'ASC',
    'orderby'   => 'order_clause',   
    'meta_query' => array(
        'order_clause' => array(
            'key' => 'order_in_archive'
        )
    )
);

È necessario fornire la chiave del sotto-array meta_query chiamato order_clause come valore per orderby.

17 mar 2019 13:55:48
2

Ho trovato che questa soluzione funziona piuttosto bene.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //oppure 'meta_value_num'
      )
);
28 dic 2012 21:07:37
Commenti

La domanda riguarda il parametro relativamente nuovo meta_query e il far funzionare un orderby con esso, e non riguarda i parametri più vecchi ma ancora funzionanti meta_key/meta_value. Inoltre, non incoraggiamo l'uso di query_posts.

s_ha_dum s_ha_dum
28 dic 2012 21:55:19

Questa risposta contiene diverse pratiche errate: l'uso di -1, passarlo come stringa, l'uso di query_posts. Dovrebbe essere rimossa.

Ihor Vorotnov Ihor Vorotnov
1 mar 2019 11:18:12