web-dev-qa-db-fra.com

Comment commander un type de message personnalisé par plusieurs champs personnalisés?

Comment afficher les articles de type personnalisé 'Event' classés par 'Start_Hour' puis par 'Start_Minute'?

'Start_Hour' et 'Start_Minute' sont des champs personnalisés numériques.

J'ai essayé ça, mais ça ne marche pas:

$args = array(
  'post_type'=>'Events',
  'orderby' => 'meta_value',
  'meta_key' => 'Start_Hour Start_Minute',
  'order' => 'ASC'
);
$loop = new WP_Query( $args );
5
Alessandroweb

Merci à Bainternet J'ai trouvé la solution:

function orderbyreplace($orderby) {
    return str_replace('menu_order', 'mt1.meta_value, mt2.meta_value', $orderby);
}

et...

$args = array(
  'post_type'=>'Events',
  'orderby' => 'menu_order',
  'order' => 'ASC',
  'meta_query' => array(
        array(
            'key' => 'Start_Hour',
            'value' => '',
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'Start_Minute',
            'value' => '',
            'compare' => 'LIKE'
        )
    )
);
1
Alessandroweb

lorsque vous utilisez 'meta_key' => 'Start_Hour Start_Minute', la requête recherche alors les publications avec un champ personnalisé nommé Start_Hour Start_Minute. C'est pourquoi il ne fonctionne pas pour vous.

Mais il existe un moyen de commander par plusieurs champs personnalisés en utilisant le crochet de filtre posts_orderby. Commencez par créer une fonction qui ajoutera vos champs orderby de la manière suivante:

function orderbyreplace($orderby ) {
  global $wpdb;
    return str_replace($wpdb->prefix.'postmeta.meta_value', 'mt1.meta_value, mt2.meta_value ASC', $orderby);
}

puis définissez vos arguments comme suit:

$args = array(
  'post_type'=>'Events',
  'orderby' => 'meta_value',
  'meta_key' => 'Start_Hour',
  'meta_query' => array(
        array(
            'key' => 'Start_Hour',
            'value' => '0',
            'type' => 'NUMERIC',
            'compare' => '!='
        ),
        array(
            'key' => 'Start_Minute',
            'value' => '0',
            'type' => 'NUMERIC',
            'compare' => '!='
        )
    )
);

Voyez comment j'utilise la meta_query qui joindra les deux champs personnalisés et qu'il ne restera plus qu'à accrocher votre fonction orderbyreplace juste avant votre requête:

add_filter('posts_orderby','orderbyreplace');
$loop = new WP_Query( $args );
remove_filter('posts_orderby','orderbyreplace');
7
Bainternet