WP_User_Queryにwp_postをjoinする

WP_User_Queryに任意のPost Typeを連携させる。

WP_User_Query
  戻り値($user_datas->results)に、post_authorとpost_countが追加される。

1.WP_User_Queryにサブクエリーを追加する。
WP_User_Query
追加パラメータ
post_type : JOINするポストタイプ ‘post’,’Page’やカスタムポストタイプなど
post_exist : 連携するpostの検索結果の表示方法
    true : 連携する投稿があるものだけ表示する。
戻り値
$user_datas->resultsに、
post_author : post_author 無い場合は、nullがセットされる。
post_count : post_count 無い場合は、nullがセットされる。

function wp_user_query_join_post($query) {
	if(isset( $query->query_vars['post_type'] ) ) {
		$query->query_fields = $query->query_fields . ', post.*';

		$query->query_from = $query->query_from
		.	 ' LEFT OUTER JOIN (
	                SELECT post_author, COUNT(*) as post_count
	                FROM wp_posts
	                WHERE post_type = "'.$query->query_vars['post_type'].'"
					AND (post_status = "publish" OR post_status = "private")
					GROUP BY post_author
	            ) post ON (wp_users.ID = post.post_author)';

		if ( isset( $query->query_vars['post_exist'] ) ) {
			if(false == ($query->query_vars['post_exist'] )) {
				$query->query_where = $query->query_where . ' AND post_count is null ';
			}elseif('all'===$query->query_vars['post_exist']){
				$query->query_where = $query->query_where;
			}else{
				$query->query_where = $query->query_where . ' AND post_count  > 0 ';
			}
		}else{
			$query->query_where = $query->query_where . ' AND post_count  > 0 ';
		}
	}
}
add_action('pre_user_query', 'wp_user_query_join_post');

2.WP_User_Queryを呼び出す。

function user_join_post() {
	// Pageing
	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
	$limit = 5;
	$offset = ($paged - 1) * $limit;

	// WP_User_Query
	$user_datas_args = array(
			'role'	=>	'Author',
			'number' => $limit,
			'offset' => $offset,
			'post_type'	=> 'Post', // 呼び出すPost Type
			'post_exist'	=> 'all' // 検索対象
	);
	$user_datas = new WP_User_Query($user_datas_args);
	echo '<p>wp_users:'.$user_datas->total_users.'</p>';

	// 以下は、任意で処理を行う。
	$user_datas_results = $user_datas->results;
	foreach ($user_datas_results as $user_data) {
	//	var_dump($user_data->data);
	//	$user_data->post_count : 投稿件数、無い場合はnull
	}

	// wp_pageNavi
	if(function_exists('wp_pagenavi')) {
		ob_start();
		wp_pagenavi(array('query'=>$user_datas,'type' => 'users'));
		$html .= ob_get_clean();
	}

コメントを残す

メールアドレスが公開されることはありません。