wordpress 固定ページで一覧ページを実装する

wordpress 固定ページで一覧ページを実装する

wordpressで複雑な一覧ページが欲しい

例えば・・・

・投稿タイプを組み合わせた一覧ページが欲しい。
・投稿タイプや任意のカテゴリを組み合わせた一覧ページが欲しい。
・カスタムフィールドの特定の条件に一致する一覧ページが欲しい。

という場合はどうすればよいのか?

私の場合は一覧用の固定ページを作って、テーマファイルを直接いじり対応してます。

他にいい方法があるかもしれません。

一覧用の固定ページを作る

今回は、固定ページに「ブログ一覧用」というタイトルで固定ページを作り、ページ名を[blog]としました。
コンテンツの中身は空で大丈夫です。

こうすることで、テーマファイルに「page-blog.php」と言うファイルをおくだけで、ここの中身を参照(実行)してくれるのです。

一覧用を取得して表示する。

記事の一覧を取得するには、3つ方法があります。

・WP_Queryを使う
・get_posts()を使う。
・query_posts()を使う。

一番最後のquery_postsは非推奨ですが、私はこれが慣れているのでこちらを使います。

query_postsを使う場合は、使い終わったら、wp_reset_query()でリセットするのが肝要。

一覧を取得するコードのサンプル。

<?php 
    $args = array(
    'category_name'=>'news',
    'posts_per_page'=>5
    ); 

    query_posts( $args );
    if (have_posts()) : while (have_posts()) : the_post();
?>
	ループ内
        表示するコード・処理

<?php
endwhile;
endif;
wp_reset_query();
?>

様々な条件で一覧を取得する方法は、ググッて見てください。

私的な備忘録的に記しておきます。
参考になるかわかりませんが・・・。

ページネーションを実装する。

全記事を表示する場合ならばともかく、1ページ内に10とか20記事を表示して、残りは別ページにしてリンクを張る。

いわゆる「ページネーション」を実装しなければならない。

	// 準備もろもろ
	$n = 10; // 1ページ内に表示する記事数
	$offset = 0; // 取得記事の開始位置

	// 今現在のページ番号を取得する処理。
	$now = $_SERVER['REQUEST_URI']; 
	$now = explode("/page/",$now);
	$now = $now[1];
	$now = intval(str_replace("/","",$now)); 
	if($now==0){ $now =  1;};
	

	$offset = $now - 1;
	$offset = $offset * $n;

例えば、90記事あった場合は、

1ページ目は、記事の0番目から10記事。
2ページ目は、記事の10番目から10記事。

となる。

開始位置(offset)

現在のページ数) X 表示記事数 = 開始位置

全記事数。ページ数を取得


	$count_posts     = wp_count_posts('post');
	$count_pages     = wp_count_posts('kouji');
	$published_posts = $count_posts->publish;
	$published_pages = $count_pages->publish;
	$total        = $published_posts + $published_pages;
	$page_cnt        = ceil($total / $n);

wp_count_posts()という関数で記事数を取得できる。

今回は、投稿タイプ「投稿(post)」と「工事(kouji)」の2つの投稿タイプを結合した一覧ページを作ると仮定しよう。

ページ数

トータル記事 ÷ 1ページに表示する記事数 = ページ数(小数点切り上げ)

ページネーションを組み立てる


	$p = "";
	for($i = 1 ; $i <= $page_cnt;$i++){
		if($now === $i){
			$p .= "<span class='now'>" . $i ."</span>";
		} else {
			$p .= "<span><a href='/blog/page/".$i."'>" . $i ."</a></span>";
		}
	}
	$i--;

	// 現在ページが2ページ目以降ならば、「先頭に戻る」「1ページ前に戻る」をつける。
	if($now > 1){$p = "<span class='nb'><a href='/blog/page/'> << </a></span><span class='nb'><a href='/blog/page/".($now - 1)."/'> < </a></span>" . $p;}

	// 最終ページでないならば、「最後に行く」「1ページ次に進む」をつける。
	if($now != $i){$p .= "<span class='nb'><a href='/blog/page/".($now+1)."'> > </a></span><span class='nb'><a href='/blog/page/".$i."'> >> </a></span>";}


現在のページにはリンクを張らないようにする。変数 $i は最終ページを入れておきたいのでマイナスしておく。

ざっと簡単ではあるが、こんな感じです。

人気ブログランキングへ 人気ブログランキングへ 人気ブログランキングへ