web-dev-qa-db-fra.com

Trier les posts qui a une méta valeur en premier, puis le reste des posts

Je suis en utilisant le pre_get_posts hook pour personnaliser ma requête pour une archive de type publication personnalisée.

Certaines publications de ce type de publication personnalisée ont une clé méta mp_micropub_accredited avec la méta valeur de 1 et d'autres n'ont pas cet ensemble de clés méta.

J'utilise le code suivant,

 fonction micropubs_filter_posts ($ requête) {
 if (! is_admin () && $ requête-> is_post_type_archive ('micropubs') && $ requête-> is_main_query ()) {
 $ query-> set ('posts_per_page', 5); 
 $ accredited = filter_input (INPUT_GET, 'orderby', FILTER_SANITIZE_STRING); 
 if (vide ($ accrédité)) 
 return; 
 if ($ accrédité === 'accrédité') {
 $ query-> set ('meta_key ',' mp_micropub_accredited '); 
 $ query-> set (' orderby ',' meta_value_num '); 
} 
} 
} 
 add_action ('pre_get_posts', 'micropubs_filter_posts'); 

Ainsi, lorsque je localise cette adresse dans mon navigateur, elle affiche uniquement les publications avec le jeu de clés méta et aucune autre publication.

http: // localhost/site/post-type-archive /? orderby = accrédité

Comment est-il possible d'inclure tous les autres postes qui n'ont pas le mp_micropub_accredited meta key set mais sont affichés après ceux qui sont?

Votre aide a beaucoup apprécié. :)

4
Shoebox

Je vous conseillerais lorsque vous mettez à jour des méta-valeurs avec 1 mise à jour avec 0. Je veux dire, définissez la clé dans toutes les publications avec 1 ou 0 pour éviter la requête complexe.

Vous pouvez toujours le faire avec un script simple. Il vérifiera si la clé n'existe pas, puis le mettra à jour avec 0. Votre code actuel fonctionnera comme un charme.

OU

Vous pouvez utiliser compare avec NOT EXISTS

$meta_query = array(
    'relation' => 'OR',
    array(
        'key' => 'mp_micropub_accredited',
        'value' => 1
    ),
    array(
        'key' => 'mp_micropub_accredited',
        'compare' => 'NOT EXISTS'
    )
);
$query->set( 'meta_query', $meta_query );
$query->set( 'orderby', 'meta_value_num' );

Remarque: Cette solution fonctionnera uniquement avec WP> = 3.9 car NOT EXISTS fonctionne uniquement avec les versions 3.5 et supérieures et il y avait un bogue avec NOT EXISTS qui a été corrigé dans la version 3.9!

2
Sumit