Making WordPress.org


Ignore:
Timestamp:
05/08/2024 05:44:41 AM (9 months ago)
Author:
dd32
Message:

Profile Helpers: Avoid calling the badges API if the user already has the badge.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/mu-plugins/pub/profile-helpers.php

    r12254 r13675  
    3030function remove_badge( string $badge, $users ) : bool {
    3131    return badge_api( 'remove', $badge, $users );
     32}
     33
     34/**
     35 * Get a list of badges for a given user.
     36 *
     37 * WARNING: Uncached. Excludes dynamically allocated badges.
     38 *
     39 * @param $users mixed The user to fetch the badged for. A WP_User/ID/Login/Email.
     40 * @return array
     41 */
     42function get_user_badges( $user ) {
     43    global $wpdb;
     44
     45    $user_id = find_user_id( $user );
     46
     47    $badges = $wpdb->get_results( $wpdb->prepare(
     48        "SELECT slug, name
     49            FROM bpmain_wporg_groups_members m
     50            JOIN bpmain_wporg_groups g ON m.group_id = g.id
     51            WHERE m.user_id = %d
     52            ORDER BY slug",
     53        $user_id
     54    ), ARRAY_A );
     55
     56    return array_column( $badges, 'name', 'slug' );
    3257}
    3358
     
    76101 * Assign a badge to a given user.
    77102 *
    78  * @param $action string The action to perform; 'add' or 'remove'.
     103 * @param $action string The action to perform; 'add', 'remove', 'list'.
    79104 * @param $badge  string The badge group to assign.
    80105 * @param $users  mixed  The user(s) to assign to. A WP_User/ID/Login/Email/Slug (or array of) of the user(s) to assign.
     
    82107 */
    83108function badge_api( string $action, string $badge, $users ) : bool {
    84     $users = (array) $users;
    85     $users = array_filter( array_map( function( $user ) {
    86         // WP_User-like object.
    87         if ( is_object( $user ) ) {
    88             return $user->ID ?? false;
    89         }
    90 
    91         // User ID.
    92         if ( is_numeric( $user ) && absint( $user ) == $user ) {
    93             return (int) $user;
    94         }
    95 
    96         // Support user login / email / slug.
    97         $_user = get_user_by( 'login', $user );
    98         if ( ! $_user && is_email( $user ) ) {
    99             $_user = get_user_by( 'email', $user );
    100         }
    101         if ( ! $_user ) {
    102             $_user = get_user_by( 'slug', $user );
    103         }
    104 
    105         return $_user->ID ?? false;
    106     }, $users ) );
     109    $users = is_object( $users ) ? [ $users ] : (array) $users;
     110    $users = array_filter( array_map( __NAMESPACE__ . '\find_user_id', $users ) );
    107111
    108112    if ( ! $action || ! $badge || ! $users ) {
    109113        return false;
     114    }
     115
     116    if ( 'remove' === $action ) {
     117        $users = array_filter(
     118            $users,
     119            function( $user ) use ( $badge ) {
     120                return isset( get_user_badges( $user )[ $badge ] );
     121            }
     122        );
     123    } elseif ( 'add' === $action ) {
     124        $users = array_filter(
     125            $users,
     126            function( $user ) use ( $badge ) {
     127                return ! isset( get_user_badges( $user )[ $badge ] );
     128            }
     129        );
     130    }
     131    // If there are no users now, then the action must have already occured.
     132    if ( ! $users ) {
     133        return true;
    110134    }
    111135
     
    120144    // Note: Success or error message may be present in the return cookies.
    121145    return ( 200 === wp_remote_retrieve_response_code( $request ) );
     146}
     147
     148/**
     149 * Find a user ID from a variety of inputs.
     150 *
     151 * @param $user mixed A WP_User object, user ID, login, email, or slug.
     152 * @return int|false
     153 */
     154function find_user_id( $user ) {
     155    // WP_User-like object.
     156    if ( is_object( $user ) ) {
     157        return $user->ID ?? false;
     158    }
     159
     160    // User ID.
     161    if ( is_numeric( $user ) && absint( $user ) == $user ) {
     162        return (int) $user;
     163    }
     164
     165    // Support user login / email / slug.
     166    $_user = get_user_by( 'login', $user );
     167    if ( ! $_user && is_email( $user ) ) {
     168        $_user = get_user_by( 'email', $user );
     169    }
     170    if ( ! $_user ) {
     171        $_user = get_user_by( 'slug', $user );
     172    }
     173
     174    return $_user->ID ?? false;
    122175}
    123176
Note: See TracChangeset for help on using the changeset viewer.