Ce qui suit tax_query
renvoie uniquement les messages correspondants (avec le tableau de taxonomie IN ‘matchedstring’):
function only_returns_matched_posts( $query ) {
if( !$query->is_main_query() || is_admin() )
return;
$taxquery = array(
array(
'taxonomy' => 'mygroup',
'field' => 'slug',
'terms' => 'matchedstring',
'compare'=> 'IN'
)
);
$query->set( 'tax_query', $taxquery );
}
add_action( 'pre_get_posts', 'only_returns_matched_posts' );
Je veux que les messages correspondants soient regroupés en haut de la requête avec les autres messages suivants. Est-il possible soit :
- utiliser ce format avec un
orderby
- faire 2 requêtes distinctes et les fusionner
- utiliser une requête Group By SQL personnalisée
MODIFIER
J’ai réussi à fusionner 2 requêtes mais je perds le menu_order lorsque je postule post__in
garder le $queryA
+ $queryB
commande. Dois-je obtenir des identifiants différemment qu’avec $query->posts
pour garder l’original menu_order
des requêtes ?
function group_matched_posts_at_top( $query ) {
// Check if this is the main query and not in the admin area
if( !$query->is_main_query() || is_admin() )
return;
// Get posts with matched taxonomy + posts without taxonomy
$queryAparams = array(
'posts_per_page' => -1,
'post_type' => 'product',
'order_by' => 'menu_order',
'order' => 'ASC',
'fields' => 'ids',
'tax_query'=> array(
'relation' => 'OR',
array(
'taxonomy' => 'pa_group',
'field' => 'slug',
'terms' => 'matchedstring',
'operator' => 'IN'
),
array(
'taxonomy' => 'pa_group',
'operator' => 'NOT EXISTS'
)
)
);
// Get posts with other taxonomies
$queryBparams = array(
'posts_per_page' => -1,
'post_type' => 'product',
'order_by' => 'menu_order',
'order' => 'ASC',
'fields' => 'ids',
'tax_query'=> array(
'relation' => 'AND',
array(
'taxonomy' => 'pa_group',
'field' => 'slug',
'terms' => 'matchedstring',
'operator' => 'NOT IN'
),
array(
'taxonomy' => 'pa_group',
'operator' => 'EXISTS'
)
)
);
$queryA = new WP_Query($queryAparams);
$queryB = new WP_Query($queryBparams);
// Merging ids
$postIDs = array_merge($queryA->posts,$queryB->posts);
if(!empty($postIDs)){
$query->set('post__in', $postIDs);
$query->set('orderby', 'post__in');
}
}
add_action( 'woocommerce_product_query', 'group_matched_posts_at_top' );
MODIFIER2
Je posterai ma propre réponse. J’ai dû supprimer le 'fields' => 'ids'
paramètres pour conserver les requêtes menu_order
et arrachez les identifiants après les avoir recourus.