Je veux interroger par 1 clé méta, mais trier par une autre clé qui peut ou non exister, et puis par date de publication
Donc, le résultat final serait quelque chose comme:
Clé méta A/Date 1
Clé méta A/Date 2
Clé méta B/Date 1
Pas de clé méta/Date 1
Pas de clé méta/Date 2
Les arguments de requête tels que les suivants ne renvoient aucun message:
$customer_orders = get_posts( array(
'numberposts' => $order_count,
'meta_query' => array(
array(
'key' => '_customer_user',
'value' => get_current_user_id(),
'compare' => '=',
),
array(
'key' => '_dealer_number',
'compare' => 'EXISTS',
),
array(
'key' => '_dealer_number',
'compare' => 'NOT EXISTS',
),
'relation' => 'AND'
),
'orderby' => 'meta_value date',
'order' => 'ASC'
) );
Est-ce possible avec WP_Query
args ou dois-je filtrer posts_orderby
? Si oui, que pourrais-je utiliser?
Je ne pense pas qu'il y ait un moyen de le faire sans utiliser de filtres. En utilisant posts_clauses
vous pourriez faire:
function wpse163696_posts_clauses( $pieces, $query ) {
if ( $query->get( 'orderby' ) != 'dealer_date' ) {
return $pieces;
}
global $wpdb;
$order = $query->get( 'order' );
$pieces[ 'join' ] .= $wpdb->prepare(
' LEFT JOIN ' . $wpdb->postmeta . ' dealer_pm ON dealer_pm.post_id = ' . $wpdb->posts . '.ID AND dealer_pm.meta_key = %s'
, '_dealer_number' );
$pieces[ 'orderby' ] = 'ISNULL(MAX(dealer_pm.meta_value)) ' . $order . ', MAX(dealer_pm.meta_value) ' . $order . ', ' . $wpdb->posts . '.post_date ' . $order;
return $pieces;
}
Votre requête devient alors:
add_filter( 'posts_clauses', 'wpse163696_posts_clauses', 10, 2 );
$customer_orders = get_posts( array(
'numberposts' => $order_count,
'meta_query' => array(
array(
'key' => '_customer_user',
'value' => get_current_user_id(),
'compare' => '=',
),
),
'orderby' => 'dealer_date',
'order' => 'ASC',
'suppress_filters' => false,
) );
remove_filter( 'posts_clauses', 'wpse163696_posts_clauses', 10 );
Vous avez quelques erreurs là-bas, je crois.
1) Il n’existe pas de paramètre tel que "numéro". Peut-être que vous voulez dire 'posts_per_page'? C’est ce que vous devez utiliser pour déterminer le nombre de messages à afficher.
2) Lors de la commande par méta-valeur, la syntaxe correcte doit être la suivante:
'orderby' => 'meta_value',
'meta_key' => 'key_name',
Où key_name est le champ personnalisé dont vous utilisez la méta_value pour orderby.
Donc, en fonction de votre question, votre requête pourrait ressembler à ceci:
$customer_orders = get_posts(
array(
'posts_per_page' => $order_count,
'no_found_rows' => true,
'meta_query' => array(
array(
'key' => '_customer_user',
'value' => get_current_user_id(),
'compare' => '=',
),
array(
'key' => '_dealer_number',
'compare' => 'EXISTS',
),
array(
'key' => '_dealer_number',
'compare' => 'NOT EXISTS',
),
'relation' => 'AND'
),
'orderby' => 'meta_value',
'meta_key' => 'date',
'order' => 'ASC'
)
);
(Notez que j'ai ajouté 'no_found_rows'. Si vous savez combien de messages vous allez interroger et que vous n'avez pas besoin de pagination, cet ajout accélérera grandement votre requête).