web-dev-qa-db-fra.com

Requête personnalisée avec commande de meta_value du champ personnalisé

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 font les publications classiques). Quelqu'un sait comment cela peut être fait?

Merci

34
Maor Barazany

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'
                                )
                            )
    )
);
34
Ján Bočínec

Ce problème est en général résolu dans WordPress 4.2 en utilisant des 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' dans la méta requête.

12
Ryan Taylor

Le codex WP crée de la confusion lorsqu'il est question de résoudre 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 bien que par WP Codex soit obsolète, a été établi ici: Comment utiliser orderby avec meta_query dans Wordpress 3,1? cette commande a toujours besoin de la méta_key.

il devrait être

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

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 été commandé que si meta_key est inclus, et c’est tout:

Voici le code complet d'une liste d'images directors ordonné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 

2
Jesus CMD

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

1
Brad Dalton

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
recurse

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

0
pingle60

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'
      )
);
0
gegere