Query personalizzata con ordine per meta_valore del campo personalizzato


37

Sai, a partire da WP3.0 ci sono opzioni per query avanzate personalizzate, il che è fantastico. A partire da questo momento, alcuni parametri di query di campi personalizzati come meta_key, meta_value sono stati deprecati per il nuovo parametro meta_query ( vedi qui )

Cerco di avere una query piuttosto semplice con la nuova sintassi, i post di query di un determinato post_type (servizi) che contiene un meta_key specificato (order_in_archive) - questo sta andando bene come previsto. Ma - Voglio ordinare la query in base al meta_value e senza successo.

Questa è la mia domanda -

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

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

Grazie

Risposte:


35

È possibile definire la meta chiave 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', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);

15

Questo problema in generale viene risolto in WordPress 4.2 utilizzando query denominate. per esempio

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // unless the field is not a number
)));

Per me, volevo ordinare per un campo numerico e dovevo usare 'type' => 'NUMERIC'all'interno della meta query.


1
Fantastica scoperta sulle query denominate!
Kaji,

Sì, anche le domande con nome hanno risposto alla domanda.
Dalton,

Eccellente. Non sono sicuro del significato di 'valore' in quell'ordine_clauso perché non è richiesto in quanto lo ordinerà dal valore più alto al più basso di 'ordine_in_archivo'.
Andrew Schultz,

10

Il codice WP è in realtà fonte di confusione quando si affronta questo problema.

In realtà non hai bisogno del parametro meta_query per usare orderby, invece usa il parametro meta_key, che sebbene con WP Codex sia deprecato è stato stabilito qui: Come usi orderby con meta_query in Wordpress 3.1? quell'ordine ha ancora bisogno della meta_key.

così dovrebbe essere

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )

2
Bene, sì, questo è il vecchio metodo per fare questa query e sembra funzionare per questo specificato. Comunque, per domande più complesse, non funzionerà. Ho scoperto che si tratta di un problema noto che viene risolto , i dettagli sono disponibili nei biglietti trac # 15031 e # 17065
Maor Barazany,

2

È facile:

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 è: include meta_key, il mio codice non è stato ordinato a meno che non meta_keysia incluso, e questo è tutto:

Ecco il codice completo di un elenco di directorsimmagini 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') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

order_by wordpress fiel personalizzato


1

Non usare 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', //or 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

Utilizzare i parametri WP_Meta_Query


0

Ho trovato che funziona abbastanza bene.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //or 'meta_value_num'
      )
);

3
La domanda è circa il nuovo-ish meta_queryparametri e ottenere un orderbyal lavoro con esso, e non delle più vecchie ma ancora funzionali meta_key/ meta_valueparametri. Inoltre, non incoraggiamo l'uso di query_posts.
s_ha_dum,

Questa risposta contiene più cattive pratiche: usare -1, passarlo come una stringa, usando query_posts. Dovrebbe essere rimosso.
Ihor Vorotnov

0

Avevo una serie di date personalizzate per gli eventi che dovevo ordinare per data decrescente. Poiché la data del mio evento personalizzato è stata memorizzata nella mia tabella wp_postmeta ed era generalmente diversa dalla data post_data o dalle date modificate, questo ha funzionato per me:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

È quindi possibile eseguire il ciclo tra $ post in questo modo:

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

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

0

Questo lavoro per me,

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

Necessario solo per fornire la chiave per order_clause

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.