ポイントは
- ページネーションを独自に作成すること。
- カテゴリー順に投稿を取得すること。
背景
- 投稿をカテゴリー順に表示したい。
- ページネーションにも対応させたい。
- orderbyフィルターが使えなかった。
テンプレートファイル
global $wpdb;
$post_type = 'post';
$all_of_posts = wp_count_posts($post_type)->publish;//公開記事の総数
$p_per_p = get_query_var('posts_per_page');//管理画面で設定されている1ページ当たりの記事数
//ここから下はpaginate_linksへの引数にする値を取得
$paged = (get_query_var('paged')) ?: 1;//現在のページ番号
$base = get_pagenum_link(1);//番号付きのリンクを作るための基本となるurl
$format = (substr($base, -1) == '/' ? '' : '/') .
user_trailingslashit('page/%#%/', 'paged');//ページネーションの構造を指定するの使用する
$base .= '%_%';
$total = ceil($all_of_posts / $p_per_p);//全体のページ数
$mid_size = 3;//現在のページの両側にいくつの数字を表示するか
//ページネーションを出力する
echo paginate_links(array(
'base' => $base,
'format' => $format,
'total' => $total,
'mid_size' => $mid_size,
'current' => $paged,
));
//ここからはページ番号に応じた記事を取得して表示するためのもの
$offset = ($paged - 1) * $p_per_p;//2ページ以降でつかいます。記事をいくつスキップするか。
//sqlの組み立て
$sql = "SELECT DISTINCT * FROM " . $wpdb->posts . " AS p JOIN " .
$wpdb->term_relationships . " AS r ON p.ID = r.object_id JOIN " .
$wpdb->term_taxonomy . " AS t USING term_taxonomy_id WHERE post_type = %s
ORDER BY t.term_id ASC LIMIT %d, %d";
//sqlを安全なものに
$query = $wpdb->prepare($sql, $post_type, $offset, $p_per_p);
//ページに表示する記事を連想配列で取得
$results = $wpdb->get_results($query, ARRAY_A);
foreach ($results as $result) {
//ここに出力内容を記入。titleを出力すると
echo $result['title'];
}