東京都練馬区。Wordpressはおまかせ。印刷・ホームページなど販売促進のためのデザインを提案します。

デザイン事務所ダウンアンダー

営業
10:00-
19:00

WordPressマルチサイトで子サイトの記事一覧を取得する。

     技術ノート   , , ,  野村貞次

要件

商店街サイトで、各店が子サイトとしてページを持つ。

商店街サイト(メインブログ)に、各店新着記事を各店1件ずつ、計10件表示する。

経緯

幸い「wp-over-network」というプラグインが発表されましたので使用してみました。が、各店ごとの表示件数を制御できないようです。

商店街等のサイトでは、頑張って投稿する店舗とたまにしか投稿しない店舗の差がつきやすく、トップページの「新着記事一覧」が単一店舗で埋まってしまうこともままあります。これを避けるためには、「各店から最新記事1件のみ」を抽出して表示しなければなりません。

参考サイト

http://notnil-creative.com/blog/archives/774

http://blog.cgfm.jp/garyu/archives/2223/comment-page-1

http://foreignkey.jp/archives/1192

設定

最初に動作したのは「get_blog_all_entry」というfunctionです。function.phpでget_blog_all_entry.phpを定義、テンプレートから呼び出します。参考サイト http://blog.cgfm.jp/garyu/archives/2223/comment-page-1 の指定通りですんなり動作してくれました。
・・・・が、運用中に不具合が。

ある店舗が投稿すると、他の店舗に同名の記事が投稿されたように一覧表示されてしまいます。異なる店舗名で同一記事が並んで表示されます。不正な店舗の記事は、該当店舗の最新記事にリンクされています。

テンプレート側の記述を疑いましたが、print_r()で追いかけるとget_blog_all_entry.phpですでに配列に不正なデータが入っています。1週間ほど試行錯誤しましたが、あえなく断念。

別のget_recentposts_from_networkに乗り換えてみました。これはhttp://notnil-creative.com/blog/archives/774をそのままコピーしてきても動きません(<?php〜のところがコメントアウトしてあります)。

このfunctionにはブログ除外機能が設定されていませんでしたので、追加しました。

処理の重いswitch_to_blog()を使用しているのが心配ですが、しばらく様子を見ていこうと思います。

  • function get_recentposts_from_network( $args = null ) {
  • $defaults = array( ‘num’ => 10, ‘perblog’ => 1, ‘start’ => 0 );
  • $r = wp_parse_args( $args, $defaults );
  • // 全ブログのBLOG_IDを取得
  • global $wpdb;
  • $blogs = $wpdb->get_results( “SELECT blog_id FROM $wpdb->blogs ORDER BY blog_id” ); //変更:wp_blogsを$wpdb->blogsに変更
  • if( is_array( $blogs ) ) {
  • reset( $blogs );
  • // 各ブログの最新記事を指定件数取得する
  • foreach( $blogs as $blog ) {
  • switch_to_blog( $blog->blog_id );
  • if( $blog->blog_id == 1): continue; endif;  //追加:メインブログを除外
  • $posts = get_posts( “numberposts=” . $r[‘perblog’] );
  • if( $posts ) {
  • foreach( $posts as $post ) {
  • $recent_posts[] = $post->post_date;
  • $post->blog_id = $blog->blog_id;
  • $post_list[] = $post;
  • } // endforeach
  • unset( $posts );
  • } // endif ( $posts )
  • restore_current_blog();
  • } // endforeach
  • // 投稿日時で並べ替える
  • arsort( $recent_posts );
  • reset( $recent_posts );
  • foreach( (array) $recent_posts as $key => $details ) {
  • $t[$key] = $post_list[$key];
  • } // endforeach
  • unset($recent_posts);
  • $recent_posts = $t;
  • } //endif ( is_array( $blogs ) )
  • if( $recent_posts )
  • return array_slice( $recent_posts, $r[‘start’], $r[‘num’], true );
  • return array();
  • }

これをテンプレートで呼び出します。

  • <!–//最近のネットワーク投稿表示//–>
  • <?php if( is_main_site() ) { ?>
  • <div id=”sb-sitenews”><a href=”<?php bloginfo(‘url’) ?>/sitenews/”><img src=”<?php bloginfo(‘template_url’); ?>/images/top-sitenews.png” alt=”会員各店からのお知らせ” /></a></div>
  • <div id=”networkrecent” class=”sbox”>
  • <ul>
  • <?php
  • $network_posts = get_recentposts_from_network( ‘num=20&perblog=1’ ); //20件に変更
  • if( $network_posts ) :
  • foreach( (array) $network_posts as $key => $post ) {
  • switch_to_blog( $post->blog_id );
  • setup_postdata( $post );
  • ?>
  • <li>【<a href=”<?php bloginfo(‘url’); ?>”><?php bloginfo(‘name’); ?></a>】<a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a><span class=”listdate”>[<?php the_time(‘Y年n月j日’); ?>]</span></li>
  • <?php
  • restore_current_blog();
  • }
  • wp_reset_query();
  • endif;
  • ?>
  • </ul>
  • <?php } ?>
  • </div>
  • <!–//最近のネットワーク投稿表示//–>

松本零士先生提供のオリジナルキャラクター「ゆめーてるちゃん」でお馴染み(?)のゆめーてる商店街http://oizumi.gr.jp/で使用しています。ご覧ください。

     技術ノート   , , ,  野村貞次

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

 こちらの記事も読んで見ましょう

WordPressマルチサイトで子サイトの記事一覧を取得する。 東京都練馬区。Wordpressはおまかせ。印刷・ホームページなど販売促進のためのデザインを提案します。

Copyright©デザイン事務所ダウンアンダー,2013 All Rights Reserved.

ページ先頭へ