Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
08/07/2024 01:46:38 AM (22 months ago)
Author:
espellcaste
Message:

Move some BP_User_Query::populate_extras() properties to custom action hooks.

The action of populating class properties were moved from the populate_extras method into action hooks, allowing developers to remove any of them, if needed.

Props r-a-y and imath.

Fixes #9205

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-members/bp-members-filters.php

    r13878 r13994  
    3535
    3636    // Filters on sign-up fields.
    37     $fields = array (
     37    $fields = array(
    3838        'bp_get_signup_username_value',
    3939        'bp_get_signup_email_value',
     
    4747    // Add the filters to each field.
    4848    foreach ( $fields as $filter ) {
    49         add_filter( $filter, 'esc_html',       1 );
     49        add_filter( $filter, 'esc_html', 1 );
    5050        add_filter( $filter, 'wp_filter_kses', 2 );
    51         add_filter( $filter, 'stripslashes',   3 );
     51        add_filter( $filter, 'stripslashes', 3 );
    5252    }
    5353
     
    7676
    7777    if ( is_network_admin() && isset( $_POST['blog'] ) ) {
    78         $blog = $_POST['blog'];
     78        $blog   = $_POST['blog'];
    7979        $domain = '';
    8080
     
    8686            $illegal_names[] = $domain;
    8787        }
    88 
    8988    } else {
    9089        $illegal_names[] = buddypress()->signup->username;
     
    131130}
    132131add_filter( 'edit_profile_url', 'bp_members_edit_profile_url', 10, 3 );
     132
     133/**
     134 * Filter BP_User_Query::populate_extras to add last activity.
     135 *
     136 * @since 15.0.0
     137 *
     138 * @param BP_User_Query $user_query The BP_User_Query object.
     139 */
     140function bp_members_filter_user_query_populate_extras_last_activity( $user_query ) {
     141    $last_activities = BP_Core_User::get_last_activity( $user_query->user_ids );
     142
     143    // Set a last_activity value for each user, even if it's empty.
     144    foreach ( $user_query->results as $user_id => $user ) {
     145        $user_last_activity = isset( $last_activities[ $user_id ]['date_recorded'] )
     146            ? $last_activities[ $user_id ]['date_recorded']
     147            : '';
     148
     149        $user_query->results[ $user_id ]->last_activity = $user_last_activity;
     150    }
     151}
     152add_action( 'bp_user_query_populate_extras', 'bp_members_filter_user_query_populate_extras_last_activity' );
     153
     154/**
     155 * Filter BP_User_Query::populate_extras to add friend count & latest update.
     156 *
     157 * @since 15.0.0
     158 *
     159 * @global wpdb $wpdb WordPress database object.
     160 *
     161 * @param BP_User_Query $user_query   The BP_User_Query object.
     162 * @param string        $user_ids_sql Comma-separated list of user IDs to fetch extra
     163 *                                    data for, as determined by BP_User_Query.
     164 */
     165function bp_members_filter_user_query_populate_extras_friend_count_latest_update( $user_query, $user_ids_sql ) {
     166    global $wpdb;
     167
     168    $total_friend_count_key = bp_get_user_meta_key( 'total_friend_count' );
     169    $bp_latest_update_key   = bp_get_user_meta_key( 'bp_latest_update' );
     170
     171    // Total_friend_count must be set for each user, even if its
     172    // value is 0.
     173    foreach ( $user_query->results as $uindex => $user ) {
     174        $user_query->results[ $uindex ]->total_friend_count = 0;
     175    }
     176
     177    // Create, prepare, and run the separate usermeta query.
     178    $user_metas = $wpdb->get_results(
     179        $wpdb->prepare(
     180            "SELECT user_id, meta_key, meta_value FROM {$wpdb->usermeta} WHERE meta_key IN (%s,%s) AND user_id IN ({$user_ids_sql})",
     181            $total_friend_count_key,
     182            $bp_latest_update_key
     183        )
     184    );
     185
     186    // The $members_template global expects the index key to be different
     187    // from the meta_key in some cases, so we rejig things here.
     188    foreach ( $user_metas as $user_meta ) {
     189        switch ( $user_meta->meta_key ) {
     190            case $total_friend_count_key:
     191                $key = 'total_friend_count';
     192                break;
     193
     194            case $bp_latest_update_key:
     195                $key = 'latest_update';
     196                break;
     197        }
     198
     199        if ( isset( $user_query->results[ $user_meta->user_id ] ) ) {
     200            $user_query->results[ $user_meta->user_id ]->{$key} = $user_meta->meta_value;
     201        }
     202    }
     203}
     204add_action( 'bp_user_query_populate_extras', 'bp_members_filter_user_query_populate_extras_friend_count_latest_update', 10, 2 );
     205
     206/**
     207 * Filter BP_User_Query::populate_extras to add meta key / value.
     208 *
     209 * Only added if 'meta_key' or 'meta_value' is passed to the user query.
     210 *
     211 * @since 15.0.0
     212 *
     213 * @global wpdb $wpdb WordPress database object.
     214 *
     215 * @param BP_User_Query $user_query The BP_User_Query object.
     216 */
     217function bp_members_filter_user_query_populate_extras_meta( $user_query ) {
     218    global $wpdb;
     219
     220    if ( empty( $user_query->query_vars['meta_key'] ) ) {
     221        return;
     222    }
     223
     224    $meta_sql = array(
     225        'select' => 'SELECT user_id, meta_key, meta_value',
     226        'from'   => "FROM $wpdb->usermeta",
     227        'where'  => $wpdb->prepare( 'WHERE meta_key = %s', $user_query->query_vars['meta_key'] ),
     228    );
     229
     230    if ( false !== $user_query->query_vars['meta_value'] ) {
     231        $meta_sql['where'] .= $wpdb->prepare( ' AND meta_value = %s', $user_query->query_vars['meta_value'] );
     232    }
     233
     234    $metas = $wpdb->get_results( "{$meta_sql['select']} {$meta_sql['from']} {$meta_sql['where']}" );
     235
     236    if ( empty( $metas ) || ! is_array( $metas ) ) {
     237        return;
     238    }
     239
     240    foreach ( $metas as $meta ) {
     241        if ( isset( $user_query->results[ $meta->user_id ] ) ) {
     242            $user_query->results[ $meta->user_id ]->meta_key = $meta->meta_key;
     243
     244            if ( ! empty( $meta->meta_value ) ) {
     245                $user_query->results[ $meta->user_id ]->meta_value = $meta->meta_value;
     246            }
     247        }
     248    }
     249}
     250add_action( 'bp_user_query_populate_extras', 'bp_members_filter_user_query_populate_extras_meta' );
    133251
    134252/**
     
    241359        );
    242360
    243     // This user can register!
     361        // This user can register!
    244362    } else {
    245363
     
    302420
    303421            $message = implode( ' ', $message_parts );
    304         } else if ( 'nouveau' === bp_get_theme_package_id() ) {
     422        } elseif ( 'nouveau' === bp_get_theme_package_id() ) {
    305423            $message = sprintf(
    306424                /* translators: 1: The log in link `<a href="login_url">log in</a>`. 2: The lost password link `<a href="lost_password_url">log in</a>` */
Note: See TracChangeset for help on using the changeset viewer.