web-dev-qa-db-fra.com

La combinaison de deux requêtes wordpress avec la pagination ne fonctionne pas

J'essaie de combiner deux requêtes WordPress mais cela ne fonctionne pas aussi bien que la pagination.

Je souhaite afficher toutes les publications d'aujourd'hui triées par nombre de commentaires, puis toutes les publications (à l'exception de la publication d'aujourd'hui) triées par nombre de commentaires.

Je crois que ce sont les deux requêtes pour accomplir la tâche séparément. Mais comment puis-je les combiner de sorte que la nouvelle requête répertorie les publications du jour d'abord triées par nombre de commentaires, puis le reste des publications triées par nombre de commentaires? Et aussi avec la pagination.

<?php

  $today = getdate();

  $args1 = array(
    'post_type' => 'post',
    'orderby' => 'comment_count',
    'ignore_sticky_posts' => 1,
    'date_query' => array(
      array(
        'year'  => $today['year'],
        'month' => $today['mon'],
        'day'   => $today['mday'],
      ),
    ),
    'paged' => $paged,
  );

  $query1 = new WP_Query( $args1 );

  $args2 = array(
    'post_type' => 'post',
    'orderby' => 'comment_count',
    'ignore_sticky_posts' => 1,
    'paged' => $paged,
  );

  $query2 = new WP_Query( $args2 );

?>

EDIT: 1 //

@ birgire, j'ai essayé la méthode que vous avez suggérée. Mais j'ai cette erreur mysql.

WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-5,5' at line 1]
SELECT SQL_CALC_FOUND_ROWS * FROM ( (SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND ( ( post_date > '2014-08-27 00:00:00' ) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.comment_count DESC LIMIT 1000) UNION ALL (SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND ( ( post_date < '2014-08-27 00:00:00' ) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.comment_count DESC LIMIT 1000 ) ) as combined LIMIT -5,5
5
Robert hue

Vous pouvez essayer ce qui suit (non testé):

Configure les arguments de la requête # 1: (aujourd'hui)

  //-----------------
  // Query part #1:
  //-----------------
  $args1 = array(
     'post_type'           => 'post',
     'orderby'             => 'comment_count',
     'ignore_sticky_posts' => 1,
     'date_query'          => array(
          array(
              'after' => date('Y-m-d'),
          ),
         'inclusive'  => true,
      )
  );

Configure les arguments de la requête # 2: (! Today)

  //-----------------
  // Query part #2:
  //-----------------
  $args2 = array(
      'post_type'           => 'post',
      'orderby'             => 'comment_count',
      'ignore_sticky_posts' => 1,
      'date_query'          => array(
          array(
              'before' => date('Y-m-d'),
          ),
         'inclusive'  => false,
      )
  );

Ensuite on combine:

//---------------------------
// Combined queries #1 + #2:
//---------------------------
$args = array( 
   'posts_per_page' => 5,
   'paged'          => ( $paged = get_query_var( 'paged' ) ) ? $paged : 1 ,
   'sublimit'       => 1000,
   'args'           => array( $args1, $args2 ),
);
$results = new WP_Combine_Queries( $args );

où nous utilisons le WP_Combine_Queries expérimental classe à partir d’ici .

Il utilise actuellement UNION mais vous voudrez peut-être utiliser UNION ALL à la place.

GitHub:

Le plugin est maintenant disponible sur GitHub ici .

4
birgire