web-dev-qa-db-ja.com

ネットワーク(マルチサイト)から投稿を取得する

次のコードは、ネットワークからのすべての投稿を示します。私が達成しようとしていること:

  • 表示するブログを(IDで)選択します
  • 表示する投稿数を選択します(私のコードでは、投稿数を選択しますブログごと)。
  • 日付順またはランダムな順序

    $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

私は似たようなことをするプラグインを作成しました(Multisite Post Display https://wordpress.org/plugins/multisite-post-reader/ と呼ばれます)。すべてのマルチサイトサブサイトからの投稿が表示されます。

そこにあるコードはあなたがしていることに役立つかもしれません。あなたはそれを掘り下げることを歓迎し、あなたのプロジェクトを助けるためにコードを使う。 (結局、私はそれを開発するために他の人のコードスニペットを使いました。)

1つのページにサブサイトのメディアを表示する方法が必要で、それを実現するプラグインが見つからなかったため、Multisite Media Displayを実行した後に書きました。どちらも私のマルチサイトから投稿されたメディアやコンテンツを監視するのに役立ちました。

フリー、オープンソース、そしてそれがすべてです。それが役に立つことを願っています。

1
Rick Hellewell

Ricks Answerはきっと役に立ちますが、私のアプローチを共有したいと思いました。それはあなたのコードの採用または拡張です。

まず、あなたのネットワークで選ばれたブログのリストを入手してください。

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

get_sites()の引数に'site__not_in'を使ってサイトを除外することもできます。

$sitesObjオブジェクトを配列に変換します。

$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) ;
}

次に、表示する投稿の総数を制御するカウンタを初期化し、選択した各ブログに切り替えてカスタム引数でループを開始します。

$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();
}

それが役立つことを願っています:)

この

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