アド企画 制作部
アド企画 制作部
 

WordPressのWP_Queryオブジェクトから、ページネーション(ページング)用の配列を生成するfunction

WordPressのWP_Queryオブジェクトから、ページネーション(ページング)用の配列を生成するfunction

WordPressのWP_Queryオブジェクトから、ページネーション(ページング)用の配列を生成するfunctionを作成してみた。


functionは最初のページ・最後のページ・次のページ・前のページなどのページ番号とURLの一覧を生成して配列にして返す。

配列を生成するだけなので出力は別で行う必要があるが、その方が使い勝手がいい事が多いので。

ソースコード

WordPressのWP_Queryオブジェクトから、ページネーション(ページング)用の配列を生成する次の様なfunctionを、functions.phpに記述しておく。

// ページネーション用function -------------------------------------------------------------
function pagenation_org($wp_query_org,$range="all"){
	$return_val = false;
	
	if(is_object($wp_query_org)){
		//$range … 前後に表示するページの数
		$all_flag = false;
		if(!is_numeric($range)){
			$all_flag = true;
		}
	
		//$url … ページ番号を除いた現在のURL
		$url = home_url() . remove_query_arg("paged");
		
		//ページ別URL生成準備
		if(preg_match('/\?/',$url)){
			$url .= "&";
		}else{
			$url .= "?";
		}

		//現在のページ番号
		$paged = $wp_query_org->query_vars["paged"];
		if(!$paged){$paged = 1;}
	
		//全ページステータスを取得する場合の$range設定
		$max_num_pages = 0;
		$max_num_pages = $wp_query_org->max_num_pages;
		if($all_flag){
			if($max_num_pages){
				$range = floor($max_num_pages / 2);
			}else{
				$range = 1;
			}
		}

		$return_val = array(
			 "min_num"     => false // 最初のページの番号
			,"min_url"     => false // 最初のページの記事取得用URL
			
			,"max_num"     => false //最後のページの番号
			,"max_url"     => false // 最後のページの記事取得用URL
			
			,"prev_num"    => false // 前のページの番号
			,"prev_url"    => false // 前のページの記事取得用URL
			
			,"next_num"    => false // 次のページの番号
			,"next_url"    => false // 次のページの記事取得用URL
			
			,"pages"       => false // 取得したページ一覧
			,"paged"       => $paged //現在のページ番号
			,"range"       => $range //range
			,"query_vars"  => $wp_query_org->query_vars //クエリ
		);
		//取得する最小ページ番号($rangeと$pagedの値から算出)
		if($all_flag){
			$st_num = 1; //全件表示の場合
		}else{
			$st_num = $paged - $range;
		}
		if($st_num < 1){$st_num = 1;}
		
		//取得する最大ページ番号($rangeと$pagedの値から算出)
		if($all_flag){
			$end_num = $max_num_pages; //全件表示の場合
		}else{
			$end_num = $paged + $range;
		}
		if($end_num > $max_num_pages){
			$end_num = $max_num_pages;
		}
		
		//前のページ番号
		$prev_num = $paged -1;
		
		//次のページ番号
		$next_num = $paged + 1; 
		
		//ページ一覧生成
		$pages = array();
		for($page_num = 1; $page_num <= $max_num_pages; $page_num++){
			$arr = array();
			$arr["num"]    = $page_num;
			$arr["url"]    = "{$url}paged={$page_num}";
			if($paged == $page_num){ 
				$arr["active"] = 1; //現在ページフラグ
			}else{
				$arr["active"] = 0;
			}
			// 取得範囲内
			if($page_num >= $st_num && $page_num <= $end_num){
				$pages[] = $arr;
			}
			// 最初のページ
			if($page_num == 1){
				$return_val["min_num"] = $arr["num"];
				$return_val["min_url"] = $arr["url"];
			}
			// 最後のページ
			if($page_num == $max_num_pages){
				$return_val["max_num"] = $arr["num"];
				$return_val["max_url"] = $arr["url"];
			}
			// 前のページ
			if($page_num == $prev_num){
				$return_val["prev_num"] = $arr["num"];
				$return_val["prev_url"] = $arr["url"];
			}
			// 次のページ
			if($page_num == $next_num){
				$return_val["next_num"] = $arr["num"];
				$return_val["next_url"] = $arr["url"];
			}
		}
		$return_val["pages"] = $pages;
	}
	return $return_val;
}

返り値

キー名   値・備考
min_num   最初のページのページ番号。「1」が返る。
min_url   最初のページのURL
max_num   最後のページのページ番号。WP_Queryオブジェクトのmax_num_pagesの数値。
min_url   最後のページのURL
prev_num   前のページのページ番号。
pagedが「1」の場合はfalse
prev_url   前のページのURL。
pagedが「1」の場合はfalse
next_num   次のページのページ番号。
paged = max_num の場合はfalse
next_url   次のページのURL。
paged = max_num の場合はfalse
pages = array(   range、pagedから算出したページ一覧配列
= array(  
num ページ番号
url ページのURL
active 現在のページの場合は「1」。それ以外は「0」。
),array(...),...  
paged   現在のページ番号
range   取得するpaged前後のページ数。
例)pagedが3でrangeが1の場合、pagesには2,3,4ページのページ番号とURLが入る
query_vars   WP_Queryオブジェクトのquery_vars配列

使い方

functions.phpに準備したWordPressのWP_Queryオブジェクトから、ページネーション(ページング)用の配列を生成するfunctionを、archive.php・date.php・category.phpなどのアーカイブ用のファイルで次の様に記述して使う。

// サンプル:使用例 =======================================================================

//ページネーション配列取得
$range = 'all';
$pg = pagenation_org($wp_query,$range);

//出力用テキスト生成 
$txt = '';
if($pg){
	$txt .= '<ul id="pagenation">'."\n";
	$txt .= '	<li class="pg_item pg_first"><a href="'.$pg['min_url'].'">最初</a></li>'."\n";
	if($pg["prev_num"]){
		$txt .= '	<li class="pg_item pg_prev"><a href="'.$pg['prev_url'].'">前へ</a></li>'."\n";
	}
	foreach($pg["pages"] as $x){
		if($x["active"]){
			$txt .= '	<li class="pg_item pg_first pg_active">';
		}else{
			$txt .= '	<li class="pg_item pg_first">';
		}
		$txt .= '<a href="'.$x['url'].'">'.$x["num"].'</a></li>'."\n"
	}
	if($pg["next_num"]){
		$txt .= '	<li class="pg_item pg_next"><a href="'.$pg['next_url'].'">次へ</a></li>'."\n";
	}
	$txt .= '	<li class="pg_item pg_last"><a href="'.$pg['max_url'].'">最後</a></li>'."\n";
	$txt .= '</ul><!-- #pagenation -->';
}

//出力
echo $txt;


自分的には、$GLOBALS['wp_query']を使うのではなく、引数でWP_Queryを渡すのがミソ。

今後、これを使って もっと使い勝手のいいAPIを作っていくつもり。