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() ) {
にすれば、すべてのカテゴリページで人気順になります。