WordPressのマルチサイトで子サイトのフィードを取得する

Wordpressのマルチサイト環境下で子サイトのフィードを取得

WordPressはマルチサイト環境下だと、フィード配信をすべてのブログが独立して行います。

マルチサイトを利用する際、親サイトのフィードに子ブログのフィードも含めたいという事もあるでしょうが、通常の方法ではできないようです。

そこで、ちょっと力業ですが、株式会社DOE様の投稿にあった、WordPressで複数ブログの投稿・カスタム投稿を一覧表示するを元に設定してみました。

フィード用のテンプレートをカスタマイズする準備

まずは、フィード用テンプレートを独自にカスタマイズできるように、functions.phpでテンプレートファイルの場所を指定し直します。

if($blog_id =="1"){

remove_filter('do_feed_rss2', 'do_feed_rss2', 10);

function custom_feed_rss2(){
  $template_file = '/feed-rss2.php';
  load_template(get_stylesheet_directory() . $template_file);
}

add_action('do_feed_rss2', 'custom_feed_rss2', 10);
}

dogmap.jp様の各種フィード用テンプレートの変更を元に書き換えました。

最初の$blog_id ==”1″で親ブログの場合のみ、独自テンプレートを読み込むように指定します。
load_template(get_stylesheet_directory() . $template_file);としているのは、私が子テーマを利用しているためです。

フィードを読み込むマルチサイトのブログIDを記入

次にfunctions.phpに以下の関数を貼り付けます。

function blog_id_arr() {
  $arr = array(1,3);//IDを配列で指定
  return $arr;
}

IDを指定して返すだけのコードですが、後述するfeed-rss2.phpを修正する必要を減らしたいとうだけで分離させました。

array()の中にフィードを取得したいブログのIDをカンマ区切りで指定して下さい。

次に/wp-includes/feed-rss2.phpを利用しているテンプレートディレクトリにコピーし、編集します。

feed-rss2.phpを編集する

while文の削除と、コードの挿入

81行目にあるwhile( have_posts()) : the_post();を削除します。

以下のようになっているので、do_action( ‘rss2_head’);が目印です。

do_action( 'rss2_head');

while( have_posts()) : the_post();

削除した場所に以下のコードを代わりに挿入します。

$sql = '';
$blog_id_arr = blog_id_arr();//取得するブログIDを取得
$tmp = $blog_id_arr;
foreach($blog_id_arr as $b_id){
    next($tmp);
    switch_to_blog($b_id);
    $sql .= <<posts
WHERE (post_type = 'post')
AND post_status = 'publish')
HERE;

    if(current($tmp) !== false){
        $sql .= "UNION\n";
    }
    restore_current_blog();
}
$sql .= "ORDER BY post_date DESC LIMIT ".get_option('posts_per_rss')."\n";
$posts = $wpdb->get_results($sql);//記事のセットを取得

foreach ($posts as $post):
    switch_to_blog($post->blog_id);
    setup_postdata($post);

そして、feed-rss2.phpの末尾にある endwhileを以下のように書き換えます。

<?php endforeach; //endwhile; ?>

フィード配信のテスト

http://example.com/feed/ と http://example.com/child/feed/ にアクセスし、親ブログの投稿に子ブログのフィードの内容が追加されているか確認してください。

SNSでもご購読できます。

コメント

  1. KUMA より:

    お世話になります。
    探していたのはこの内容だ!と早速導入してみたのですが、
    最後ののところで
    Parse error: syntax error, unexpected T_ENDFOREACH
    のエラーになってしまいます…。
    PHPの知識が薄く、基本的な内容っぽいのですが、よろしければ対処をご指導いただけませんでしょうか(>_<)

  2. nac より:

    すいません。長らく放置してしまい、コメントを見てませんでした。。。

    すでに解決されたでしょうか?

    おそらく根本的なPHPの構文エラーだとは思います。

コメントを残す

*