web-dev-qa-db-fra.com

Trier les messages de plusieurs sites par date

J'ai une installation WordPress Multisite où j'ai besoin de rassembler tous les articles dans un seul flux sur le site principal. J'ai essayé d'utiliser une requête SQL, mais cela m'a empêché d'accéder à beaucoup de données nécessaires. J'ai maintenant une approche différente, mais je ne peux pas trouver un moyen de trier tous les messages différents par date.

foreach( $sites as $site ){
  switch_to_blog( $site['blog_id'] );

    $allBlogPosts = get_posts( array(
      'posts_per_page'   => -1,
      'orderby'          => 'date',
        'order'            => 'DESC'
    ));

    foreach( $allBlogPosts as $post ){
      setup_postdata( $post ); ?>
      <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <header class="post__header">
          <?php the_post_thumbnail(); ?>
          <?php if(!is_single()) { ?>
            <time class="timeStamp"><span class="timeStamp__month"><?php the_time("d"); ?> </span> <span class="timeStamp__day"> <?php the_time("F"); ?> </span> </time>
          <?php } ?>
          <?php
            if ( is_single() ) {
              the_title( '<h1 class="post__title">', '</h1>' );
            } else {
              the_title( '<h2 class="post__title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );
            }

          if ( 'post' === get_post_type() && is_single() ) : ?>
          <div class="post__meta">
            <?php themway_posted_on(); ?>
          </div><!-- .post__meta -->
          <?php
          endif; ?>
        </header><!-- .post__header -->
        <div class="post__content">
          <?php
            the_content( sprintf(
              /* translators: %s: Name of current post. */
              wp_kses( __( 'Continue reading %s <span class="meta-nav">&rarr;</span>', 'themway' ), array( 'span' => array( 'class' => array() ) ) ),
              the_title( '<span class="screen-reader-text">"', '"</span>', false )
            ) );

            wp_link_pages( array(
              'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'themway' ),
              'after'  => '</div>',
            ) );
          ?>
        </div><!-- .post__content -->
      </article><!-- post -->
      <?php
      wp_reset_postdata();
    }// end foreach for $skiPost as $post

    restore_current_blog();
  }// end foreach for $sites as $site

Alors maintenant, le contenu est trié par blog, il convient donc à chaque blog, mais je dois tout combiner pour créer un gros flux Nice.

1
jrnd.bjrkhg

Vous pouvez simplement usort le tableau avant de le parcourir.

$allBlogPosts = get_posts( array(
  'posts_per_page'   => -1,
  'orderby'          => 'date',
    'order'            => 'DESC'
));

usort($allBlogPosts, 'sortPosts');    

function sortPosts($a, $b){
    return strtotime($a->post_date) - strtotime($b->post_date);
}

//Your display loop...

Pour votre information, si vous utilisez PHP> = 5.3, vous pouvez utiliser une fermeture , ce qui, à mon avis, est plus propre pour ce genre de chose.

Edit: La raison ci-dessus ne fonctionne pas parce que j’ai mal interprété votre code et que je ne me suis pas rendu compte que le tableau $allBlogPosts ne contient jamais plus de 1 blogues à la fois. Cela devrait fonctionner:

$allPosts = [];
foreach( $sites as $site ){
  switch_to_blog( $site['blog_id'] );

    $allBlogPosts = get_posts( array(
      'posts_per_page'   => -1,
      'orderby'          => 'date',
        'order'            => 'DESC'
    ));

    foreach( $allBlogPosts as $post ){
      ob_start();
      setup_postdata( $post ); ?>
      <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <header class="post__header">
          <?php the_post_thumbnail(); ?>
          <?php if(!is_single()) { ?>
            <time class="timeStamp"><span class="timeStamp__month"><?php the_time("d"); ?> </span> <span class="timeStamp__day"> <?php the_time("F"); ?> </span> </time>
          <?php } ?>
          <?php
            if ( is_single() ) {
              the_title( '<h1 class="post__title">', '</h1>' );
            } else {
              the_title( '<h2 class="post__title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );
            }

          if ( 'post' === get_post_type() && is_single() ) : ?>
          <div class="post__meta">
            <?php themway_posted_on(); ?>
          </div><!-- .post__meta -->
          <?php
          endif; ?>
        </header><!-- .post__header -->
        <div class="post__content">
          <?php
            the_content( sprintf(
              /* translators: %s: Name of current post. */
              wp_kses( __( 'Continue reading %s <span class="meta-nav">&rarr;</span>', 'themway' ), array( 'span' => array( 'class' => array() ) ) ),
              the_title( '<span class="screen-reader-text">"', '"</span>', false )
            ) );

            wp_link_pages( array(
              'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'themway' ),
              'after'  => '</div>',
            ) );
          ?>
        </div><!-- .post__content -->
      </article><!-- post -->
      <?php
      $allPosts[] = ['display'=>ob_get_clean(), 'post_date'=>get_the_time('U')];
      wp_reset_postdata();
    }// end foreach for $skiPost as $post

    restore_current_blog();
  }// end foreach for $sites as $site        

  function sortPosts($a, $b){
    return $a['post_date'] - $b['post_date'];
  }
  usort($allPosts, 'sortPosts'); 
  foreach($allPosts as $p) echo $p['display'];
1
TheGentleman