Requête personnalisée avec orderby meta_value du champ personnalisé


37

Comme vous le savez, depuis WP3.0, il existe des options pour les requêtes avancées personnalisées, ce qui est excellent. De ce fait, certains paramètres de requête de champs personnalisés tels que meta_key, meta_value étaient obsolètes pour le nouveau paramètre meta_query ( voir ici ).

J'essaie d'avoir une requête assez simple avec la nouvelle syntaxe, interroger les messages d'un certain post_type (services) contenant une méta_key spécifiée (order_in_archive) - cela se déroule comme prévu. Mais - je veux passer commande par la meta_value, et sans succès.

Ceci est ma requête -

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

J'ai essayé orderby également par meta_value_numeric et meta_value, mais dans tous les cas, les résultats sont classés par date de publication (comme le font les publications classiques). Quelqu'un sait comment cela peut être fait?

Merci

Réponses:


35

Vous pouvez définir la clé méta pour le paramètre orderby en utilisant l'ancienne méthode (j'ai testé sur 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

Ce problème est généralement résolu dans WordPress 4.2 à l'aide de requêtes nommées. par exemple

$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
)));

Pour moi, je voulais commander par un champ numérique et je devais utiliser 'type' => 'NUMERIC'à l'intérieur de la méta requête.


1
Super trouvaille sur les requêtes nommées!
Kaji

Oui, les requêtes nommées ont répondu à la question pour moi aussi.
Dalton

Excellent. Je ne suis pas sûr de la signification de 'valeur' ​​dans cette clause order_clause car elle n'est pas obligatoire car elle sera ordonnée en fonction de la valeur la plus élevée à la plus basse de 'order_in_archive'.
Andrew Schultz

10

Le WP Codex est réellement déroutant lorsqu'il aborde ce problème.

Vous n'avez pas réellement besoin du paramètre meta_query pour utiliser orderby, mais du paramètre meta_key, qui a été créé ici même si WP Codex est obsolète: Comment utiliser orderby avec meta_query dans Wordpress 3.1? cette commande a toujours besoin de la meta_key.

il devrait être

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

2
Eh bien, oui, il s’agit de l’ancienne méthode pour exécuter cette requête et elle semble fonctionner pour celle spécifiée. Quoi qu'il en soit, pour les requêtes plus complexes, cela ne fonctionnera pas. J'ai trouvé qu'il s'agissait d'un problème connu dont on s'occupe, des détails peuvent être trouvés dans les tickets de trac n ° 15031 et n ° 17065
Maor Barazany le

2

C'est facile:

Voici mon code:

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

Le détail principal est: include meta_key, mon code n’a pas été commandé à moins qu’il ne meta_keysoit inclus, et c’est tout:

Voici le code complet d'une liste de directors photos classées par 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 custom fiel wordpress


1

N'utilisez pas 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'
)));

Utilisez le paramètres WP_Meta_Query


0

J'ai trouvé que cela fonctionne assez bien.

<?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 question concerne le meta_queryparamètre new-ish et comment l’utiliser orderby, et non pas le plus ancien mais toujours fonctionnel meta_key/meta_value paramètres paramètres . Aussi, n'encourageons pas l'utilisation de query_posts.
s_ha_dum

Cette réponse contient plusieurs mauvaises pratiques: utilisation de -1, transmission sous forme de chaîne, à l'aide de query_posts. Il devrait être supprimé.
Ihor Vorotnov

0

J'ai eu un ensemble de dates d'événements personnalisés que je devais trier par date décroissante. Étant donné que ma date d'événement personnalisé était stockée dans ma table wp_postmeta et était généralement différente de la date de post_date ou des dates modifiées, cela fonctionnait pour moi:

  $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);

Vous pouvez ensuite parcourir $ posts comme ceci:

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

Ce travail pour moi,

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

Nécessaire uniquement pour fournir la clé pour la clause order_clause

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.