Je ne sais pas si je vais dans la bonne direction ou non, cela semble être beaucoup de gens qui le font, mais avec des façons complètement différentes de le faire, des requêtes dans les modèles aux fonctions, donc je ne suis pas sûr de la route à suivre.
J'ai un type de message personnalisé (entreprise) qui a mis en vedette des messages. Chacun de ces messages a un post_meta "Featured_listing" qui est VIDE ou une valeur "vedette-listing" ** attachée au message. J'aimerais afficher les articles qui n'ont pas de valeur post_meta vide au-dessus de tous les autres articles dans les résultats de recherche et les catégories.
** Notez le - plutôt que _ pour la valeur.
C'est ce que je pensais qui pourrait fonctionner, mais je commence à penser que je suis en train d'aboyer sur le mauvais arbre.
// Order posts by meta data
function custom_special_sort( $query ) {
//is this the main query and is this post type of post
if ( $query->is_main_query() && $query->is_post_type( 'business' ) ) {
//Do a meta query
$query->get_post_meta(get_the_ID(), "featured_listing", TRUE);
//sort by a meta value
$query->set( 'orderby', 'featured_listing' );
$query->set( 'order', 'ASC' );
}
}
add_action( 'pre_get_posts', 'custom_special_sort' );
J'ai aussi juste essayé de le faire légèrement différemment, ci-dessous. Mais pourrait faire avec quelques conseils quant à pourquoi cela ne fonctionne pas ou si im même le faire correctement:
function custom_special_sort( $query ) {
// Check this is main query and other conditionals as needed
if ( $query->is_main_query() && $query->is_post_type( 'business' ) ) {
$query->set(
'meta_query',
array(
array(
'key' => 'featured_listing',
'value' => 'featured-listing',
'orderby' => 'featured_listing',
'order' => 'DESC'
)
)
);
}
}
add_action( 'pre_get_posts' , 'custom_special_sort' );
Vous avez quelques problèmes avec le code que vous essayez.
Pour vérifier que la requête concerne votre archive CPT : Vous utilisez $query->is_post_type()
mais cela ne fonctionne pas (pour autant que je sache, ce n'est même pas une fonction ). Au lieu de cela, vous pouvez utiliser soit:
if (is_post_type_archive('business')) {...}
ou (si ce n'est pas seulement sur la page d'archive)
if ($query->get('post_type') == 'business') {...}
Pour commander par méta-valeur dans pre_get_posts , vous devez définir le meta_key
ainsi que la orderby
(et éventuellement order
).
Fonction complète: En les appliquant à votre fonction "custom_special_sort", nous obtenons:
function custom_special_sort( $query ) {
// if is this the main query and is this post type of business
if ( $query->is_main_query() && is_post_type_archive( 'business' ) ) {
// order results by the meta_key 'featured_listing'
$query->set( 'meta_key', 'featured_listing' );
$query->set( 'orderby', 'featured_listing' );
$query->set( 'order', 'DESC' );
}
}
add_action( 'pre_get_posts', 'custom_special_sort' );
J'ai marqué la réponse de Fluffykittens ci-dessus comme étant la réponse correcte. Je voulais élargir la réponse (j'espère que cela aidera quelqu'un d'autre).
Avec la réponse fournie par Fluffykitten, j'ai découvert qu'avec mon thème particulier, j'utilisais une boucle différente pour les archives et la taxonomie personnalisée, ce qui entraînait la réorganisation des publications travaillant sur mes archives de recherche dans lesquelles is_post_type_archive
était vrai. Cependant, ma taxonomie n’a pas été archivée, la modification de la requête pour inclure is_tax
a permis de la faire fonctionner.
Pas sûr que ce soit le meilleur moyen d’ajouter à la requête en tant que novice php, mais cela fonctionne. Quelqu'un est le bienvenu pour corriger/améliorer :)
function custom_special_sort( $query ) {
// if is this the main query and is this post type of business
if ( ($query->is_main_query() && is_post_type_archive('business')) || (is_main_query() && is_tax ('location')) ) {
// order results by the meta_key 'featured_listing'
$query->set( 'meta_key', 'featured_listing' );
$query->set( 'orderby', 'featured_listing' );
$query->set( 'order', 'DESC' );
}
}
add_action( 'pre_get_posts', 'custom_special_sort' );