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記事。
となる。
(現在のページ数 – 1) 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 は最終ページを入れておきたいのでマイナスしておく。
ざっと簡単ではあるが、こんな感じです。
最近のコメント