Je travaille sur un modèle de page de terme de taxonomie personnalisé où nous voulons que les éléments qui sont connectés au terme soient triés par date de publication (champ de date personnalisé) - et s'il y a plusieurs éléments le même jour (formaté comme AAAA-MM- DD) pour ensuite les trier par titre, et enfin trier par titre si le champ personnalisé n'a pas été rempli (anciens éléments).
Donc, je l'ai essayé de cent façons différentes avec un WP_query et il retourne la plupart des résultats comme je le veux - mais dans ce cas, il ne renvoie que les éléments qui ont la méta-clé de publication_date. Tous les autres éléments sont ignorés et ne s'affichent pas. J'ai essayé une méta-requête en utilisant une relation "ou" et j'ai comparé la date de publication comme EXISTE et NON EXISTE, mais cela a renvoyé 0 résultat pour moi.
En outre, le site exécute toujours la version 3.5.2 et ils ne souhaitent pas effectuer de mise à niveau.
Voici ma requête la plus récente qui m'obtient les articles dont le champ personnalisé publication_date s'affiche dans le bon ordre:
$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => $term->name,
)),
'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));
J'ai également essayé d'utiliser wpdb et d'exécuter une requête SQL, mais je ne sais vraiment pas comment accomplir ce que je veux faire. Si quelqu'un pouvait m'aider, ce serait génial!
Merci d'avance.
la source
'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),
mais la commande ne fonctionne pas: \Réponses:
Merci à tous pour votre aide!
En fin de compte, la requête ci-dessous m'a donné les résultats que je souhaitais - qui était d'afficher et de trier les messages par un champ personnalisé de "publication_date" en premier - trier par la date et s'il y avait plusieurs de la même date (disons, 4 marqués Juin 2013), il les classerait par titre. Ensuite, après avoir parcouru tous les messages dont la date de publication est remplie, il parcourra à nouveau les messages restants, alphabétiquement par titre.
Cela m'obtient les résultats définis dans la même requête et conserve ma pagination:
la source
meta_query
sur la même touche!meta_key
automatiquement, il ne l'inclut même pas avecNOT EXISTS
. J'espère vraiment que je fais quelque chose de mal.'meta_key' => 'publication_date',
.Quelques années plus tard, le code publié par CSSGirl ne fonctionnait pas pour moi car il y avait des messages qui n'avaient pas la méta-clé ou la méta-clé était vide, c'est donc ce que je devais faire pour que tous les messages soient classés par date et montrez d'abord celles avec une méta-clé:
la source
Je pense que vous auriez besoin de faire 2 boucles distinctes. Vous pouvez capturer tous les messages trouvés dans la première boucle et les exclure de la boucle secondaire assez facilement:
Exécutez ensuite votre deuxième boucle.
la source
echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
Y a-t-il une raison pour laquelle vous ne pouviez pas appliquer la méta-clé publication_date pour chaque publication avec une valeur vide?
Donc, dans votre
save_post
action, vous ajouteriez / mettriez à jour la méta-clé, que la$_POST
valeur soit vide ou non.Vous devrez exécuter un script de mise à jour pour parcourir vos anciens messages et ajouter la clé avec une valeur vide, par exemple:
Exécutez-le en accédant à http://example.com/wp-admin/?update_old_posts
Ensuite, vous pouvez utiliser la même requête que vous. Vous voudrez peut-être ajouter un filtre supplémentaire pour vous permettre de trier par différentes colonnes dans différentes directions, cela me semblerait logique de trier par date en ordre décroissant et par titre en ordre croissant.
la source
J'ai créé une clause where personnalisée. Je l'ai testé en utilisant
$wp_query->request
juste avant ma boucle principale, je ne connais pas vraiment bien SQL, mais cela semblait faire fonctionner les choses.Sinon, vous pouvez définir
compare
à'EXISTS'
changer la ligne add_trending_where à$where .= " OR ($wpdb->postmeta.post_id IS NULL)";
. Il vous suffirait alors de modifier la valeur de la clé en un seul endroit. Encore une fois,$wp_query->request
faites écho et jouez si vous voulez mieux comprendre ou modifier.EDIT: Je viens de remarquer que cela ne fonctionne pas si
meta_key
est défini sur la requête. Vous pouvez utiliser$query->set('meta_key', NULL);
si vous le devez.EDIT 2: J'ai obtenu ce travail avec la méthode ci-dessus. Pour une raison quelconque, ce n'était pas au début (peut-être que meta_key a été défini ... je ne sais pas).
la source