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

33

Vous savez, à partir de WP3.0, il existe des options pour les requêtes avancées personnalisées, ce qui est excellent. À partir de cela, 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 posts 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 sont les publications classiques). Quelqu'un sait comment cela peut être fait?

Merci

    
posée Maor Barazany 24.04.2011 - 01:33

7 réponses

34

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'
                                )
                            )
    )
);
    
réponse donnée Ján Bočínec 24.04.2011 - 11:31
9

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 utilisez-vous orderby avec meta_query dans Wordpress 3.1? si orderyby a toujours besoin de la meta_key.

donc il devrait être

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
    
réponse donnée Evan Yeung 24.04.2011 - 02:07
9

Pour moi, je voulais commander par un champ numérique et je devais utiliser 'type' => 'NUMERIC' dans la méta-requête.

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
)));
    
réponse donnée Ryan Taylor 15.11.2016 - 02:07
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 le suivant: include meta_key , mon code n’a pas été commandé à moins que meta_key ne soit inclus, et c’est tout:

Voici le code complet d'une liste de directors images commandé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();
?>

    
réponse donnée Jesus CMD 06.07.2017 - 23:29
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 les paramètres WP_Meta_Query

.     
réponse donnée Brad Dalton 07.08.2015 - 13:32
0

J'ai trouvé que cela fonctionnait 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'
      )
);
    
réponse donnée gegere 28.12.2012 - 20:07
0

J'avais 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 suit:

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);
}
    
réponse donnée recurse 19.01.2017 - 21:00

Lire d'autres questions sur les étiquettes