自力でページング:WordPress3.0のマルチサイトの全てのブログの記事に対応

自力で、と言いつつ以下のサイトのコードを参考にさせてもらってます(汗&感謝!

→WebTecNote – (PHP) ページング機能の仕組みとか作り方とか

前に記事「WordPress3.0で子サイトの新着記事一覧を表示するテンプレートを書いてみた 」のコードの応用です。
前記事のはHOMEで数件表示出来れば良かったのですが、一覧ページを準備するとページングする必要が出てきました。

しかし、子サイトを抜き出す処理は力技で、query的な書き方じゃなかったので、Wordpressのページングでお馴染みのプラグイン「WP-PageNavi 」はやっぱり使えませんでした。

なので仕方ないので自分で書くことに。

こんな条件で書きました。

  • 表示場所:全サイトの記事一覧を固定ページ「お知らせページ」
    • ページのURL:  http://****.com/news/
  • 固定ページ「お知らせ」を新規登録
    • パーマリンク : news
  • 「お知らせ」用にテンプレートファイルを準備
    • テンプレートファイル: ***/themes/*****/page-news.php

表示処理はテンプレートファイル(  ***/themes/*****/page-news.php )に、
ページング用関数は同テーマ内の関数用PHP( ***/themes/*****/function.php ) に記述します。

「お知らせ」: /themes/*****/page-news.php

記事の表示部分(子サイト名を出すかどうか等)はお好みでカスタマイズしてください。
[php]
 ‘post’ , ‘paged’ => $paged ));
//sidebar等で判別するための変数定義(判別しないなら不要)
$pageType = ‘news’;

$entryAry = array(); //全てサイトの記事を格納する連想配列
$pageURI = get_permalink(); //今表示してるページのURI取得(ページングのリンク用)
$paged = get_query_var(‘paged’); //urlのページ数指定を取得

//▼全てのブログの記事一覧を取得する
//マルチサイト毎に記事を取得する
for ($i = 0; $i < get_blog_count(); $i++) { $blog_lists = get_blog_list(); $blog_id = $blog_lists[$i]['blog_id']; //ブログのサイト名とURLを取得(get_blog_option実行前に取得しないとおかしくなる) $siteurl = get_blog_option($blog_id,'siteurl'); $blogname = get_blog_option($blog_id,'blogname'); //ブログ切替 $wpdb->set_blog_id($blog_id);
query_posts(“showposts=3&post_status=publish”);
if (have_posts()) {
//タイムスタンプをキーに記事情報を格納
while(have_posts()) { the_post();
$get_post_time = $post->post_date;
$unix_time = strtotime($get_post_time);
$entryAry[$unix_time][‘quid’] = $post->guid;
$entryAry[$unix_time][‘ID’] = $post->ID;
$entryAry[$unix_time][‘title’] = $post->post_title;
$entryAry[$unix_time][‘date’] = date(‘Y/n/j’, strtotime($post->post_date));
//ブログのサイト名とURLを格納
$entryAry[$unix_time][‘siteurl’] = $siteurl;
$entryAry[$unix_time][‘blogname’] = $blogname;
$entryAry[$unix_time][‘blog_id’] = $blog_id;
}
}
}
//記事があれば表示処理
if ( count($entryAry)>0 ) : ?>

= $count){break;}
$v = $entryAry[$entryIndex[$j]]; //タイムスタンプ順の記事を表示
?>

“>

‘;
paging($pageURI,$limit,$page);
echo ‘

‘;
} ?>
[/php]

関数用PHP( ***/themes/*****/function.php )

[php]
function paging($pageURI, $limit, $page, $disp=5) {
$next = $page+1;
$prev = $page-1;
//ページ番号リンク用
$start = ($page-floor($disp/2)> 0) ? ($page-floor($disp/2)) : 1; //始点
$end = ($start> 1) ? ($page+floor($disp/2)) : $disp; //終点
$start = ($limit < $end)? $start-($end-$limit):$start; //始点再計算 //前ページへのリンク if($page != 1 ) { echo '
« 前へ‘;
}

//最初のページへのリンク
if($start>= floor($disp/2) ) {
echo ‘1‘;
}

for($i=$start; $i <= $end ; $i++){//ページリンク表示ループ //$class = ($page == $i) ? ' class="current"':"";//現在地を表すCSSクラス if($i <= $limit && $i> 0 ){ //1以上最大ページ数以下の場合
if($page == $i) {
echo ‘‘.$i.’‘;//現在表示中のページ番号リンク表示
}else {
echo ‘‘.$i.’‘;//ページ番号リンク表示
}
}
}

//最後のページへのリンク
if($limit> $end){
if($limit-1> $end ) echo “…”; //ドットの表示
echo ‘‘.$limit.’‘;
}
//次のページへのリンク
if($page <$limit){ echo '次へ »‘;
}

/*確認用
print “

current:”.$page.”
“;
print “next:”.$next.”
“;
print “prev:”.$prev.”
“;
print “limit:”.$limit.”
“;
print “start:”.$start.”
“;
print “end:”.$end.”

“;
*/
}

[/php]

PHPはなんちゃってなレベルでしか書けないヘタレな僕なので、
重複してる処理もあったりしてあんまり綺麗なコードではないです。
class化すればもっとすっきりするんだろうなー
そうなったらプラグインになるのかな、、、

ともかくしばらくはこれで乗り切れそうです。

参考サイト)