WordPress Popular Posts を利用中に、カテゴリページを人気順で並べ替え

WordPress Popular Posts プラグインを使っている時に、 カテゴリーページで人気順に並べ替えたいときに。

カスタムクエリなるフックを使う。
http://wpdocs.sourceforge.jp/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%AF%E3%82%A8%E3%83%AA

クエリするときに発行されるSQLの、JOIN句、ORDER BY句なんかを書き換えることができます。
それを利用して、カテゴリページの一覧を人気順にします。

WordPress Popular Posts のデータをJOINで連結して、ORDER BY句で並べ替えます。
下の例では、念の為に、ID(post ID)でグルーピングしています。

//親カテゴリをチェック
function checkParent($query=null)
{
	if (!$query) {  
		global $wp_query;
		$query = $wp_query;
	}
	$slug = $query->query_vars['category_name'];
	$cat = get_category_by_slug($slug);
	return $cat->parent;
}

//子カテゴリのときは、人気順に並べ替えて表示する。
add_filter('posts_join', 'child_category_pps_join' , 10, 2);
add_filter('posts_orderby', 'child_category_pps_order', 10, 2 );
add_filter('posts_groupby', 'child_category_pps_groupby', 10, 2 );
function child_category_pps_join( $join , $query)
{
	if ( is_admin() || ! $query->is_main_query() )
		return $join;

	if ( $query->is_category() && (checkParent($query) > 0)) {
		global $wpdb;
		$pps_table = $wpdb->prefix . "popularpostssummary";
		$join .= " LEFT JOIN " . $wpdb->prefix . "popularpostssummary ON " . 
		$wpdb->posts . ".ID = " . $pps_table . ".postid ";
	}
	return $join;
}

function child_category_pps_order( $orderby , $query )
{
	if ( is_admin() || ! $query->is_main_query() )
		return $orderby;

	global $wpdb;
	if ( $query->is_category() && (checkParent($query) > 0)) {
			$pps_table = $wpdb->prefix . "popularpostssummary";
			return $pps_table . ".pageviews DESC";
	}
	return $orderby;
}

function child_category_pps_groupby( $groupby , $query )
{
	if ( is_admin() || ! $query->is_main_query() )
		return $groupby;

	if ( $query->is_category() && (checkParent($query) > 0)) {
		global $wpdb;
		$pps_table = $wpdb->prefix . "popularpostssummary";
		$slug = $query->query_vars['category_name'];
		$cat = get_category_by_slug($slug);
		$mygroupby = "{$wpdb->posts}.ID";
		if( preg_match( "/$mygroupby/", $groupby )) {
			return $groupby;
		}
		if( !strlen(trim($groupby))) {
			return $mygroupby;
		}
		return $groupby . ", " . $mygroupby;
	}
	return  $groupby;
}

checkParent() で、表示中のカテゴリページに親ページがあるかどうかをチェックしています。
そして、子カテゴリのときだけ、人気順に表示するようにしていますので、 そうでないのなら、3箇所ある、

if ( $query->is_category() && (checkParent($query) > 0)) {

のところを、

if ( $query->is_category() ) {

にすれば、すべてのカテゴリページで人気順になります。

nakaike