Using WordPress ‘posts_groupby_request’ PHP filter

posts_groupby_request is a WordPress PHP filter that allows you to modify the GROUP BY clause of a query. This filter is mainly used by caching plugins.

Usage

add_filter( 'posts_groupby_request', 'your_custom_function', 10, 2 );

function your_custom_function( $groupby, $query ) {
    // your custom code here
    return $groupby;
}

Parameters

  • $groupby (string) – The GROUP BY clause of the query.
  • $query (WP_Query) – The WP_Query instance (passed by reference).

More Information

See WordPress Developer Resources: posts_groupby_request

Examples

Group posts by year

Group posts by their published year.

add_filter( 'posts_groupby_request', 'group_posts_by_year', 10, 2 );

function group_posts_by_year( $groupby, $query ) {
    global $wpdb;
    $groupby = "{$wpdb->posts}.post_date";
    return $groupby;
}

Group posts by author

Group posts by their author.

add_filter( 'posts_groupby_request', 'group_posts_by_author', 10, 2 );

function group_posts_by_author( $groupby, $query ) {
    global $wpdb;
    $groupby = "{$wpdb->posts}.post_author";
    return $groupby;
}

Group posts by category

Group posts by their category.

add_filter( 'posts_groupby_request', 'group_posts_by_category', 10, 2 );

function group_posts_by_category( $groupby, $query ) {
    global $wpdb;
    $groupby = "{$wpdb->term_relationships}.term_taxonomy_id";
    return $groupby;
}

Group posts by post type

Group posts by their post type.

add_filter( 'posts_groupby_request', 'group_posts_by_post_type', 10, 2 );

function group_posts_by_post_type( $groupby, $query ) {
    global $wpdb;
    $groupby = "{$wpdb->posts}.post_type";
    return $groupby;
}

Group posts by month and year

Group posts by their published month and year.

add_filter( 'posts_groupby_request', 'group_posts_by_month_and_year', 10, 2 );
function group_posts_by_month_and_year( $groupby, $query ) {
    global $wpdb;
    $groupby = "MONTH({$wpdb->posts}.post_date), YEAR({$wpdb->posts}.post_date)";
    return $groupby;
}