get_postsを使った一覧ページの作成
はじめに
ワードプレスをカスタマイズしていると、カスタム投稿タイプの一覧ページを作成することが頻繁にあります。毎度、調べ直すのは手間なので備忘録として残しておきます。以下の例は、カスタム投稿タイプworksの一覧を表示する場合になります。
カスタム投稿タイプのデータを取得する
// 1ページの表示数を設定します。 $per_page = 5; $offset = 0; $paged = get_query_var('page'); if(empty($paged)){ $paged = 1; } if($paged > 1){ $offset = intval(($paged - 1)) * $per_page; } // カスタム投稿タイプの投稿数を取得します。 $item_count = $wpdb->get_var(" SELECT COUNT(ID) AS cnt FROM {$wpdb->posts} WHERE post_type = 'works' /* 施工事例である */ AND post_status = 'publish' /* かつ公開済の記事 */ AND post_password = '' /*かつパスワードが設定されていない */ "); $item_count = intval($item_count); // カスタム投稿タイプの投稿を取得します。 $args = array( 'post_type' => 'works', 'posts_per_page' => $per_page, 'offset' => $offset ); $works_posts = get_posts($args); for($i=0; $i<count($works_posts); $i++){ // 投稿ごとにアップされてい画像を取得します。 $works_posts[$i]->images = get_image_children($works_posts[$i]->ID); } // ページ数を計算します。 $pages = ceil($item_count / $per_page);
投稿ごとにアップされている画像を取得するget_image_children()の中身。取得する画像数を変更する場合は、numberpostsの値を変更します。
/** * 投稿に紐付いた画像を取得する * @param $post_id * @return array */ function get_image_children($post_id) { $id = intval($post_id); $attachments = get_children(array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order', 'numberposts' => 3)); if (empty($attachments)) { $attachments = array(); } return $attachments; }
ページネーションを表示する
ページネーションはプラグインを使わなくていいように、関数で作成します。
Kowappa様のサイトを参考にさせていただきました。
/** * 施工事例一覧ページ用ページャー * @param string $pages * @param int $paged * @param $base_url * @param int $range */ function my_pager($pages = '', $paged=1, $base_url, $range = 2) { $showitems = ($range * 2) + 1; if (1 != $pages) { echo "<div class='pagination'>"; if ($paged > 2 && $paged > $range + 1 && $showitems < $pages) { printf("<a href='%s?page=1'>«</a>", $base_url); } if ($paged > 1 && $showitems < $pages) { printf("<a href='%s?page=" . ($paged - 1) . "'>‹</a>", $base_url); } for ($i = 1; $i <= $pages; $i++) { if (1 != $pages && (!($i >= $paged + $range + 1 || $i <= $paged - $range - 1) || $pages <= $showitems)) { echo ($paged == $i) ? "<span class='current'>" . $i . "</span>" : sprintf('<a href="%s?page=%s" class="inactive">%s</a>', $base_url, $i, $i); } } if ($paged < $pages && $showitems < $pages) { printf('<a href="%s?page=%s">›</a>', $base_url, ($paged + 1)); } if ($paged < $pages - 1 && $paged + $range - 1 < $pages && $showitems < $pages) { printf('<a href="%s?page=%s">»</a>', $base_url, $pages); } echo "<div class=\"clear\"></div>"; echo "</div>\n"; } }
ページャーのCSSを用意します。
/** ページャー */ .pagination { clear:both; padding: 0; position:relative; font-size:11px; line-height:13px; margin-left: 5px; margin-right: 5px; } .pagination span, .pagination a { display:block; float:left; margin: 2px 5px 5px 0; padding:6px 9px 5px 9px; text-decoration:none; width:auto; color:#fff; background: #555; } .pagination a:hover{ color:#fff; background: #c8aa82; } .pagination .current{ padding:6px 9px 5px 9px; background: #c8aa82; color:#fff; } .clear { clear: both; }
執筆者:カニ
今日はアメ降ってる…
この記事へのコメントはありません。