web-dev-qa-db-fra.com

Obtenir des messages de Réseau (Multisite)

Le code suivant donne toutes les publications du réseau. Ce que j'essaie de réaliser:

  • Sélectionnez les blogs à afficher (par ID)
  • Sélectionnez le nombre de messages à afficher (Mon code sélectionne le nombre de messages par blog )
  • Commande par date ou par hasard

    $blogs = get_last_updated();
    
     foreach ($blogs AS $blog)    {    
    
      switch_to_blog($blog["blog_id"]);
      $lastposts = get_posts('numberposts=3');
    
      foreach($lastposts as $post) : ?>
    
        <a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></h3>
    
      <?php endforeach;
    
      restore_current_blog();
      }
    
6
Noob

J'ai créé un plugin qui fait quelque chose de similaire (appelé Multisite Post Display https://wordpress.org/plugins/multisite-post-reader/ ). Il affiche les messages de tous les sous-sites multisites.

Le code peut être utile pour ce que vous faites. Vous êtes invités à creuser et à utiliser le code pour vous aider dans votre projet. (Après tout, j'ai utilisé des extraits de code d'autres personnes pour le développer.)

Je l'ai écrit après avoir créé l'affichage multimédia multisite, car je voulais un moyen d'afficher des médias à partir de sous-sites sur une seule page et je ne pouvais trouver aucun plugin qui le fasse. Les deux ont été utiles pour surveiller les médias et le contenu posté de mon multisite.

Gratuit, open source, et tout ça. J'espère que c'est utile.

1
Rick Hellewell

Ricks Answer est sûrement utile mais je voulais partager mon approche, qui est une adoption ou une extension de votre code:

Commencez par obtenir une liste des blogs sélectionnés dans votre réseau:

$args = array('site__in' => array(2, 3, 6))
$sitesObj = get_sites($args);
$sites = object_to_array($sitesObj);

Vous pouvez également exclure des sites en utilisant 'site__not_in' dans les arguments de get_sites().

Convertissez l'objet $sitesObj dans un tableau:

$sites = object_to_array($sitesObj);

object_to_array($object) {
  if (!is_object($object) && !is_array($object)) {
    return $object;
  }
  return array_map('object_to_array', (array) $object) ;
}

Puis initialisez un compteur pour contrôler le total des publications à afficher et basculez vers chaque blog sélectionné pour déclencher la boucle avec vos arguments personnalisés:

$postCounter = 0;
$maxPosts = 5; // total number of posts to show

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

  $args = array(
    'post_type' => 'post', // or custom post type
    'posts_per_page' => 2, // number of posts per blog
    'order' => 'DESC',
    'orderby' => 'date' // you could also use 'Rand' here
  );

  $loop = new WP_Query($args);

  if ($loop->have_posts()) :
    while ($loop->have_posts() && $counter < $maxPosts) : $loop->the_post();
      // your output
    endwhile;
  endif;

  restore_current_blog();
}

J'espère que ça aide :)

1

Ce

function wolpostcount_shortcode($atts) {

  function object_to_array($object) {
    if (!is_object($object) && !is_array($object)) {
      return $object;
    }
    return array_map('object_to_array', (array) $object) ;
  }

  $args = array('site__in' => array(1,7,8,12,14,15,20,21,22,25,32,33,36,41,42,46,47,48,49));
  $sitesObj = get_sites($args);
  $sites = object_to_array($sitesObj);

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

    $postcount = wp_count_posts('post')->publish;
    $pagecount = wp_count_posts('page')->publish;
     echo 'Posts:'.$postcount.' Pages:'.$pagecount.'<br>';
    $totalpostcount = $totalpostcount + $postcount;
    $totalpagecount = $totalpagecount + $pagecount;
    restore_current_blog();
  }

  echo 'number of posts '.$totalpostcount.'<br>';
  echo 'number of pages '.$totalpagecount.'<br>';
0
Skeffonics