X

wp query – Comment mettre des messages avec une taxonomie au-dessus des autres dans `pre_get_posts`


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.