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

WordPressの記事一覧とページネーション(ページング)用配列を取得するfunctionを書いてみた

WordPressの記事一覧とページネーション(ページング)用配列を取得するfunctionを書いてみた

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

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

さらにWordPressの記事一覧も取得するfunctionも作ってみた。

引数パラメータ「$args」を、new WP_Query($args) としてそのまま使えるようにした。

この間に作成した一連のものをAPIにして動かく作戦進行中。

引数とfunction定義

functionの名前は「get_posts_pagenation_org」とした。もちろん名前は任意。
引数については、次の通り。

$args WP_Query作成時に使用する引数。JSON文字列を混合可。 関数リファレンス/WP Query - WordPress Codex 日本語版 参照
$range pagenation_org()で使用するrange。
詳しくは前回記事を参照
$obj_return 返り値に作成したWP_Queryも含める場合はtrueにする

functions.phpに追加で記述するfunction

function get_posts_pagenation_org($args = array(), $range = 'all', $obj_return = false){

//【A】準備 ==============================================================================

	// 返り値用変数
	$return_val = false;
	
	// $argsにJSON文字列を受け取った場合は、配列に戻す
	if(@strlen($args)){
		//@をつけてエラー回避
		$args = @json_decode($args);
	}
	// $argsは配列に強制
	if(!is_array($args)){
		$args = array();
	}
	
	// $argsでrangeの設定を受け取った場合は、そちらを優先
	if(isset($args["range"])){
		$range = $args["range"];
	}

WP_Queryオブジェクトを作成

引数$argsからWP_Queryオブジェクトを作成する部分を記述する。
ここでは初期値として、$post_per_page(1ページに表示する数)とソート指定をした。

$argsに設定できる項目については、関数リファレンス/WP Query - WordPress Codex 日本語版を参照。

また、JSON文字列が設定されている場合は、配列に戻す処理も含めた。


//【B】WP_Queryオブジェクトを作成 ========================================================

// 【B-1】WP_Query生成用クエリ作成
//    初期値を設定
	$def_args = array();
	global $post_per_page;
	$def_args['post_per_page'] = $post_per_page; //1ページに表示する数(取得する数)
	$def_args['orderby']       = "date"; //1ページに表示する数(取得する数)
	$def_args['order']         = "DESC"; //1ページに表示する数(取得する数)
	
	foreach($def_args as $k => $v){
		if(!isset($args[$k])){
			$args[$k] = $v;
		}
	}
	
// 【B-2】$argsでJSON文字列を受け取った場合は、配列に変換
	foreach($args as $k => $v){
		// @をつけて、エラーを回避
		if($v = @json_decode($v,true)){
			$args[$k] = $v;
		}
	}
	
// 【B-3】WP_Queryオブジェクトを作成する
	$wp_query_org = new WP_Query($args);

記事一覧を取得

作成したWP_Queryオブジェクトから、記事一覧部分を取り出す。
さらに、記事毎に必要な情報を設定する。ここでは、パーマリンクとアイキャッチのサムネイルを取得するように記述してみた。

// 【C】記事を取得する ===================================================================
	$posts = $wp_query_org->posts;

	// オブジェクトを配列に変換
	$posts = json_encode($posts);
	$posts = json_decode($posts,true);

	foreach(array_keys($posts) as $i){
		// 各記事のパーマリンクを追加取得
		$posts[$i]["url"] = get_permalink($posts[$i]['ID']);
	
		//各記事のサムネイル(アイキャッチ)を取得
		$posts[$i]["thumbnail"] = false; //初期値
		if($thumb_id = get_post_thumbnail_id($posts[$i]['ID'])){
			if($tmp = wp_get_attachment_image_src($thumb_id, 'thumbnail')){
				$posts[$i]["thumbnail"]        = $tmp[0]; // 画像URL
				$posts[$i]["thumbnail_url"]    = $tmp[0]; // 画像URL
				$posts[$i]["thumbnail_width"]  = $tmp[1]; // 画像サイズ:横
				$posts[$i]["thumbnail_height"] = $tmp[2]; // 画像サイズ:縦
			}
		}
	}

ページネーション(ページング)を取得

WP_Queryから前回作成したfunction「pagenation_org()」を使用して、ページネーション(ページング)用の配列を取得する。
pagenation_org()について、詳しくは前回の記事を参照。

// 【D】ページネーション(ページング)を取得する =========================================
	$pagenation = pagenation_org($wp_query_org,$range);


返り値の設定、終了

取得・作成したものを返して、functionは終了。
$obj_returnがtrueの場合は、WP_Queryオブジェクトを含めて返す。

// 【E】返す値を設定する $return_val = array(); $return_val['posts'] = $posts; $return_val['pagenation'] = $pagenation; //wp_queryオブジェクトも返す場合は追加 if($obj_return){ $return_val['wp_query'] = $wp_query_org; } return $return_val; }

ソースコード

続けて記述すると、以下の様になる。
このfunctionを(前回作成したpagenation_org()と合わせて)functions.phpに記述して定義しておく。


function get_posts_pagenation_org($args = array(), $range = 'all', $obj_return = false){

//【A】準備 ==============================================================================

	// 返り値用変数
	$return_val = false;
	
	// $argsにJSON文字列を受け取った場合は、配列に戻す
	if(@strlen($args)){
		//@をつけてエラー回避
		$args = @json_decode($args);
	}
	// $argsは配列に強制
	if(!is_array($args)){
		$args = array();
	}
	
	// $argsでrangeの設定を受け取った場合は、そちらを優先
	if(isset($args["range"])){
		$range = $args["range"];
	}

//【B】WP_Queryオブジェクトを作成 ========================================================

// 【B-1】WP_Query生成用クエリ作成
//    初期値を設定
	$def_args = array();
	$def_args['post_per_page'] = $post_per_page; //1ページに表示する数(取得する数)
	$def_args['orderby']       = "date"; //1ページに表示する数(取得する数)
	$def_args['order']         = "DESC"; //1ページに表示する数(取得する数)
	
	foreach($def_args as $k => $v){
		if(!isset($args[$k])){
			$args[$k] = $v;
		}
	}
	
// 【B-2】$argsでJSON文字列を受け取った場合は、配列に変換
	foreach($args as $k => $v){
		// @をつけて、エラーを回避
		if($v = @json_decode($v,true)){
			$args[$k] = $v;
		}
	}
	
// 【B-3】WP_Queryオブジェクトを作成する
	$wp_query_org = new WP_Query($args);


// 【C】記事を取得する ===================================================================
	$posts = $wp_query_org->posts;

	// オブジェクトを配列に変換
	$posts = json_encode($posts);
	$posts = json_decode($posts,true);

	foreach(array_keys($posts) as $i){
		// 各記事のパーマリンクを追加取得
		$posts[$i]["url"] = get_permalink($posts[$i]['ID']);
	
		//各記事のサムネイル(アイキャッチ)を取得
		$posts[$i]["thumbnail"] = false; //初期値
		if($thumb_id = get_post_thumbnail_id($post_id)){
			if($tmp = wp_get_attachment_image_src($thumb_id, 'thumbnail')){
				$posts[$i]["thumbnail"]        = $tmp[0]; // 画像URL
				$posts[$i]["thumbnail_url"]    = $tmp[0]; // 画像URL
				$posts[$i]["thumbnail_width"]  = $tmp[1]; // 画像サイズ:横
				$posts[$i]["thumbnail_height"] = $tmp[2]; // 画像サイズ:縦
			}
		}
	}


// 【D】ページネーション(ページング)を取得する =========================================
	$pagenation = pagenation_org($wp_query_org,$range);


//	【E】返す値を設定する
	$return_val = array();
	$return_val['posts']      = $posts;
	$return_val['pagenation'] = $pagenation;
	
	//wp_queryオブジェクトも返す場合は追加
	if($obj_return){
		$return_val['wp_query'] = $wp_query_org;
	}
		
	return $return_val;
}

返り値サンプル


$args = array();
$args['paged']          = 1;
//全てのページ一覧とWP_Queryオブジェクトも取得
$range = 'ALL';
$rs = get_posts_pagenation_org($args,$range,true);
print_r($rs);


// 以下、返り値サンプル


Array
(
     //記事一覧の配列
    [posts] => Array
        (
            //WP_Postオブジェクトを配列に変換+αしたもの
            [0] => Array //アイキャッチのない場合
                (
                    [ID] => 143
                    [post_author] => 2
                    [post_date] => 2015-03-12 18:09:39
                    [post_date_gmt] => 2015-03-12 09:09:39
                    [post_content] => ~ 投稿記事の本文 ~
                    [post_title] => ~ 記事のタイトル ~
                    [post_excerpt] => 
                    [post_status] => publish
                    [comment_status] => open
                    [ping_status] => open
                    [post_password] => 
                    [post_name] => php%e3%81%ae%e9%85%8d%e5%88%97%e6%93%8d%e4%bd%9c%e3%81%ab%e3%81%aa%e3%82%8c%e3%81%9f%e4%ba%ba%e3%81%8c%e3%80%81javascript%e3%81%ae%e9%85%8d%e5%88%97%e3%83%bb%e9%80%a3%e6%83%b3%e9%85%8d%e5%88%97
                    [to_ping] => 
                    [pinged] => 
                    [post_modified] => 2015-03-10 01:50:59
                    [post_modified_gmt] => 2015-03-09 16:50:59
                    [post_content_filtered] => 
                    [post_parent] => 0
                    [guid] => http://dev.adokikaku.com/?p=133
                    [menu_order] => 0
                    [post_type] => post
                    [post_mime_type] => 
                    [comment_count] => 0
                    [filter] => raw

                    [url] => http://dev.adokikaku.com/cat-php/133/php%e3%81%ae%e9%85%8d%e5%88%97%e6%93%8d%e4%bd%9c%e3%81%ab%e3%81%aa%e3%82%8c%e3%81%9f%e4%ba%ba%e3%81%8c%e3%80%81javascript%e3%81%ae%e9%85%8d%e5%88%97%e3%83%bb%e9%80%a3%e6%83%b3%e9%85%8d%e5%88%97/
                    [thumbnail] => 
                )
            [1 ~ 8] ~ 略 ~
            [9] => Array //アイキャッチがある場合
                (
                    [ID] => 95
                    [post_author] => 2
                    [post_date] => 2015-02-24 08:39:57
                    [post_date_gmt] => 2015-02-24 08:39:57
                    [post_content] => ~ 記事本文 ~
                    [post_title] => ~ 記事タイトル ~
                    [post_excerpt] => 
                    [post_status] => publish
                    [comment_status] => open
                    [ping_status] => open
                    [post_password] => 
                    [post_name] => zenphone5%e3%82%92%e8%b3%bc%e5%85%a5%ef%bc%81%e3%81%a8sim%e3%83%ad%e3%83%83%e3%82%af%e8%a7%a3%e9%99%a4%e3%81%ae%e3%81%8a%e8%a9%b1
                    [to_ping] => 
                    [pinged] => 
                    [post_modified] => 2015-02-24 08:42:45
                    [post_modified_gmt] => 2015-02-24 08:42:45
                    [post_content_filtered] => 
                    [post_parent] => 0
                    [guid] => http://dev.adokikaku.com/?p=95
                    [menu_order] => 0
                    [post_type] => post
                    [post_mime_type] => 
                    [comment_count] => 0
                    [filter] => raw

                    [url] => http://dev.adokikaku.com/cat-others/95/zenphone5%e3%82%92%e8%b3%bc%e5%85%a5%ef%bc%81%e3%81%a8sim%e3%83%ad%e3%83%83%e3%82%af%e8%a7%a3%e9%99%a4%e3%81%ae%e3%81%8a%e8%a9%b1/
                    [thumbnail] => http://dev.adokikaku.com/wp-content/uploads/2015/02/zenphone5_a-150x150.jpg
                    [thumbnail_url] => http://dev.adokikaku.com/wp-content/uploads/2015/02/zenphone5_a-150x150.jpg
                    [thumbnail_width] => 150
                    [thumbnail_height] => 150
                )

        )
    //ページネーション(ページング)用配列
    [pagenation] => Array
        (
            //最初のページ
            [min_num] => 1
            [min_url] => http://dev.adokikaku.com/?paged=1
            //最後のページ
            [max_num] => 2
            [max_url] => http://dev.adokikaku.com/?paged=2
            //前のページ
            [prev_num] => 
            [prev_url] => 
            //次のページ
            [next_num] => 2
            [next_url] => http://dev.adokikaku.com/?paged=2
            //ページ一覧
            [pages] => Array
                (
                    [0] => Array
                        (
                            //ページ番号
                            [num] => 1
                            //ページ用URL
                            [url] => http://dev.adokikaku.com/?paged=1
                            //現在のページの場合は「1」
                            [acrive] => 1
                        )

                    [1] => Array
                        (
                            [num] => 2
                            [url] => http://dev.adokikaku.com/?paged=2
                            [active] => 0
                        )

                )
            //現在のページ
            [paged] => 1
            //ページ一覧取得範囲
            [range] => 1
            //使用したWP_Queryオブジェクトのquery_vars
            [query_vars] => Array
                (
                    [posts_per_page] => 10
                    [paged] => 0
                    [post_per_page] => 
                    [orderby] => date
                    [order] => DESC
                    [error] => 
                    [m] => 
                    [p] => 0
                    [post_parent] => 
                    [subpost] => 
                    [subpost_id] => 
                    [attachment] => 
                    [attachment_id] => 0
                    [name] => 
                    [static] => 
                    [pagename] => 
                    [page_id] => 0
                    [second] => 
                    [minute] => 
                    [hour] => 
                    [day] => 0
                    [monthnum] => 0
                    [year] => 0
                    [w] => 0
                    [category_name] => 
                    [tag] => 
                    [cat] => 
                    [tag_id] => 
                    [author] => 
                    [author_name] => 
                    [feed] => 
                    [tb] => 
                    [comments_popup] => 
                    [meta_key] => 
                    [meta_value] => 
                    [preview] => 
                    [s] => 
                    [sentence] => 
                    [fields] => 
                    [menu_order] => 
                    [category__in] => Array
                        (
                        )

                    [category__not_in] => Array
                        (
                        )

                    [category__and] => Array
                        (
                        )

                    [post__in] => Array
                        (
                        )

                    [post__not_in] => Array
                        (
                        )

                    [tag__in] => Array
                        (
                        )

                    [tag__not_in] => Array
                        (
                        )

                    [tag__and] => Array
                        (
                        )

                    [tag_slug__in] => Array
                        (
                        )

                    [tag_slug__and] => Array
                        (
                        )

                    [post_parent__in] => Array
                        (
                        )

                    [post_parent__not_in] => Array
                        (
                        )

                    [author__in] => Array
                        (
                        )

                    [author__not_in] => Array
                        (
                        )

                    [ignore_sticky_posts] => 
                    [suppress_filters] => 
                    [cache_results] => 1
                    [update_post_term_cache] => 1
                    [update_post_meta_cache] => 1
                    [post_type] => 
                    [nopaging] => 
                    [comments_per_page] => 50
                    [no_found_rows] => 
                )

        )
    [wp_query] => //WP_Query Object
)


この後、前回作成したpagenation_org()と 今回作成したget_posts_pagenation_org()の2つのfunctionを使用して、使い勝手のいいAPIや固定ページで記事一覧を取得できるものを作っていく作戦です。