WordPressのマルチサイト化したサイトの最新記事 ITかあさん

ITかあさん

WordPressのマルチサイト化したサイトの最新記事

マルチサイト化したWordPressから最新記事を取得する

このところBuddyPressにすっかりハマってしまったITかあさんですが、BuddyPressでのマルチサイトでポータル作りたい構想がありまして、マルチサイト化したWordPressから最新記事を取得する方法を紹介したいと思います。

WordPressマルチサイトネットワークから新着記事を取得するコード

基本的なコードはこちらが大変参考になります。基本は私もこちらを使わせて頂きました。

テーマフォルダのfunctions.php

テーマのfunctions.phpを編集します。BuddyPressテーマも同様です。
こちらのページからget_recentposts_from_networkのfunctionを頂くのですが、カスタマイズ案としてこの部分を

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id FROM wp_blogs ORDER BY blog_id" ) );

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓このようにしました

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id FROM wp_blogs WHERE NOT(blog_id=1) ORDER BY blog_id" ) );

また、マルチサイトの最新記事を引っ張る部分 foreach( $posts as $post ) {}の括弧内に以下を追加しました

$author = $post->post_author;//投稿者
$thumbnail_id = get_post_thumbnail_id($post->ID);
$thum = wp_get_attachment_image_src( $thumbnail_id, array( 100, 100 ) );//投稿記事サムネイル取得
$post->thum = $thum[0];//投稿記事サムネイル
$post->author = get_avatar($post->post_author, '50');//投稿者のアバター(必要なければ消してね)

これは、各テンプレートのindex.phpなどでサムネイルなど取得してもいいのですが、どちらにせよこの部分は後でキャッシュ化してしまうので、
最新記事関連の項目は全てfunctions.php内で完了させておいたほうが賢いでしょう。

Transients APIを使ってキャッシュしつつ最新記事表示

前回の記事の通り、マルチサイトのデータベースを分離してしまったので、取得にそれなりの時間がかかってしまうであろうこのスクリプト。Transients APIを使ってキャッシュしつつ、テンプレート側に表示させます。

<?php
$network_posts = get_transient( 'transient_key' );
  if ( $network_posts === false ) { 
  $transients = get_recentposts_from_network( 'perblog=3' );
  set_transient( 'transient_key', $transients, 3600 * 24 );//第3引数にはキャッシュさせる時間
  $network_posts = get_transient( 'transient_key' );
  }
 
  if( $network_posts ) :
  
  foreach( (array) $network_posts as $key => $post ) {
  switch_to_blog( $post->blog_id );
  setup_postdata( $post );
  ?>
  <li><?php the_author(); ?><?php if($post->thum !=""):?><span><img src="<?php echo $post->thum;?>" width="50" height="50"><?php endif;?></span><a href="<?php the_permalink() ;?>"><?php the_title(); ?></a></li>
  <?php
  restore_current_blog();
  }
  wp_reset_query();
  
  endif;
?>

実行例

マルチサイトから最新記事を表示
こんな風に表示されます。データベースを分離させたマルチサイトでも全く問題なく取得できます。

当初このキャッシュ方法をWordPressのobject cashe使おうとして、全くキャッシュ保存されないことで躓き、ご指南頂きました。
WordPressのオブジェクトキャッシュで躓いた

プラグインを入れることなく、簡単にキャッシュ実装できました。ありがたや、ありがたや~

初夏のJavaScript祭 in サーキュレーションビル ForPro