Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
12/12/2021 02:09:02 PM (4 years ago)
Author:
imath
Message:

Support date queries for Members, Groups and Sites

According to components, date queries can be restricted to a limited list of loop types:

  • For Members, the $type parameter in bp_has_members() needs to be either active, newest, random or online.
  • For Groups, the $type parameter in bp_has_groups() needs to be either active or newest.
  • For sites, the $type parameter in bp_has_blogs() needs to be either active or newest.

Props r-a-y

Fixes #8488

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-blogs/classes/class-bp-blogs-blog.php

    r12544 r13184  
    164164     * Retrieve a set of blog-user associations.
    165165     *
    166      * @param string      $type              The order in which results should be returned.
    167      *                                       'active', 'alphabetical', 'newest', or 'random'.
    168      * @param int|bool    $limit             Optional. The maximum records to return.
    169      *                                       Default: false.
    170      * @param int|bool    $page              Optional. The page of records to return.
    171      *                                       Default: false (unlimited results).
    172      * @param int         $user_id           Optional. ID of the user whose blogs are being
    173      *                                       retrieved. Default: 0.
    174      * @param string|bool $search_terms      Optional. Search by text stored in
    175      *                                       blogmeta (such as the blog name). Default: false.
    176      * @param bool        $update_meta_cache Whether to pre-fetch metadata for
    177      *                                       blogs. Default: true.
    178      * @param array|bool  $include_blog_ids  Array of blog IDs to include.
     166     * @since 1.2.0
     167     * @since 10.0.0 Converted to array as main function argument. Added $date_query parameter.
     168     *
     169     * @param array $data {
     170     *     Array of site data to query for.
     171     *     @type string      $type              The order in which results should be returned.
     172     *                                          'active', 'alphabetical', 'newest', or 'random'.
     173     *     @type int|bool    $limit             Optional. The maximum records to return.
     174     *                                          Default: false.
     175     *     @type int|bool    $page              Optional. The page of records to return.
     176     *                                          Default: false (unlimited results).
     177     *     @type int         $user_id           Optional. ID of the user whose blogs are being
     178     *                                          retrieved. Default: 0.
     179     *     @type string|bool $search_terms      Optional. Search by text stored in
     180     *                                          blogmeta (such as the blog name). Default: false.
     181     *     @type bool        $update_meta_cache Whether to pre-fetch metadata for
     182     *                                          blogs. Default: true.
     183     *     @type array|bool  $include_blog_ids  Optional. Array of blog IDs to include.
     184     *     @type array       $date_query        Optional. Filter results by site last activity date. See first
     185     *                                          paramter of {@link WP_Date_Query::__construct()} for syntax. Only
     186     *                                          applicable if $type is either 'newest' or 'active'.
     187     * }
    179188     * @return array Multidimensional results array, structured as follows:
    180189     *               'blogs' - Array of located blog objects
    181190     *               'total' - A count of the total blogs matching the filter params
    182191     */
    183     public static function get( $type, $limit = false, $page = false, $user_id = 0, $search_terms = false, $update_meta_cache = true, $include_blog_ids = false ) {
    184         global $wpdb;
    185 
    186         $bp = buddypress();
    187 
    188         if ( !is_user_logged_in() || ( !bp_current_user_can( 'bp_moderate' ) && ( $user_id != bp_loggedin_user_id() ) ) )
     192    public static function get( ...$args ) {
     193        global $wpdb;
     194
     195        $bp = buddypress();
     196
     197        // Backward compatibility with old method of passing arguments.
     198        if ( ! is_array( $args[0] ) || count( $args ) > 1 ) {
     199            _deprecated_argument( __METHOD__, '10.0.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
     200
     201            $old_args_keys = [
     202                0  => 'type',
     203                1  => 'limit',
     204                2  => 'page',
     205                3  => 'user_id',
     206                4  => 'search_terms',
     207                5  => 'update_meta_cache',
     208                6  => 'include_blog_ids',
     209            ];
     210
     211            $args = bp_core_parse_args_array( $old_args_keys, $args );
     212        } else {
     213            $args = reset( $args );
     214        }
     215
     216        $r = wp_parse_args(
     217            $args,
     218            array(
     219                'type'              => 'active',
     220                'limit'             => false,
     221                'page'              => false,
     222                'user_id'           => 0,
     223                'search_terms'      => false,
     224                'update_meta_cache' => true,
     225                'include_blog_ids'  => false,
     226                'date_query'        => false,
     227            )
     228        );
     229
     230        if ( ! is_user_logged_in() || ( ! bp_current_user_can( 'bp_moderate' ) && ( $r['user_id'] != bp_loggedin_user_id() ) ) ) {
    189231            $hidden_sql = "AND wb.public = 1";
    190         else
     232        } else {
    191233            $hidden_sql = '';
    192 
    193         $pag_sql = ( $limit && $page ) ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ) : '';
    194 
    195         $user_sql = !empty( $user_id ) ? $wpdb->prepare( " AND b.user_id = %d", $user_id ) : '';
    196 
    197         switch ( $type ) {
     234        }
     235
     236        $pag_sql = ( $r['limit'] && $r['page'] ) ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $r['page'] - 1 ) * $r['limit']), intval( $r['limit'] ) ) : '';
     237
     238        $user_sql = ! empty( $r['user_id'] ) ? $wpdb->prepare( " AND b.user_id = %d", $r['user_id'] ) : '';
     239
     240        $date_query_sql = '';
     241
     242        switch ( $r['type'] ) {
    198243            case 'active': default:
    199                 $order_sql = "ORDER BY bm.meta_value DESC";
     244                $date_query_sql = BP_Date_Query::get_where_sql( $r['date_query'], 'bm.meta_value', true );
     245                $order_sql      = "ORDER BY bm.meta_value DESC";
    200246                break;
    201247            case 'alphabetical':
     
    203249                break;
    204250            case 'newest':
    205                 $order_sql = "ORDER BY wb.registered DESC";
     251                $date_query_sql = BP_Date_Query::get_where_sql( $r['date_query'], 'wb.registered', true );
     252                $order_sql      = "ORDER BY wb.registered DESC";
    206253                break;
    207254            case 'random':
     
    211258
    212259        $include_sql = '';
    213         $include_blog_ids = array_filter( wp_parse_id_list( $include_blog_ids ) );
     260        $include_blog_ids = array_filter( wp_parse_id_list( $r['include_blog_ids'] ) );
    214261        if ( ! empty( $include_blog_ids ) ) {
    215262            $blog_ids_sql = implode( ',', $include_blog_ids );
     
    217264        }
    218265
    219         if ( ! empty( $search_terms ) ) {
    220             $search_terms_like = '%' . bp_esc_like( $search_terms ) . '%';
     266        if ( ! empty( $r['search_terms'] ) ) {
     267            $search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%';
    221268            $search_terms_sql  = $wpdb->prepare( 'AND (bm_name.meta_value LIKE %s OR bm_description.meta_value LIKE %s)', $search_terms_like, $search_terms_like );
    222269        } else {
     
    236283              wb.archived = '0' AND wb.spam = 0 AND wb.mature = 0 AND wb.deleted = 0 {$hidden_sql}
    237284              AND bm.meta_key = 'last_activity' AND bm_name.meta_key = 'name' AND bm_description.meta_key = 'description'
    238               {$search_terms_sql} {$user_sql} {$include_sql}
     285              {$search_terms_sql} {$user_sql} {$include_sql} {$date_query_sql}
    239286            GROUP BY b.blog_id {$order_sql} {$pag_sql}
    240287        " );
     
    245292              {$bp->blogs->table_name} b
    246293              LEFT JOIN {$wpdb->base_prefix}blogs wb ON (b.blog_id = wb.blog_id)
     294              LEFT JOIN {$bp->blogs->table_name_blogmeta} bm ON (b.blog_id = bm.blog_id)
    247295              LEFT JOIN {$bp->blogs->table_name_blogmeta} bm_name ON (b.blog_id = bm_name.blog_id)
    248296              LEFT JOIN {$bp->blogs->table_name_blogmeta} bm_description ON (b.blog_id = bm_description.blog_id)
    249297            WHERE
    250298              wb.archived = '0' AND wb.spam = 0 AND wb.mature = 0 AND wb.deleted = 0 {$hidden_sql}
    251               AND
    252               bm_name.meta_key = 'name' AND bm_description.meta_key = 'description'
    253               {$search_terms_sql} {$user_sql} {$include_sql}
     299              AND bm.meta_key = 'last_activity' AND bm_name.meta_key = 'name' AND bm_description.meta_key = 'description'
     300              {$search_terms_sql} {$user_sql} {$include_sql} {$date_query_sql}
    254301        " );
    255302
     
    259306        }
    260307
    261         $paged_blogs = BP_Blogs_Blog::get_blog_extras( $paged_blogs, $blog_ids, $type );
     308        $paged_blogs = BP_Blogs_Blog::get_blog_extras( $paged_blogs, $blog_ids, $r['type'] );
    262309
    263310        // Integer casting.
     
    267314        }
    268315
    269         if ( $update_meta_cache ) {
     316        if ( $r['update_meta_cache'] ) {
    270317            bp_blogs_update_meta_cache( $blog_ids );
    271318        }
Note: See TracChangeset for help on using the changeset viewer.