钩子文档

pre_user_login

💡 云策文档标注

概述

pre_user_login 是一个 WordPress 过滤器,用于在用户名被清理后、用户创建或更新前进行过滤。它允许开发者修改或检查已清理的用户名。

关键要点

  • 过滤器在用户创建或更新前调用,适用于 wp_insert_user() 等函数。
  • 参数为 $sanitized_user_login,即已清理的用户名字符串。
  • 在 wp-admin/user-new.php 和 wp-includes/user.php 中均有引用,需注意其可能在多种条件下运行。
  • 可用于实现自定义逻辑,如检查用户名是否已存在或修改相关用户数据。

代码示例

/**
 * Check if the user has been created.
 *
 * @param string $login User login.
 * @return string (Maybe) filtered login.
 */
function wpdocs_check_if_user_created( $login ) {
    // Don't do anything to login, just see if already in database.
    global $wpdb, $is_new_login;

    $id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_login = '%s'", $login ) );
    $is_new_login = ( isset( $id ) ) ? false : true;

    return $login;
}

/**
 * Filter the user nickname.
 *
 * @param string $nickname User nickname.
 * @return string (Maybe) filtered nickname.
 */
function wpdocs_fix_nickname ( $nickname ) {
    global $is_new_login;

    if ( $is_new_login ) {
        $first_name = empty( $_POST_['first_name'] ) ? sanitize_text_field( $_POST['first_name'] ) : '';
        $last_name  = empty( $_POST['last_name'] ) ? sanitize_text_field( $_POST['last_name'] ) : '';

        $nickname  = empty( $first_name ) ? '' : $first_name;
        $nickname .= empty( $last_name ) ? '' : ' ' . $last_name;
    }
    return $nickname;
}

add_filter( 'pre_user_login', 'wpdocs_check_if_user_created' );
add_filter( 'pre_user_nickname', 'wpdocs_fix_nickname' );

注意事项

  • 此过滤器在用户创建和更新时都会运行,可能增加逻辑复杂性,需谨慎处理。
  • 示例代码展示了如何结合 pre_user_login 和 pre_user_nickname 过滤器,实现新用户昵称的自动设置。

📄 原文内容

Filters a username after it has been sanitized.

Description

This filter is called before the user is created or updated.

Parameters

$sanitized_user_loginstring
Username after it has been sanitized.

Source

$pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login );

Changelog

Version Description
2.0.3 Introduced.

User Contributed Notes

  1. Skip to note 2 content

    This filter is run before a user is created and/or updated. The fact that all pre_user hooks are run in both conditions makes life a bit more complicated.

    The filter is referenced in both wp-admin/user-new.php and wp-includes/user.php

    Here’s an example of using it to make sure a newly created user has a nickname equal to the user’s first and last name:

    /**
     * Check if the user has been created.
     *
     * @param string $login User login.
     * @return string (Maybe) filtered login.
     */
    function wpdocs_check_if_user_created( $login ) {
    	// Don't do anything to login, just see if already in database.
    	global $wpdb, $is_new_login;
    
    	$id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_login = '%s'", $login ) );
    	$is_new_login = ( isset( $id ) ) ? false : true;
    
    	return $login;
    }
    
    /**
     * Filter the user nickname.
     *
     * @param string $nickname User nickname.
     * @return string (Maybe) filtered nickname.
     */
    function wpdocs_fix_nickname ( $nickname ) {
    	global $is_new_login;
    
    	if ( $is_new_login ) {
    		$first_name = empty( $_POST_['first_name'] ) ? sanitize_text_field( $_POST['first_name'] ) : '';
    		$last_name  = empty( $_POST['last_name'] ) ? sanitize_text_field( $_POST['last_name'] ) : '';
    
    		$nickname  = empty( $first_name ) ? '' : $first_name;
    		$nickname .= empty( $last_name ) ? '' : ' ' . $last_name;
    	}
    	return $nickname;
    }
    
    add_filter( 'pre_user_login', 'wpdocs_check_if_user_created' );
    add_filter( 'pre_user_nickname', 'wpdocs_fix_nickname' );