※社内専用

マルチサイト 全てのサイトの記事取得

  • HOME
  • EPRESS-BS
  • マルチサイト 全てのサイトの記事取得
親サイト、子サイトがいくつかある状態で

親サイトに各サイトの記事を表示させたいときの話。

(例)各サイトのカテゴリtopicsの記事を取得して最大8件の記事を表示させたい。

ショートコード化して表示させること前提。
http://www.nfa-es.co.jp/ 物件参照
<?php
  //
  add_shortcode( 'topic', function($atts) {
    $blog_id_arr = array(1,2,3);//取得するブログIDの配列

    foreach($blog_id_arr as $blog_id) {
      //各サイトのカテゴリtopicsの記事データ取得
      $data = get_topics_post($blog_id);
      foreach ($data as $d) {
        $topics[$d['time']] = $d;
      }

    }
    //新着順に並び替え
    krsort($topics);

    $i = 0;
    $html = '<div class="row row_inline sp_image_cols sp_col2 tile">';
    foreach ($topics as $topic) {
      $html .= '<div class="col span_3"><p><span class="data">'.$topic['date'].'</span><br />';
      $html .= '<a href="'.$topic['link'].'">'.$topic['title'].'</a></p></div>';
      if($i == 7) { break; }
      $i++;
    }
    $html .= '</div>';
    return $html;

  } );

  function get_topics_post($site_id) {
    $post_arr = array();
    switch_to_blog($site_id);
    $args = array(
      'category_name'    => 'topics',
      'posts_per_page' => 20
    );

    $the_query = new WP_Query( $args );
    if($the_query->have_posts()) {
      $i = 0;
      while ( $the_query->have_posts() ) : $the_query->the_post();
        $post_arr[$i]['title'] = get_the_title();
        $post_arr[$i]['link'] = get_the_permalink();
        $post_arr[$i]['date'] = get_the_date('Y/m/d');
        $post_arr[$i]['time'] = get_the_date('YmdGis');//キーで降順に直すためのデータ
        $i++;
      endwhile; wp_reset_postdata();
    }
    restore_current_blog();
    return $post_arr;
  }

解説

マルチサイトで他のサイトの記事を取得したい場合
使える関数が
switch_to_blogです。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/switch_to_blog 普段、記事を取得するのに
new WP_Queryを使っていると思うのですが
それをマルチサイト上の他のサイトの記事も取得したい場合
switch_to_blogを使えば普段通り記事が取得できるようです。 switch_to_blogを使用したら
restore_current_blogでサイトの状態をリセットします。
https://elearn.jp/wpman/function/restore_current_blog.html
$data = get_topics_post($blog_id);
でデータを取得しているので
$dataを整形してhtmlに組み込めばokです。 参照:
https://qiita.com/shunhikita/items/db13d9e2f6d33b7ea2fb
http://arakaze.ready.jp/archives/2194
http://php.net/manual/ja/array.sorting.php
https://wpdocs.osdn.jp/%E6%97%A5%E4%BB%98%E3%81%A8%E6%99%82%E5%88%BB%E3%81%AE%E6%9B%B8%E5%BC%8F
http://memo-tan.com/wordpress/wp-get-sites_20131029.html

余談

クエリを書いて記事を取得することも可能ですが
wordpressはありとあらゆる関数が用意されているので
その関数さえ見つけて使用すれば、思っていたより簡単にできた、みたいなことが
あります。