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)でグルーピングしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
//親カテゴリをチェック 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() ) {
にすれば、すべてのカテゴリページで人気順になります。