author | ymh <ymh.work@gmail.com> |
Fri, 05 Sep 2025 18:40:08 +0200 | |
changeset 21 | 48c4eec2b7e6 |
parent 19 | 3d72ae0968f4 |
child 22 | 8c2e4d02f4ef |
permissions | -rw-r--r-- |
0 | 1 |
<?php |
2 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3 |
* Core User API |
0 | 4 |
* |
5 |
* @package WordPress |
|
5 | 6 |
* @subpackage Users |
0 | 7 |
*/ |
8 |
||
9 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
10 |
* Authenticates and logs a user in with 'remember' capability. |
0 | 11 |
* |
12 |
* The credentials is an array that has 'user_login', 'user_password', and |
|
13 |
* 'remember' indices. If the credentials is not given, then the log in form |
|
14 |
* will be assumed and used if set. |
|
15 |
* |
|
16 |
* The various authentication cookies will be set by this function and will be |
|
17 |
* set for a longer period depending on if the 'remember' credential is set to |
|
18 |
* true. |
|
19 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
20 |
* Note: wp_signon() doesn't handle setting the current user. This means that if the |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
21 |
* function is called before the {@see 'init'} hook is fired, is_user_logged_in() will |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
22 |
* evaluate as false until that point. If is_user_logged_in() is needed in conjunction |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
23 |
* with wp_signon(), wp_set_current_user() should be called explicitly. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
24 |
* |
0 | 25 |
* @since 2.5.0 |
26 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
27 |
* @global string $auth_secure_cookie |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
28 |
* @global wpdb $wpdb WordPress database abstraction object. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
29 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
30 |
* @param array $credentials { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
31 |
* Optional. User info in order to sign on. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
32 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
33 |
* @type string $user_login Username. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
34 |
* @type string $user_password User password. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
35 |
* @type bool $remember Whether to 'remember' the user. Increases the time |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
36 |
* that the cookie will be kept. Default false. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
37 |
* } |
5 | 38 |
* @param string|bool $secure_cookie Optional. Whether to use secure cookie. |
39 |
* @return WP_User|WP_Error WP_User on success, WP_Error on failure. |
|
0 | 40 |
*/ |
5 | 41 |
function wp_signon( $credentials = array(), $secure_cookie = '' ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
42 |
global $auth_secure_cookie, $wpdb; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
43 |
|
9 | 44 |
if ( empty( $credentials ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
45 |
$credentials = array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
46 |
'user_login' => '', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
47 |
'user_password' => '', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
48 |
'remember' => false, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
49 |
); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
50 |
|
9 | 51 |
if ( ! empty( $_POST['log'] ) ) { |
16 | 52 |
$credentials['user_login'] = wp_unslash( $_POST['log'] ); |
9 | 53 |
} |
54 |
if ( ! empty( $_POST['pwd'] ) ) { |
|
0 | 55 |
$credentials['user_password'] = $_POST['pwd']; |
9 | 56 |
} |
57 |
if ( ! empty( $_POST['rememberme'] ) ) { |
|
0 | 58 |
$credentials['remember'] = $_POST['rememberme']; |
9 | 59 |
} |
0 | 60 |
} |
61 |
||
9 | 62 |
if ( ! empty( $credentials['remember'] ) ) { |
0 | 63 |
$credentials['remember'] = true; |
9 | 64 |
} else { |
0 | 65 |
$credentials['remember'] = false; |
9 | 66 |
} |
0 | 67 |
|
5 | 68 |
/** |
69 |
* Fires before the user is authenticated. |
|
70 |
* |
|
71 |
* The variables passed to the callbacks are passed by reference, |
|
72 |
* and can be modified by callback functions. |
|
73 |
* |
|
74 |
* @since 1.5.1 |
|
75 |
* |
|
76 |
* @todo Decide whether to deprecate the wp_authenticate action. |
|
77 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
78 |
* @param string $user_login Username (passed by reference). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
79 |
* @param string $user_password User password (passed by reference). |
5 | 80 |
*/ |
81 |
do_action_ref_array( 'wp_authenticate', array( &$credentials['user_login'], &$credentials['user_password'] ) ); |
|
0 | 82 |
|
9 | 83 |
if ( '' === $secure_cookie ) { |
0 | 84 |
$secure_cookie = is_ssl(); |
9 | 85 |
} |
0 | 86 |
|
5 | 87 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
88 |
* Filters whether to use a secure sign-on cookie. |
5 | 89 |
* |
90 |
* @since 3.1.0 |
|
91 |
* |
|
92 |
* @param bool $secure_cookie Whether to use a secure sign-on cookie. |
|
93 |
* @param array $credentials { |
|
9 | 94 |
* Array of entered sign-on data. |
95 |
* |
|
96 |
* @type string $user_login Username. |
|
97 |
* @type string $user_password Password entered. |
|
5 | 98 |
* @type bool $remember Whether to 'remember' the user. Increases the time |
99 |
* that the cookie will be kept. Default false. |
|
9 | 100 |
* } |
5 | 101 |
*/ |
102 |
$secure_cookie = apply_filters( 'secure_signon_cookie', $secure_cookie, $credentials ); |
|
0 | 103 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
104 |
// XXX ugly hack to pass this to wp_authenticate_cookie(). |
0 | 105 |
$auth_secure_cookie = $secure_cookie; |
106 |
||
9 | 107 |
add_filter( 'authenticate', 'wp_authenticate_cookie', 30, 3 ); |
108 |
||
109 |
$user = wp_authenticate( $credentials['user_login'], $credentials['user_password'] ); |
|
110 |
||
111 |
if ( is_wp_error( $user ) ) { |
|
0 | 112 |
return $user; |
113 |
} |
|
114 |
||
9 | 115 |
wp_set_auth_cookie( $user->ID, $credentials['remember'], $secure_cookie ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
116 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
117 |
// Clear `user_activation_key` after a successful login. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
118 |
if ( ! empty( $user->user_activation_key ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
119 |
$wpdb->update( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
120 |
$wpdb->users, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
121 |
array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
122 |
'user_activation_key' => '', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
123 |
), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
124 |
array( 'ID' => $user->ID ) |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
125 |
); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
126 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
127 |
$user->user_activation_key = ''; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
128 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
129 |
|
5 | 130 |
/** |
131 |
* Fires after the user has successfully logged in. |
|
132 |
* |
|
133 |
* @since 1.5.0 |
|
134 |
* |
|
135 |
* @param string $user_login Username. |
|
136 |
* @param WP_User $user WP_User object of the logged-in user. |
|
137 |
*/ |
|
138 |
do_action( 'wp_login', $user->user_login, $user ); |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
139 |
|
0 | 140 |
return $user; |
141 |
} |
|
142 |
||
143 |
/** |
|
19 | 144 |
* Authenticates a user, confirming the username and password are valid. |
5 | 145 |
* |
146 |
* @since 2.8.0 |
|
147 |
* |
|
148 |
* @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. |
|
149 |
* @param string $username Username for authentication. |
|
150 |
* @param string $password Password for authentication. |
|
151 |
* @return WP_User|WP_Error WP_User on success, WP_Error on failure. |
|
0 | 152 |
*/ |
9 | 153 |
function wp_authenticate_username_password( $user, $username, $password ) { |
5 | 154 |
if ( $user instanceof WP_User ) { |
155 |
return $user; |
|
156 |
} |
|
0 | 157 |
|
9 | 158 |
if ( empty( $username ) || empty( $password ) ) { |
159 |
if ( is_wp_error( $user ) ) { |
|
0 | 160 |
return $user; |
9 | 161 |
} |
0 | 162 |
|
163 |
$error = new WP_Error(); |
|
164 |
||
9 | 165 |
if ( empty( $username ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
166 |
$error->add( 'empty_username', __( '<strong>Error:</strong> The username field is empty.' ) ); |
9 | 167 |
} |
168 |
||
169 |
if ( empty( $password ) ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
170 |
$error->add( 'empty_password', __( '<strong>Error:</strong> The password field is empty.' ) ); |
9 | 171 |
} |
0 | 172 |
|
173 |
return $error; |
|
174 |
} |
|
175 |
||
9 | 176 |
$user = get_user_by( 'login', $username ); |
177 |
||
178 |
if ( ! $user ) { |
|
179 |
return new WP_Error( |
|
180 |
'invalid_username', |
|
18 | 181 |
sprintf( |
182 |
/* translators: %s: User name. */ |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
183 |
__( '<strong>Error:</strong> The username <strong>%s</strong> is not registered on this site. If you are unsure of your username, try your email address instead.' ), |
18 | 184 |
$username |
185 |
) |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
186 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
187 |
} |
0 | 188 |
|
5 | 189 |
/** |
19 | 190 |
* Filters whether the given user can be authenticated with the provided password. |
5 | 191 |
* |
192 |
* @since 2.5.0 |
|
193 |
* |
|
194 |
* @param WP_User|WP_Error $user WP_User or WP_Error object if a previous |
|
195 |
* callback failed authentication. |
|
196 |
* @param string $password Password to check against the user. |
|
197 |
*/ |
|
198 |
$user = apply_filters( 'wp_authenticate_user', $user, $password ); |
|
9 | 199 |
if ( is_wp_error( $user ) ) { |
0 | 200 |
return $user; |
9 | 201 |
} |
0 | 202 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
203 |
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { |
9 | 204 |
return new WP_Error( |
205 |
'incorrect_password', |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
206 |
sprintf( |
16 | 207 |
/* translators: %s: User name. */ |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
208 |
__( '<strong>Error:</strong> The password you entered for the username %s is incorrect.' ), |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
209 |
'<strong>' . $username . '</strong>' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
210 |
) . |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
211 |
' <a href="' . wp_lostpassword_url() . '">' . |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
212 |
__( 'Lost your password?' ) . |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
213 |
'</a>' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
214 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
215 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
216 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
217 |
return $user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
218 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
219 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
220 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
221 |
* Authenticates a user using the email and password. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
222 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
223 |
* @since 4.5.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
224 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
225 |
* @param WP_User|WP_Error|null $user WP_User or WP_Error object if a previous |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
226 |
* callback failed authentication. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
227 |
* @param string $email Email address for authentication. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
228 |
* @param string $password Password for authentication. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
229 |
* @return WP_User|WP_Error WP_User on success, WP_Error on failure. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
230 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
231 |
function wp_authenticate_email_password( $user, $email, $password ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
232 |
if ( $user instanceof WP_User ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
233 |
return $user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
234 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
235 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
236 |
if ( empty( $email ) || empty( $password ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
237 |
if ( is_wp_error( $user ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
238 |
return $user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
239 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
240 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
241 |
$error = new WP_Error(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
242 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
243 |
if ( empty( $email ) ) { |
16 | 244 |
// Uses 'empty_username' for back-compat with wp_signon(). |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
245 |
$error->add( 'empty_username', __( '<strong>Error:</strong> The email field is empty.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
246 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
247 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
248 |
if ( empty( $password ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
249 |
$error->add( 'empty_password', __( '<strong>Error:</strong> The password field is empty.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
250 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
251 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
252 |
return $error; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
253 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
254 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
255 |
if ( ! is_email( $email ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
256 |
return $user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
257 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
258 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
259 |
$user = get_user_by( 'email', $email ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
260 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
261 |
if ( ! $user ) { |
9 | 262 |
return new WP_Error( |
263 |
'invalid_email', |
|
16 | 264 |
__( 'Unknown email address. Check again or try your username.' ) |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
265 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
266 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
267 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
268 |
/** This filter is documented in wp-includes/user.php */ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
269 |
$user = apply_filters( 'wp_authenticate_user', $user, $password ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
270 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
271 |
if ( is_wp_error( $user ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
272 |
return $user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
273 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
274 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
275 |
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { |
9 | 276 |
return new WP_Error( |
277 |
'incorrect_password', |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
278 |
sprintf( |
16 | 279 |
/* translators: %s: Email address. */ |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
280 |
__( '<strong>Error:</strong> The password you entered for the email address %s is incorrect.' ), |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
281 |
'<strong>' . $email . '</strong>' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
282 |
) . |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
283 |
' <a href="' . wp_lostpassword_url() . '">' . |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
284 |
__( 'Lost your password?' ) . |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
285 |
'</a>' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
286 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
287 |
} |
0 | 288 |
|
289 |
return $user; |
|
290 |
} |
|
291 |
||
292 |
/** |
|
19 | 293 |
* Authenticates the user using the WordPress auth cookie. |
5 | 294 |
* |
295 |
* @since 2.8.0 |
|
296 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
297 |
* @global string $auth_secure_cookie |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
298 |
* |
5 | 299 |
* @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. |
300 |
* @param string $username Username. If not empty, cancels the cookie authentication. |
|
301 |
* @param string $password Password. If not empty, cancels the cookie authentication. |
|
302 |
* @return WP_User|WP_Error WP_User on success, WP_Error on failure. |
|
0 | 303 |
*/ |
9 | 304 |
function wp_authenticate_cookie( $user, $username, $password ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
305 |
global $auth_secure_cookie; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
306 |
|
5 | 307 |
if ( $user instanceof WP_User ) { |
308 |
return $user; |
|
309 |
} |
|
0 | 310 |
|
9 | 311 |
if ( empty( $username ) && empty( $password ) ) { |
0 | 312 |
$user_id = wp_validate_auth_cookie(); |
9 | 313 |
if ( $user_id ) { |
314 |
return new WP_User( $user_id ); |
|
315 |
} |
|
0 | 316 |
|
9 | 317 |
if ( $auth_secure_cookie ) { |
0 | 318 |
$auth_cookie = SECURE_AUTH_COOKIE; |
9 | 319 |
} else { |
0 | 320 |
$auth_cookie = AUTH_COOKIE; |
9 | 321 |
} |
322 |
||
323 |
if ( ! empty( $_COOKIE[ $auth_cookie ] ) ) { |
|
324 |
return new WP_Error( 'expired_session', __( 'Please log in again.' ) ); |
|
325 |
} |
|
0 | 326 |
|
327 |
// If the cookie is not set, be silent. |
|
328 |
} |
|
329 |
||
330 |
return $user; |
|
331 |
} |
|
332 |
||
333 |
/** |
|
18 | 334 |
* Authenticates the user using an application password. |
335 |
* |
|
336 |
* @since 5.6.0 |
|
337 |
* |
|
338 |
* @param WP_User|WP_Error|null $input_user WP_User or WP_Error object if a previous |
|
339 |
* callback failed authentication. |
|
340 |
* @param string $username Username for authentication. |
|
341 |
* @param string $password Password for authentication. |
|
342 |
* @return WP_User|WP_Error|null WP_User on success, WP_Error on failure, null if |
|
343 |
* null is passed in and this isn't an API request. |
|
344 |
*/ |
|
345 |
function wp_authenticate_application_password( $input_user, $username, $password ) { |
|
346 |
if ( $input_user instanceof WP_User ) { |
|
347 |
return $input_user; |
|
348 |
} |
|
349 |
||
350 |
if ( ! WP_Application_Passwords::is_in_use() ) { |
|
351 |
return $input_user; |
|
352 |
} |
|
353 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
354 |
// The 'REST_REQUEST' check here may happen too early for the constant to be available. |
18 | 355 |
$is_api_request = ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ); |
356 |
||
357 |
/** |
|
358 |
* Filters whether this is an API request that Application Passwords can be used on. |
|
359 |
* |
|
360 |
* By default, Application Passwords is available for the REST API and XML-RPC. |
|
361 |
* |
|
362 |
* @since 5.6.0 |
|
363 |
* |
|
364 |
* @param bool $is_api_request If this is an acceptable API request. |
|
365 |
*/ |
|
366 |
$is_api_request = apply_filters( 'application_password_is_api_request', $is_api_request ); |
|
367 |
||
368 |
if ( ! $is_api_request ) { |
|
369 |
return $input_user; |
|
370 |
} |
|
371 |
||
372 |
$error = null; |
|
373 |
$user = get_user_by( 'login', $username ); |
|
374 |
||
375 |
if ( ! $user && is_email( $username ) ) { |
|
376 |
$user = get_user_by( 'email', $username ); |
|
377 |
} |
|
378 |
||
379 |
// If the login name is invalid, short circuit. |
|
380 |
if ( ! $user ) { |
|
381 |
if ( is_email( $username ) ) { |
|
382 |
$error = new WP_Error( |
|
383 |
'invalid_email', |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
384 |
__( '<strong>Error:</strong> Unknown email address. Check again or try your username.' ) |
18 | 385 |
); |
386 |
} else { |
|
387 |
$error = new WP_Error( |
|
388 |
'invalid_username', |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
389 |
__( '<strong>Error:</strong> Unknown username. Check again or try your email address.' ) |
18 | 390 |
); |
391 |
} |
|
392 |
} elseif ( ! wp_is_application_passwords_available() ) { |
|
393 |
$error = new WP_Error( |
|
394 |
'application_passwords_disabled', |
|
395 |
__( 'Application passwords are not available.' ) |
|
396 |
); |
|
397 |
} elseif ( ! wp_is_application_passwords_available_for_user( $user ) ) { |
|
398 |
$error = new WP_Error( |
|
399 |
'application_passwords_disabled_for_user', |
|
400 |
__( 'Application passwords are not available for your account. Please contact the site administrator for assistance.' ) |
|
401 |
); |
|
402 |
} |
|
403 |
||
404 |
if ( $error ) { |
|
405 |
/** |
|
406 |
* Fires when an application password failed to authenticate the user. |
|
407 |
* |
|
408 |
* @since 5.6.0 |
|
409 |
* |
|
410 |
* @param WP_Error $error The authentication error. |
|
411 |
*/ |
|
412 |
do_action( 'application_password_failed_authentication', $error ); |
|
413 |
||
414 |
return $error; |
|
415 |
} |
|
416 |
||
417 |
/* |
|
19 | 418 |
* Strips out anything non-alphanumeric. This is so passwords can be used with |
18 | 419 |
* or without spaces to indicate the groupings for readability. |
420 |
* |
|
421 |
* Generated application passwords are exclusively alphanumeric. |
|
422 |
*/ |
|
423 |
$password = preg_replace( '/[^a-z\d]/i', '', $password ); |
|
424 |
||
425 |
$hashed_passwords = WP_Application_Passwords::get_user_application_passwords( $user->ID ); |
|
426 |
||
427 |
foreach ( $hashed_passwords as $key => $item ) { |
|
428 |
if ( ! wp_check_password( $password, $item['password'], $user->ID ) ) { |
|
429 |
continue; |
|
430 |
} |
|
431 |
||
432 |
$error = new WP_Error(); |
|
433 |
||
434 |
/** |
|
435 |
* Fires when an application password has been successfully checked as valid. |
|
436 |
* |
|
437 |
* This allows for plugins to add additional constraints to prevent an application password from being used. |
|
438 |
* |
|
439 |
* @since 5.6.0 |
|
440 |
* |
|
441 |
* @param WP_Error $error The error object. |
|
442 |
* @param WP_User $user The user authenticating. |
|
443 |
* @param array $item The details about the application password. |
|
444 |
* @param string $password The raw supplied password. |
|
445 |
*/ |
|
446 |
do_action( 'wp_authenticate_application_password_errors', $error, $user, $item, $password ); |
|
447 |
||
448 |
if ( is_wp_error( $error ) && $error->has_errors() ) { |
|
449 |
/** This action is documented in wp-includes/user.php */ |
|
450 |
do_action( 'application_password_failed_authentication', $error ); |
|
451 |
||
452 |
return $error; |
|
453 |
} |
|
454 |
||
455 |
WP_Application_Passwords::record_application_password_usage( $user->ID, $item['uuid'] ); |
|
456 |
||
457 |
/** |
|
458 |
* Fires after an application password was used for authentication. |
|
459 |
* |
|
460 |
* @since 5.6.0 |
|
461 |
* |
|
462 |
* @param WP_User $user The user who was authenticated. |
|
463 |
* @param array $item The application password used. |
|
464 |
*/ |
|
465 |
do_action( 'application_password_did_authenticate', $user, $item ); |
|
466 |
||
467 |
return $user; |
|
468 |
} |
|
469 |
||
470 |
$error = new WP_Error( |
|
471 |
'incorrect_password', |
|
472 |
__( 'The provided password is an invalid application password.' ) |
|
473 |
); |
|
474 |
||
475 |
/** This action is documented in wp-includes/user.php */ |
|
476 |
do_action( 'application_password_failed_authentication', $error ); |
|
477 |
||
478 |
return $error; |
|
479 |
} |
|
480 |
||
481 |
/** |
|
482 |
* Validates the application password credentials passed via Basic Authentication. |
|
483 |
* |
|
484 |
* @since 5.6.0 |
|
485 |
* |
|
486 |
* @param int|false $input_user User ID if one has been determined, false otherwise. |
|
487 |
* @return int|false The authenticated user ID if successful, false otherwise. |
|
488 |
*/ |
|
489 |
function wp_validate_application_password( $input_user ) { |
|
490 |
// Don't authenticate twice. |
|
491 |
if ( ! empty( $input_user ) ) { |
|
492 |
return $input_user; |
|
493 |
} |
|
494 |
||
495 |
if ( ! wp_is_application_passwords_available() ) { |
|
496 |
return $input_user; |
|
497 |
} |
|
498 |
||
499 |
// Both $_SERVER['PHP_AUTH_USER'] and $_SERVER['PHP_AUTH_PW'] must be set in order to attempt authentication. |
|
500 |
if ( ! isset( $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) ) { |
|
501 |
return $input_user; |
|
502 |
} |
|
503 |
||
504 |
$authenticated = wp_authenticate_application_password( null, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ); |
|
505 |
||
506 |
if ( $authenticated instanceof WP_User ) { |
|
507 |
return $authenticated->ID; |
|
508 |
} |
|
509 |
||
510 |
// If it wasn't a user what got returned, just pass on what we had received originally. |
|
511 |
return $input_user; |
|
512 |
} |
|
513 |
||
514 |
/** |
|
19 | 515 |
* For Multisite blogs, checks if the authenticated user has been marked as a |
0 | 516 |
* spammer, or if the user's primary blog has been marked as spam. |
517 |
* |
|
518 |
* @since 3.7.0 |
|
5 | 519 |
* |
520 |
* @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. |
|
521 |
* @return WP_User|WP_Error WP_User on success, WP_Error if the user is considered a spammer. |
|
0 | 522 |
*/ |
523 |
function wp_authenticate_spam_check( $user ) { |
|
5 | 524 |
if ( $user instanceof WP_User && is_multisite() ) { |
525 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
526 |
* Filters whether the user has been marked as a spammer. |
5 | 527 |
* |
528 |
* @since 3.7.0 |
|
529 |
* |
|
530 |
* @param bool $spammed Whether the user is considered a spammer. |
|
531 |
* @param WP_User $user User to check against. |
|
532 |
*/ |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
533 |
$spammed = apply_filters( 'check_is_user_spammed', is_user_spammy( $user ), $user ); |
0 | 534 |
|
9 | 535 |
if ( $spammed ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
536 |
return new WP_Error( 'spammer_account', __( '<strong>Error:</strong> Your account has been marked as a spammer.' ) ); |
9 | 537 |
} |
0 | 538 |
} |
539 |
return $user; |
|
540 |
} |
|
541 |
||
542 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
543 |
* Validates the logged-in cookie. |
5 | 544 |
* |
545 |
* Checks the logged-in cookie if the previous auth cookie could not be |
|
546 |
* validated and parsed. |
|
547 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
548 |
* This is a callback for the {@see 'determine_current_user'} filter, rather than API. |
5 | 549 |
* |
550 |
* @since 3.9.0 |
|
551 |
* |
|
18 | 552 |
* @param int|false $user_id The user ID (or false) as received from |
553 |
* the `determine_current_user` filter. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
554 |
* @return int|false User ID if validated, false otherwise. If a user ID from |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
555 |
* an earlier filter callback is received, that value is returned. |
5 | 556 |
*/ |
557 |
function wp_validate_logged_in_cookie( $user_id ) { |
|
558 |
if ( $user_id ) { |
|
559 |
return $user_id; |
|
560 |
} |
|
561 |
||
9 | 562 |
if ( is_blog_admin() || is_network_admin() || empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { |
5 | 563 |
return false; |
564 |
} |
|
565 |
||
9 | 566 |
return wp_validate_auth_cookie( $_COOKIE[ LOGGED_IN_COOKIE ], 'logged_in' ); |
5 | 567 |
} |
568 |
||
569 |
/** |
|
19 | 570 |
* Gets the number of posts a user has written. |
0 | 571 |
* |
572 |
* @since 3.0.0 |
|
5 | 573 |
* @since 4.1.0 Added `$post_type` argument. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
574 |
* @since 4.3.0 Added `$public_only` argument. Added the ability to pass an array |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
575 |
* of post types to `$post_type`. |
5 | 576 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
577 |
* @global wpdb $wpdb WordPress database abstraction object. |
0 | 578 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
579 |
* @param int $userid User ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
580 |
* @param array|string $post_type Optional. Single post type or array of post types to count the number of posts for. Default 'post'. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
581 |
* @param bool $public_only Optional. Whether to only return counts for public posts. Default false. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
582 |
* @return string Number of posts the user has written in this post type. |
0 | 583 |
*/ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
584 |
function count_user_posts( $userid, $post_type = 'post', $public_only = false ) { |
0 | 585 |
global $wpdb; |
586 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
587 |
$where = get_posts_by_author_sql( $post_type, true, $userid, $public_only ); |
0 | 588 |
|
589 |
$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); |
|
590 |
||
5 | 591 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
592 |
* Filters the number of posts a user has written. |
5 | 593 |
* |
594 |
* @since 2.7.0 |
|
595 |
* @since 4.1.0 Added `$post_type` argument. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
596 |
* @since 4.3.1 Added `$public_only` argument. |
5 | 597 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
598 |
* @param int $count The user's post count. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
599 |
* @param int $userid User ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
600 |
* @param string|array $post_type Single post type or array of post types to count the number of posts for. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
601 |
* @param bool $public_only Whether to limit counted posts to public posts. |
5 | 602 |
*/ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
603 |
return apply_filters( 'get_usernumposts', $count, $userid, $post_type, $public_only ); |
0 | 604 |
} |
605 |
||
606 |
/** |
|
19 | 607 |
* Gets the number of posts written by a list of users. |
0 | 608 |
* |
609 |
* @since 3.0.0 |
|
610 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
611 |
* @global wpdb $wpdb WordPress database abstraction object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
612 |
* |
16 | 613 |
* @param int[] $users Array of user IDs. |
614 |
* @param string|string[] $post_type Optional. Single post type or array of post types to check. Defaults to 'post'. |
|
615 |
* @param bool $public_only Optional. Only return counts for public posts. Defaults to false. |
|
616 |
* @return string[] Amount of posts each user has written, as strings, keyed by user ID. |
|
0 | 617 |
*/ |
618 |
function count_many_users_posts( $users, $post_type = 'post', $public_only = false ) { |
|
619 |
global $wpdb; |
|
620 |
||
621 |
$count = array(); |
|
9 | 622 |
if ( empty( $users ) || ! is_array( $users ) ) { |
0 | 623 |
return $count; |
9 | 624 |
} |
0 | 625 |
|
626 |
$userlist = implode( ',', array_map( 'absint', $users ) ); |
|
9 | 627 |
$where = get_posts_by_author_sql( $post_type, true, null, $public_only ); |
0 | 628 |
|
629 |
$result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N ); |
|
630 |
foreach ( $result as $row ) { |
|
631 |
$count[ $row[0] ] = $row[1]; |
|
632 |
} |
|
633 |
||
634 |
foreach ( $users as $id ) { |
|
9 | 635 |
if ( ! isset( $count[ $id ] ) ) { |
0 | 636 |
$count[ $id ] = 0; |
9 | 637 |
} |
0 | 638 |
} |
639 |
||
640 |
return $count; |
|
641 |
} |
|
642 |
||
643 |
// |
|
16 | 644 |
// User option functions. |
0 | 645 |
// |
646 |
||
647 |
/** |
|
19 | 648 |
* Gets the current user's ID. |
0 | 649 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
650 |
* @since MU (3.0.0) |
0 | 651 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
652 |
* @return int The current user's ID, or 0 if no user is logged in. |
0 | 653 |
*/ |
654 |
function get_current_user_id() { |
|
9 | 655 |
if ( ! function_exists( 'wp_get_current_user' ) ) { |
0 | 656 |
return 0; |
9 | 657 |
} |
0 | 658 |
$user = wp_get_current_user(); |
659 |
return ( isset( $user->ID ) ? (int) $user->ID : 0 ); |
|
660 |
} |
|
661 |
||
662 |
/** |
|
19 | 663 |
* Retrieves user option that can be either per Site or per Network. |
0 | 664 |
* |
665 |
* If the user ID is not given, then the current user will be used instead. If |
|
666 |
* the user ID is given, then the user data will be retrieved. The filter for |
|
667 |
* the result, will also pass the original option name and finally the user data |
|
668 |
* object as the third parameter. |
|
669 |
* |
|
670 |
* The option will first check for the per site name and then the per Network name. |
|
671 |
* |
|
672 |
* @since 2.0.0 |
|
5 | 673 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
674 |
* @global wpdb $wpdb WordPress database abstraction object. |
0 | 675 |
* |
5 | 676 |
* @param string $option User option name. |
677 |
* @param int $user Optional. User ID. |
|
678 |
* @param string $deprecated Use get_option() to check for an option in the options table. |
|
679 |
* @return mixed User option value on success, false on failure. |
|
0 | 680 |
*/ |
681 |
function get_user_option( $option, $user = 0, $deprecated = '' ) { |
|
682 |
global $wpdb; |
|
683 |
||
9 | 684 |
if ( ! empty( $deprecated ) ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
685 |
_deprecated_argument( __FUNCTION__, '3.0.0' ); |
9 | 686 |
} |
687 |
||
688 |
if ( empty( $user ) ) { |
|
0 | 689 |
$user = get_current_user_id(); |
9 | 690 |
} |
691 |
||
16 | 692 |
$user = get_userdata( $user ); |
693 |
if ( ! $user ) { |
|
0 | 694 |
return false; |
9 | 695 |
} |
0 | 696 |
|
697 |
$prefix = $wpdb->get_blog_prefix(); |
|
16 | 698 |
if ( $user->has_prop( $prefix . $option ) ) { // Blog-specific. |
0 | 699 |
$result = $user->get( $prefix . $option ); |
16 | 700 |
} elseif ( $user->has_prop( $option ) ) { // User-specific and cross-blog. |
0 | 701 |
$result = $user->get( $option ); |
9 | 702 |
} else { |
0 | 703 |
$result = false; |
9 | 704 |
} |
0 | 705 |
|
5 | 706 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
707 |
* Filters a specific user option value. |
5 | 708 |
* |
709 |
* The dynamic portion of the hook name, `$option`, refers to the user option name. |
|
710 |
* |
|
711 |
* @since 2.5.0 |
|
712 |
* |
|
713 |
* @param mixed $result Value for the user's option. |
|
714 |
* @param string $option Name of the option being retrieved. |
|
715 |
* @param WP_User $user WP_User object of the user whose option is being retrieved. |
|
716 |
*/ |
|
717 |
return apply_filters( "get_user_option_{$option}", $result, $option, $user ); |
|
0 | 718 |
} |
719 |
||
720 |
/** |
|
19 | 721 |
* Updates user option with global blog capability. |
0 | 722 |
* |
723 |
* User options are just like user metadata except that they have support for |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
724 |
* global blog options. If the 'is_global' parameter is false, which it is by default, |
0 | 725 |
* it will prepend the WordPress table prefix to the option name. |
726 |
* |
|
727 |
* Deletes the user option if $newvalue is empty. |
|
728 |
* |
|
729 |
* @since 2.0.0 |
|
730 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
731 |
* @global wpdb $wpdb WordPress database abstraction object. |
5 | 732 |
* |
733 |
* @param int $user_id User ID. |
|
0 | 734 |
* @param string $option_name User option name. |
5 | 735 |
* @param mixed $newvalue User option value. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
736 |
* @param bool $is_global Optional. Whether option name is global or blog specific. |
5 | 737 |
* Default false (blog specific). |
738 |
* @return int|bool User meta ID if the option didn't exist, true on successful update, |
|
739 |
* false on failure. |
|
0 | 740 |
*/ |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
741 |
function update_user_option( $user_id, $option_name, $newvalue, $is_global = false ) { |
0 | 742 |
global $wpdb; |
743 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
744 |
if ( ! $is_global ) { |
0 | 745 |
$option_name = $wpdb->get_blog_prefix() . $option_name; |
9 | 746 |
} |
0 | 747 |
|
748 |
return update_user_meta( $user_id, $option_name, $newvalue ); |
|
749 |
} |
|
750 |
||
751 |
/** |
|
19 | 752 |
* Deletes user option with global blog capability. |
0 | 753 |
* |
754 |
* User options are just like user metadata except that they have support for |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
755 |
* global blog options. If the 'is_global' parameter is false, which it is by default, |
0 | 756 |
* it will prepend the WordPress table prefix to the option name. |
757 |
* |
|
758 |
* @since 3.0.0 |
|
5 | 759 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
760 |
* @global wpdb $wpdb WordPress database abstraction object. |
0 | 761 |
* |
5 | 762 |
* @param int $user_id User ID |
0 | 763 |
* @param string $option_name User option name. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
764 |
* @param bool $is_global Optional. Whether option name is global or blog specific. |
5 | 765 |
* Default false (blog specific). |
766 |
* @return bool True on success, false on failure. |
|
0 | 767 |
*/ |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
768 |
function delete_user_option( $user_id, $option_name, $is_global = false ) { |
0 | 769 |
global $wpdb; |
770 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
771 |
if ( ! $is_global ) { |
0 | 772 |
$option_name = $wpdb->get_blog_prefix() . $option_name; |
9 | 773 |
} |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
774 |
|
0 | 775 |
return delete_user_meta( $user_id, $option_name ); |
776 |
} |
|
777 |
||
778 |
/** |
|
19 | 779 |
* Retrieves list of users matching criteria. |
0 | 780 |
* |
781 |
* @since 3.1.0 |
|
5 | 782 |
* |
783 |
* @see WP_User_Query |
|
0 | 784 |
* |
18 | 785 |
* @param array $args Optional. Arguments to retrieve users. See WP_User_Query::prepare_query() |
5 | 786 |
* for more information on accepted arguments. |
0 | 787 |
* @return array List of users. |
788 |
*/ |
|
789 |
function get_users( $args = array() ) { |
|
790 |
||
9 | 791 |
$args = wp_parse_args( $args ); |
0 | 792 |
$args['count_total'] = false; |
793 |
||
9 | 794 |
$user_search = new WP_User_Query( $args ); |
0 | 795 |
|
796 |
return (array) $user_search->get_results(); |
|
797 |
} |
|
798 |
||
799 |
/** |
|
19 | 800 |
* Lists all the users of the site, with several options available. |
801 |
* |
|
802 |
* @since 5.9.0 |
|
803 |
* |
|
804 |
* @param string|array $args { |
|
805 |
* Optional. Array or string of default arguments. |
|
806 |
* |
|
807 |
* @type string $orderby How to sort the users. Accepts 'nicename', 'email', 'url', 'registered', |
|
808 |
* 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name', |
|
809 |
* 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'. |
|
810 |
* @type string $order Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'. |
|
811 |
* @type int $number Maximum users to return or display. Default empty (all users). |
|
812 |
* @type bool $exclude_admin Whether to exclude the 'admin' account, if it exists. Default false. |
|
813 |
* @type bool $show_fullname Whether to show the user's full name. Default false. |
|
814 |
* @type string $feed If not empty, show a link to the user's feed and use this text as the alt |
|
815 |
* parameter of the link. Default empty. |
|
816 |
* @type string $feed_image If not empty, show a link to the user's feed and use this image URL as |
|
817 |
* clickable anchor. Default empty. |
|
818 |
* @type string $feed_type The feed type to link to, such as 'rss2'. Defaults to default feed type. |
|
819 |
* @type bool $echo Whether to output the result or instead return it. Default true. |
|
820 |
* @type string $style If 'list', each user is wrapped in an `<li>` element, otherwise the users |
|
821 |
* will be separated by commas. |
|
822 |
* @type bool $html Whether to list the items in HTML form or plaintext. Default true. |
|
823 |
* @type string $exclude An array, comma-, or space-separated list of user IDs to exclude. Default empty. |
|
824 |
* @type string $include An array, comma-, or space-separated list of user IDs to include. Default empty. |
|
825 |
* } |
|
826 |
* @return string|null The output if echo is false. Otherwise null. |
|
827 |
*/ |
|
828 |
function wp_list_users( $args = array() ) { |
|
829 |
$defaults = array( |
|
830 |
'orderby' => 'name', |
|
831 |
'order' => 'ASC', |
|
832 |
'number' => '', |
|
833 |
'exclude_admin' => true, |
|
834 |
'show_fullname' => false, |
|
835 |
'feed' => '', |
|
836 |
'feed_image' => '', |
|
837 |
'feed_type' => '', |
|
838 |
'echo' => true, |
|
839 |
'style' => 'list', |
|
840 |
'html' => true, |
|
841 |
'exclude' => '', |
|
842 |
'include' => '', |
|
843 |
); |
|
844 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
845 |
$parsed_args = wp_parse_args( $args, $defaults ); |
19 | 846 |
|
847 |
$return = ''; |
|
848 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
849 |
$query_args = wp_array_slice_assoc( $parsed_args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) ); |
19 | 850 |
$query_args['fields'] = 'ids'; |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
851 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
852 |
/** |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
853 |
* Filters the query arguments for the list of all users of the site. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
854 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
855 |
* @since 6.1.0 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
856 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
857 |
* @param array $query_args The query arguments for get_users(). |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
858 |
* @param array $parsed_args The arguments passed to wp_list_users() combined with the defaults. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
859 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
860 |
$query_args = apply_filters( 'wp_list_users_args', $query_args, $parsed_args ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
861 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
862 |
$users = get_users( $query_args ); |
19 | 863 |
|
864 |
foreach ( $users as $user_id ) { |
|
865 |
$user = get_userdata( $user_id ); |
|
866 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
867 |
if ( $parsed_args['exclude_admin'] && 'admin' === $user->display_name ) { |
19 | 868 |
continue; |
869 |
} |
|
870 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
871 |
if ( $parsed_args['show_fullname'] && '' !== $user->first_name && '' !== $user->last_name ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
872 |
$name = sprintf( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
873 |
/* translators: 1: User's first name, 2: Last name. */ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
874 |
_x( '%1$s %2$s', 'Display name based on first name and last name' ), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
875 |
$user->first_name, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
876 |
$user->last_name |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
877 |
); |
19 | 878 |
} else { |
879 |
$name = $user->display_name; |
|
880 |
} |
|
881 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
882 |
if ( ! $parsed_args['html'] ) { |
19 | 883 |
$return .= $name . ', '; |
884 |
||
885 |
continue; // No need to go further to process HTML. |
|
886 |
} |
|
887 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
888 |
if ( 'list' === $parsed_args['style'] ) { |
19 | 889 |
$return .= '<li>'; |
890 |
} |
|
891 |
||
892 |
$row = $name; |
|
893 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
894 |
if ( ! empty( $parsed_args['feed_image'] ) || ! empty( $parsed_args['feed'] ) ) { |
19 | 895 |
$row .= ' '; |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
896 |
if ( empty( $parsed_args['feed_image'] ) ) { |
19 | 897 |
$row .= '('; |
898 |
} |
|
899 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
900 |
$row .= '<a href="' . get_author_feed_link( $user->ID, $parsed_args['feed_type'] ) . '"'; |
19 | 901 |
|
902 |
$alt = ''; |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
903 |
if ( ! empty( $parsed_args['feed'] ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
904 |
$alt = ' alt="' . esc_attr( $parsed_args['feed'] ) . '"'; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
905 |
$name = $parsed_args['feed']; |
19 | 906 |
} |
907 |
||
908 |
$row .= '>'; |
|
909 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
910 |
if ( ! empty( $parsed_args['feed_image'] ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
911 |
$row .= '<img src="' . esc_url( $parsed_args['feed_image'] ) . '" style="border: none;"' . $alt . ' />'; |
19 | 912 |
} else { |
913 |
$row .= $name; |
|
914 |
} |
|
915 |
||
916 |
$row .= '</a>'; |
|
917 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
918 |
if ( empty( $parsed_args['feed_image'] ) ) { |
19 | 919 |
$row .= ')'; |
920 |
} |
|
921 |
} |
|
922 |
||
923 |
$return .= $row; |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
924 |
$return .= ( 'list' === $parsed_args['style'] ) ? '</li>' : ', '; |
19 | 925 |
} |
926 |
||
927 |
$return = rtrim( $return, ', ' ); |
|
928 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
929 |
if ( ! $parsed_args['echo'] ) { |
19 | 930 |
return $return; |
931 |
} |
|
932 |
echo $return; |
|
933 |
} |
|
934 |
||
935 |
/** |
|
936 |
* Gets the sites a user belongs to. |
|
0 | 937 |
* |
938 |
* @since 3.0.0 |
|
9 | 939 |
* @since 4.7.0 Converted to use `get_sites()`. |
0 | 940 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
941 |
* @global wpdb $wpdb WordPress database abstraction object. |
5 | 942 |
* |
943 |
* @param int $user_id User ID |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
944 |
* @param bool $all Whether to retrieve all sites, or only sites that are not |
5 | 945 |
* marked as deleted, archived, or spam. |
18 | 946 |
* @return object[] A list of the user's sites. An empty array if the user doesn't exist |
947 |
* or belongs to no sites. |
|
0 | 948 |
*/ |
949 |
function get_blogs_of_user( $user_id, $all = false ) { |
|
950 |
global $wpdb; |
|
951 |
||
952 |
$user_id = (int) $user_id; |
|
953 |
||
16 | 954 |
// Logged out users can't have sites. |
9 | 955 |
if ( empty( $user_id ) ) { |
0 | 956 |
return array(); |
9 | 957 |
} |
0 | 958 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
959 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
960 |
* Filters the list of a user's sites before it is populated. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
961 |
* |
16 | 962 |
* Returning a non-null value from the filter will effectively short circuit |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
963 |
* get_blogs_of_user(), returning that value instead. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
964 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
965 |
* @since 4.6.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
966 |
* |
18 | 967 |
* @param null|object[] $sites An array of site objects of which the user is a member. |
968 |
* @param int $user_id User ID. |
|
969 |
* @param bool $all Whether the returned array should contain all sites, including |
|
970 |
* those marked 'deleted', 'archived', or 'spam'. Default false. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
971 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
972 |
$sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
973 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
974 |
if ( null !== $sites ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
975 |
return $sites; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
976 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
977 |
|
0 | 978 |
$keys = get_user_meta( $user_id ); |
9 | 979 |
if ( empty( $keys ) ) { |
0 | 980 |
return array(); |
9 | 981 |
} |
0 | 982 |
|
983 |
if ( ! is_multisite() ) { |
|
9 | 984 |
$site_id = get_current_blog_id(); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
985 |
$sites = array( $site_id => new stdClass() ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
986 |
$sites[ $site_id ]->userblog_id = $site_id; |
9 | 987 |
$sites[ $site_id ]->blogname = get_option( 'blogname' ); |
988 |
$sites[ $site_id ]->domain = ''; |
|
989 |
$sites[ $site_id ]->path = ''; |
|
990 |
$sites[ $site_id ]->site_id = 1; |
|
991 |
$sites[ $site_id ]->siteurl = get_option( 'siteurl' ); |
|
992 |
$sites[ $site_id ]->archived = 0; |
|
993 |
$sites[ $site_id ]->spam = 0; |
|
994 |
$sites[ $site_id ]->deleted = 0; |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
995 |
return $sites; |
0 | 996 |
} |
997 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
998 |
$site_ids = array(); |
0 | 999 |
|
1000 |
if ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1001 |
$site_ids[] = 1; |
0 | 1002 |
unset( $keys[ $wpdb->base_prefix . 'capabilities' ] ); |
1003 |
} |
|
1004 |
||
1005 |
$keys = array_keys( $keys ); |
|
1006 |
||
1007 |
foreach ( $keys as $key ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1008 |
if ( ! str_ends_with( $key, 'capabilities' ) ) { |
0 | 1009 |
continue; |
9 | 1010 |
} |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1011 |
if ( $wpdb->base_prefix && ! str_starts_with( $key, $wpdb->base_prefix ) ) { |
0 | 1012 |
continue; |
9 | 1013 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1014 |
$site_id = str_replace( array( $wpdb->base_prefix, '_capabilities' ), '', $key ); |
9 | 1015 |
if ( ! is_numeric( $site_id ) ) { |
0 | 1016 |
continue; |
9 | 1017 |
} |
0 | 1018 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1019 |
$site_ids[] = (int) $site_id; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1020 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1021 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1022 |
$sites = array(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1023 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1024 |
if ( ! empty( $site_ids ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1025 |
$args = array( |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1026 |
'number' => '', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1027 |
'site__in' => $site_ids, |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1028 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1029 |
if ( ! $all ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1030 |
$args['archived'] = 0; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1031 |
$args['spam'] = 0; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1032 |
$args['deleted'] = 0; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1033 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1034 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1035 |
$_sites = get_sites( $args ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1036 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1037 |
foreach ( $_sites as $site ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1038 |
$sites[ $site->id ] = (object) array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1039 |
'userblog_id' => $site->id, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1040 |
'blogname' => $site->blogname, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1041 |
'domain' => $site->domain, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1042 |
'path' => $site->path, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1043 |
'site_id' => $site->network_id, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1044 |
'siteurl' => $site->siteurl, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1045 |
'archived' => $site->archived, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1046 |
'mature' => $site->mature, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1047 |
'spam' => $site->spam, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1048 |
'deleted' => $site->deleted, |
0 | 1049 |
); |
1050 |
} |
|
1051 |
} |
|
1052 |
||
5 | 1053 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1054 |
* Filters the list of sites a user belongs to. |
5 | 1055 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1056 |
* @since MU (3.0.0) |
5 | 1057 |
* |
18 | 1058 |
* @param object[] $sites An array of site objects belonging to the user. |
1059 |
* @param int $user_id User ID. |
|
1060 |
* @param bool $all Whether the returned sites array should contain all sites, including |
|
1061 |
* those marked 'deleted', 'archived', or 'spam'. Default false. |
|
5 | 1062 |
*/ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1063 |
return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all ); |
0 | 1064 |
} |
1065 |
||
1066 |
/** |
|
19 | 1067 |
* Finds out whether a user is a member of a given blog. |
0 | 1068 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1069 |
* @since MU (3.0.0) |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1070 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1071 |
* @global wpdb $wpdb WordPress database abstraction object. |
0 | 1072 |
* |
1073 |
* @param int $user_id Optional. The unique ID of the user. Defaults to the current user. |
|
1074 |
* @param int $blog_id Optional. ID of the blog to check. Defaults to the current site. |
|
1075 |
* @return bool |
|
1076 |
*/ |
|
1077 |
function is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1078 |
global $wpdb; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1079 |
|
0 | 1080 |
$user_id = (int) $user_id; |
1081 |
$blog_id = (int) $blog_id; |
|
1082 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1083 |
if ( empty( $user_id ) ) { |
0 | 1084 |
$user_id = get_current_user_id(); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1085 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1086 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1087 |
/* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1088 |
* Technically not needed, but does save calls to get_site() and get_user_meta() |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1089 |
* in the event that the function is called when a user isn't logged in. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1090 |
*/ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1091 |
if ( empty( $user_id ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1092 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1093 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1094 |
$user = get_userdata( $user_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1095 |
if ( ! $user instanceof WP_User ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1096 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1097 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1098 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1099 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1100 |
if ( ! is_multisite() ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1101 |
return true; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1102 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1103 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1104 |
if ( empty( $blog_id ) ) { |
0 | 1105 |
$blog_id = get_current_blog_id(); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1106 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1107 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1108 |
$blog = get_site( $blog_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1109 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1110 |
if ( ! $blog || ! isset( $blog->domain ) || $blog->archived || $blog->spam || $blog->deleted ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1111 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1112 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1113 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1114 |
$keys = get_user_meta( $user_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1115 |
if ( empty( $keys ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1116 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1117 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1118 |
|
16 | 1119 |
// No underscore before capabilities in $base_capabilities_key. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1120 |
$base_capabilities_key = $wpdb->base_prefix . 'capabilities'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1121 |
$site_capabilities_key = $wpdb->base_prefix . $blog_id . '_capabilities'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1122 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1123 |
if ( isset( $keys[ $base_capabilities_key ] ) && 1 === $blog_id ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1124 |
return true; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1125 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1126 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1127 |
if ( isset( $keys[ $site_capabilities_key ] ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1128 |
return true; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1129 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1130 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1131 |
return false; |
0 | 1132 |
} |
1133 |
||
1134 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1135 |
* Adds meta data to a user. |
0 | 1136 |
* |
1137 |
* @since 3.0.0 |
|
1138 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1139 |
* @param int $user_id User ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1140 |
* @param string $meta_key Metadata name. |
16 | 1141 |
* @param mixed $meta_value Metadata value. Must be serializable if non-scalar. |
1142 |
* @param bool $unique Optional. Whether the same key should not be added. |
|
1143 |
* Default false. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1144 |
* @return int|false Meta ID on success, false on failure. |
0 | 1145 |
*/ |
9 | 1146 |
function add_user_meta( $user_id, $meta_key, $meta_value, $unique = false ) { |
1147 |
return add_metadata( 'user', $user_id, $meta_key, $meta_value, $unique ); |
|
0 | 1148 |
} |
1149 |
||
1150 |
/** |
|
19 | 1151 |
* Removes metadata matching criteria from a user. |
0 | 1152 |
* |
1153 |
* You can match based on the key, or key and value. Removing based on key and |
|
1154 |
* value, will keep from removing duplicate metadata with the same key. It also |
|
1155 |
* allows removing all metadata matching key, if needed. |
|
1156 |
* |
|
1157 |
* @since 3.0.0 |
|
16 | 1158 |
* |
1159 |
* @link https://developer.wordpress.org/reference/functions/delete_user_meta/ |
|
0 | 1160 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1161 |
* @param int $user_id User ID |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1162 |
* @param string $meta_key Metadata name. |
16 | 1163 |
* @param mixed $meta_value Optional. Metadata value. If provided, |
1164 |
* rows will only be removed that match the value. |
|
1165 |
* Must be serializable if non-scalar. Default empty. |
|
0 | 1166 |
* @return bool True on success, false on failure. |
1167 |
*/ |
|
9 | 1168 |
function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) { |
1169 |
return delete_metadata( 'user', $user_id, $meta_key, $meta_value ); |
|
0 | 1170 |
} |
1171 |
||
1172 |
/** |
|
19 | 1173 |
* Retrieves user meta field for a user. |
0 | 1174 |
* |
1175 |
* @since 3.0.0 |
|
16 | 1176 |
* |
1177 |
* @link https://developer.wordpress.org/reference/functions/get_user_meta/ |
|
0 | 1178 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1179 |
* @param int $user_id User ID. |
16 | 1180 |
* @param string $key Optional. The meta key to retrieve. By default, |
1181 |
* returns data for all keys. |
|
1182 |
* @param bool $single Optional. Whether to return a single value. |
|
18 | 1183 |
* This parameter has no effect if `$key` is not specified. |
16 | 1184 |
* Default false. |
18 | 1185 |
* @return mixed An array of values if `$single` is false. |
1186 |
* The value of meta data field if `$single` is true. |
|
1187 |
* False for an invalid `$user_id` (non-numeric, zero, or negative value). |
|
1188 |
* An empty string if a valid but non-existing user ID is passed. |
|
0 | 1189 |
*/ |
9 | 1190 |
function get_user_meta( $user_id, $key = '', $single = false ) { |
1191 |
return get_metadata( 'user', $user_id, $key, $single ); |
|
0 | 1192 |
} |
1193 |
||
1194 |
/** |
|
19 | 1195 |
* Updates user meta field based on user ID. |
0 | 1196 |
* |
1197 |
* Use the $prev_value parameter to differentiate between meta fields with the |
|
1198 |
* same key and user ID. |
|
1199 |
* |
|
1200 |
* If the meta field for the user does not exist, it will be added. |
|
1201 |
* |
|
1202 |
* @since 3.0.0 |
|
16 | 1203 |
* |
1204 |
* @link https://developer.wordpress.org/reference/functions/update_user_meta/ |
|
0 | 1205 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1206 |
* @param int $user_id User ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1207 |
* @param string $meta_key Metadata key. |
16 | 1208 |
* @param mixed $meta_value Metadata value. Must be serializable if non-scalar. |
1209 |
* @param mixed $prev_value Optional. Previous value to check before updating. |
|
1210 |
* If specified, only update existing metadata entries with |
|
1211 |
* this value. Otherwise, update all entries. Default empty. |
|
1212 |
* @return int|bool Meta ID if the key didn't exist, true on successful update, |
|
1213 |
* false on failure or if the value passed to the function |
|
1214 |
* is the same as the one that is already in the database. |
|
0 | 1215 |
*/ |
9 | 1216 |
function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) { |
1217 |
return update_metadata( 'user', $user_id, $meta_key, $meta_value, $prev_value ); |
|
0 | 1218 |
} |
1219 |
||
1220 |
/** |
|
19 | 1221 |
* Counts number of users who have each of the user roles. |
0 | 1222 |
* |
1223 |
* Assumes there are neither duplicated nor orphaned capabilities meta_values. |
|
1224 |
* Assumes role names are unique phrases. Same assumption made by WP_User_Query::prepare_query() |
|
1225 |
* Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users. |
|
1226 |
* Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257. |
|
1227 |
* |
|
1228 |
* @since 3.0.0 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1229 |
* @since 4.4.0 The number of users with no role is now included in the `none` element. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1230 |
* @since 4.9.0 The `$site_id` parameter was added to support multisite. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1231 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1232 |
* @global wpdb $wpdb WordPress database abstraction object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1233 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1234 |
* @param string $strategy Optional. The computational strategy to use when counting the users. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1235 |
* Accepts either 'time' or 'memory'. Default 'time'. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1236 |
* @param int|null $site_id Optional. The site ID to count users for. Defaults to the current site. |
16 | 1237 |
* @return array { |
1238 |
* User counts. |
|
1239 |
* |
|
1240 |
* @type int $total_users Total number of users on the site. |
|
1241 |
* @type int[] $avail_roles Array of user counts keyed by user role. |
|
1242 |
* } |
|
0 | 1243 |
*/ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1244 |
function count_users( $strategy = 'time', $site_id = null ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1245 |
global $wpdb; |
0 | 1246 |
|
16 | 1247 |
// Initialize. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1248 |
if ( ! $site_id ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1249 |
$site_id = get_current_blog_id(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1250 |
} |
9 | 1251 |
|
1252 |
/** |
|
18 | 1253 |
* Filters the user count before queries are run. |
1254 |
* |
|
1255 |
* Return a non-null value to cause count_users() to return early. |
|
9 | 1256 |
* |
1257 |
* @since 5.1.0 |
|
1258 |
* |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1259 |
* @param null|array $result The value to return instead. Default null to continue with the query. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1260 |
* @param string $strategy Optional. The computational strategy to use when counting the users. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1261 |
* Accepts either 'time' or 'memory'. Default 'time'. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1262 |
* @param int $site_id The site ID to count users for. |
9 | 1263 |
*/ |
1264 |
$pre = apply_filters( 'pre_count_users', null, $strategy, $site_id ); |
|
1265 |
||
1266 |
if ( null !== $pre ) { |
|
1267 |
return $pre; |
|
1268 |
} |
|
1269 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1270 |
$blog_prefix = $wpdb->get_blog_prefix( $site_id ); |
9 | 1271 |
$result = array(); |
0 | 1272 |
|
16 | 1273 |
if ( 'time' === $strategy ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1274 |
if ( is_multisite() && get_current_blog_id() !== $site_id ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1275 |
switch_to_blog( $site_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1276 |
$avail_roles = wp_roles()->get_names(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1277 |
restore_current_blog(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1278 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1279 |
$avail_roles = wp_roles()->get_names(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1280 |
} |
0 | 1281 |
|
1282 |
// Build a CPU-intensive query that will return concise information. |
|
1283 |
$select_count = array(); |
|
1284 |
foreach ( $avail_roles as $this_role => $name ) { |
|
9 | 1285 |
$select_count[] = $wpdb->prepare( 'COUNT(NULLIF(`meta_value` LIKE %s, false))', '%' . $wpdb->esc_like( '"' . $this_role . '"' ) . '%' ); |
0 | 1286 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1287 |
$select_count[] = "COUNT(NULLIF(`meta_value` = 'a:0:{}', false))"; |
9 | 1288 |
$select_count = implode( ', ', $select_count ); |
0 | 1289 |
|
1290 |
// Add the meta_value index to the selection list, then run the query. |
|
9 | 1291 |
$row = $wpdb->get_row( |
1292 |
" |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1293 |
SELECT {$select_count}, COUNT(*) |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1294 |
FROM {$wpdb->usermeta} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1295 |
INNER JOIN {$wpdb->users} ON user_id = ID |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1296 |
WHERE meta_key = '{$blog_prefix}capabilities' |
9 | 1297 |
", |
1298 |
ARRAY_N |
|
1299 |
); |
|
0 | 1300 |
|
1301 |
// Run the previous loop again to associate results with role names. |
|
9 | 1302 |
$col = 0; |
0 | 1303 |
$role_counts = array(); |
1304 |
foreach ( $avail_roles as $this_role => $name ) { |
|
9 | 1305 |
$count = (int) $row[ $col++ ]; |
1306 |
if ( $count > 0 ) { |
|
1307 |
$role_counts[ $this_role ] = $count; |
|
0 | 1308 |
} |
1309 |
} |
|
1310 |
||
9 | 1311 |
$role_counts['none'] = (int) $row[ $col++ ]; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1312 |
|
0 | 1313 |
// Get the meta_value index from the end of the result set. |
9 | 1314 |
$total_users = (int) $row[ $col ]; |
0 | 1315 |
|
1316 |
$result['total_users'] = $total_users; |
|
1317 |
$result['avail_roles'] =& $role_counts; |
|
1318 |
} else { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1319 |
$avail_roles = array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1320 |
'none' => 0, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1321 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1322 |
|
9 | 1323 |
$users_of_blog = $wpdb->get_col( |
1324 |
" |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1325 |
SELECT meta_value |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1326 |
FROM {$wpdb->usermeta} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1327 |
INNER JOIN {$wpdb->users} ON user_id = ID |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1328 |
WHERE meta_key = '{$blog_prefix}capabilities' |
9 | 1329 |
" |
1330 |
); |
|
0 | 1331 |
|
1332 |
foreach ( $users_of_blog as $caps_meta ) { |
|
9 | 1333 |
$b_roles = maybe_unserialize( $caps_meta ); |
1334 |
if ( ! is_array( $b_roles ) ) { |
|
0 | 1335 |
continue; |
9 | 1336 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1337 |
if ( empty( $b_roles ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1338 |
++$avail_roles['none']; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1339 |
} |
0 | 1340 |
foreach ( $b_roles as $b_role => $val ) { |
9 | 1341 |
if ( isset( $avail_roles[ $b_role ] ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1342 |
++$avail_roles[ $b_role ]; |
0 | 1343 |
} else { |
9 | 1344 |
$avail_roles[ $b_role ] = 1; |
0 | 1345 |
} |
1346 |
} |
|
1347 |
} |
|
1348 |
||
1349 |
$result['total_users'] = count( $users_of_blog ); |
|
1350 |
$result['avail_roles'] =& $avail_roles; |
|
1351 |
} |
|
1352 |
||
1353 |
return $result; |
|
1354 |
} |
|
1355 |
||
19 | 1356 |
/** |
1357 |
* Returns the number of active users in your installation. |
|
1358 |
* |
|
1359 |
* Note that on a large site the count may be cached and only updated twice daily. |
|
1360 |
* |
|
1361 |
* @since MU (3.0.0) |
|
1362 |
* @since 4.8.0 The `$network_id` parameter has been added. |
|
1363 |
* @since 6.0.0 Moved to wp-includes/user.php. |
|
1364 |
* |
|
1365 |
* @param int|null $network_id ID of the network. Defaults to the current network. |
|
1366 |
* @return int Number of active users on the network. |
|
1367 |
*/ |
|
1368 |
function get_user_count( $network_id = null ) { |
|
1369 |
if ( ! is_multisite() && null !== $network_id ) { |
|
1370 |
_doing_it_wrong( |
|
1371 |
__FUNCTION__, |
|
1372 |
sprintf( |
|
1373 |
/* translators: %s: $network_id */ |
|
1374 |
__( 'Unable to pass %s if not using multisite.' ), |
|
1375 |
'<code>$network_id</code>' |
|
1376 |
), |
|
1377 |
'6.0.0' |
|
1378 |
); |
|
1379 |
} |
|
1380 |
||
1381 |
return (int) get_network_option( $network_id, 'user_count', -1 ); |
|
1382 |
} |
|
1383 |
||
1384 |
/** |
|
1385 |
* Updates the total count of users on the site if live user counting is enabled. |
|
1386 |
* |
|
1387 |
* @since 6.0.0 |
|
1388 |
* |
|
1389 |
* @param int|null $network_id ID of the network. Defaults to the current network. |
|
1390 |
* @return bool Whether the update was successful. |
|
1391 |
*/ |
|
1392 |
function wp_maybe_update_user_counts( $network_id = null ) { |
|
1393 |
if ( ! is_multisite() && null !== $network_id ) { |
|
1394 |
_doing_it_wrong( |
|
1395 |
__FUNCTION__, |
|
1396 |
sprintf( |
|
1397 |
/* translators: %s: $network_id */ |
|
1398 |
__( 'Unable to pass %s if not using multisite.' ), |
|
1399 |
'<code>$network_id</code>' |
|
1400 |
), |
|
1401 |
'6.0.0' |
|
1402 |
); |
|
1403 |
} |
|
1404 |
||
1405 |
$is_small_network = ! wp_is_large_user_count( $network_id ); |
|
1406 |
/** This filter is documented in wp-includes/ms-functions.php */ |
|
1407 |
if ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'users' ) ) { |
|
1408 |
return false; |
|
1409 |
} |
|
1410 |
||
1411 |
return wp_update_user_counts( $network_id ); |
|
1412 |
} |
|
1413 |
||
1414 |
/** |
|
1415 |
* Updates the total count of users on the site. |
|
1416 |
* |
|
1417 |
* @global wpdb $wpdb WordPress database abstraction object. |
|
1418 |
* @since 6.0.0 |
|
1419 |
* |
|
1420 |
* @param int|null $network_id ID of the network. Defaults to the current network. |
|
1421 |
* @return bool Whether the update was successful. |
|
1422 |
*/ |
|
1423 |
function wp_update_user_counts( $network_id = null ) { |
|
1424 |
global $wpdb; |
|
1425 |
||
1426 |
if ( ! is_multisite() && null !== $network_id ) { |
|
1427 |
_doing_it_wrong( |
|
1428 |
__FUNCTION__, |
|
1429 |
sprintf( |
|
1430 |
/* translators: %s: $network_id */ |
|
1431 |
__( 'Unable to pass %s if not using multisite.' ), |
|
1432 |
'<code>$network_id</code>' |
|
1433 |
), |
|
1434 |
'6.0.0' |
|
1435 |
); |
|
1436 |
} |
|
1437 |
||
1438 |
$query = "SELECT COUNT(ID) as c FROM $wpdb->users"; |
|
1439 |
if ( is_multisite() ) { |
|
1440 |
$query .= " WHERE spam = '0' AND deleted = '0'"; |
|
1441 |
} |
|
1442 |
||
1443 |
$count = $wpdb->get_var( $query ); |
|
1444 |
||
1445 |
return update_network_option( $network_id, 'user_count', $count ); |
|
1446 |
} |
|
1447 |
||
1448 |
/** |
|
1449 |
* Schedules a recurring recalculation of the total count of users. |
|
1450 |
* |
|
1451 |
* @since 6.0.0 |
|
1452 |
*/ |
|
1453 |
function wp_schedule_update_user_counts() { |
|
1454 |
if ( ! is_main_site() ) { |
|
1455 |
return; |
|
1456 |
} |
|
1457 |
||
1458 |
if ( ! wp_next_scheduled( 'wp_update_user_counts' ) && ! wp_installing() ) { |
|
1459 |
wp_schedule_event( time(), 'twicedaily', 'wp_update_user_counts' ); |
|
1460 |
} |
|
1461 |
} |
|
1462 |
||
1463 |
/** |
|
1464 |
* Determines whether the site has a large number of users. |
|
1465 |
* |
|
1466 |
* The default criteria for a large site is more than 10,000 users. |
|
1467 |
* |
|
1468 |
* @since 6.0.0 |
|
1469 |
* |
|
1470 |
* @param int|null $network_id ID of the network. Defaults to the current network. |
|
1471 |
* @return bool Whether the site has a large number of users. |
|
1472 |
*/ |
|
1473 |
function wp_is_large_user_count( $network_id = null ) { |
|
1474 |
if ( ! is_multisite() && null !== $network_id ) { |
|
1475 |
_doing_it_wrong( |
|
1476 |
__FUNCTION__, |
|
1477 |
sprintf( |
|
1478 |
/* translators: %s: $network_id */ |
|
1479 |
__( 'Unable to pass %s if not using multisite.' ), |
|
1480 |
'<code>$network_id</code>' |
|
1481 |
), |
|
1482 |
'6.0.0' |
|
1483 |
); |
|
1484 |
} |
|
1485 |
||
1486 |
$count = get_user_count( $network_id ); |
|
1487 |
||
1488 |
/** |
|
1489 |
* Filters whether the site is considered large, based on its number of users. |
|
1490 |
* |
|
1491 |
* @since 6.0.0 |
|
1492 |
* |
|
1493 |
* @param bool $is_large_user_count Whether the site has a large number of users. |
|
1494 |
* @param int $count The total number of users. |
|
1495 |
* @param int|null $network_id ID of the network. `null` represents the current network. |
|
1496 |
*/ |
|
1497 |
return apply_filters( 'wp_is_large_user_count', $count > 10000, $count, $network_id ); |
|
1498 |
} |
|
1499 |
||
0 | 1500 |
// |
16 | 1501 |
// Private helper functions. |
0 | 1502 |
// |
1503 |
||
1504 |
/** |
|
19 | 1505 |
* Sets up global user vars. |
0 | 1506 |
* |
1507 |
* Used by wp_set_current_user() for back compat. Might be deprecated in the future. |
|
1508 |
* |
|
1509 |
* @since 2.0.4 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1510 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1511 |
* @global string $user_login The user username for logging in |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1512 |
* @global WP_User $userdata User data. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1513 |
* @global int $user_level The level of the user |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1514 |
* @global int $user_ID The ID of the user |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1515 |
* @global string $user_email The email address of the user |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1516 |
* @global string $user_url The url in the user's profile |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1517 |
* @global string $user_identity The display name of the user |
0 | 1518 |
* |
9 | 1519 |
* @param int $for_user_id Optional. User ID to set up global data. Default 0. |
0 | 1520 |
*/ |
9 | 1521 |
function setup_userdata( $for_user_id = 0 ) { |
0 | 1522 |
global $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_identity; |
1523 |
||
9 | 1524 |
if ( ! $for_user_id ) { |
0 | 1525 |
$for_user_id = get_current_user_id(); |
9 | 1526 |
} |
0 | 1527 |
$user = get_userdata( $for_user_id ); |
1528 |
||
1529 |
if ( ! $user ) { |
|
16 | 1530 |
$user_ID = 0; |
1531 |
$user_level = 0; |
|
1532 |
$userdata = null; |
|
1533 |
$user_login = ''; |
|
1534 |
$user_email = ''; |
|
1535 |
$user_url = ''; |
|
1536 |
$user_identity = ''; |
|
0 | 1537 |
return; |
1538 |
} |
|
1539 |
||
9 | 1540 |
$user_ID = (int) $user->ID; |
1541 |
$user_level = (int) $user->user_level; |
|
1542 |
$userdata = $user; |
|
1543 |
$user_login = $user->user_login; |
|
1544 |
$user_email = $user->user_email; |
|
1545 |
$user_url = $user->user_url; |
|
0 | 1546 |
$user_identity = $user->display_name; |
1547 |
} |
|
1548 |
||
1549 |
/** |
|
19 | 1550 |
* Creates dropdown HTML content of users. |
0 | 1551 |
* |
1552 |
* The content can either be displayed, which it is by default or retrieved by |
|
1553 |
* setting the 'echo' argument. The 'include' and 'exclude' arguments do not |
|
1554 |
* need to be used; all users will be displayed in that case. Only one can be |
|
1555 |
* used, either 'include' or 'exclude', but not both. |
|
1556 |
* |
|
1557 |
* The available arguments are as follows: |
|
1558 |
* |
|
1559 |
* @since 2.3.0 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1560 |
* @since 4.5.0 Added the 'display_name_with_login' value for 'show'. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1561 |
* @since 4.7.0 Added the 'role', 'role__in', and 'role__not_in' parameters. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1562 |
* @since 5.9.0 Added the 'capability', 'capability__in', and 'capability__not_in' parameters. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1563 |
* Deprecated the 'who' parameter. |
5 | 1564 |
* |
1565 |
* @param array|string $args { |
|
1566 |
* Optional. Array or string of arguments to generate a drop-down of users. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1567 |
* See WP_User_Query::prepare_query() for additional available arguments. |
0 | 1568 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1569 |
* @type string $show_option_all Text to show as the drop-down default (all). |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1570 |
* Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1571 |
* @type string $show_option_none Text to show as the drop-down default when no |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1572 |
* users were found. Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1573 |
* @type int|string $option_none_value Value to use for `$show_option_none` when no users |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1574 |
* were found. Default -1. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1575 |
* @type string $hide_if_only_one_author Whether to skip generating the drop-down |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1576 |
* if only one user was found. Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1577 |
* @type string $orderby Field to order found users by. Accepts user fields. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1578 |
* Default 'display_name'. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1579 |
* @type string $order Whether to order users in ascending or descending |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1580 |
* order. Accepts 'ASC' (ascending) or 'DESC' (descending). |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1581 |
* Default 'ASC'. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1582 |
* @type int[]|string $include Array or comma-separated list of user IDs to include. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1583 |
* Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1584 |
* @type int[]|string $exclude Array or comma-separated list of user IDs to exclude. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1585 |
* Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1586 |
* @type bool|int $multi Whether to skip the ID attribute on the 'select' element. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1587 |
* Accepts 1|true or 0|false. Default 0|false. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1588 |
* @type string $show User data to display. If the selected item is empty |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1589 |
* then the 'user_login' will be displayed in parentheses. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1590 |
* Accepts any user field, or 'display_name_with_login' to show |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1591 |
* the display name with user_login in parentheses. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1592 |
* Default 'display_name'. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1593 |
* @type int|bool $echo Whether to echo or return the drop-down. Accepts 1|true (echo) |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1594 |
* or 0|false (return). Default 1|true. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1595 |
* @type int $selected Which user ID should be selected. Default 0. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1596 |
* @type bool $include_selected Whether to always include the selected user ID in the drop- |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1597 |
* down. Default false. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1598 |
* @type string $name Name attribute of select element. Default 'user'. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1599 |
* @type string $id ID attribute of the select element. Default is the value of `$name`. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1600 |
* @type string $class Class attribute of the select element. Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1601 |
* @type int $blog_id ID of blog (Multisite only). Default is ID of the current blog. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1602 |
* @type string $who Deprecated, use `$capability` instead. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1603 |
* Which type of users to query. Accepts only an empty string or |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1604 |
* 'authors'. Default empty (all users). |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1605 |
* @type string|string[] $role An array or a comma-separated list of role names that users |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1606 |
* must match to be included in results. Note that this is |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1607 |
* an inclusive list: users must match *each* role. Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1608 |
* @type string[] $role__in An array of role names. Matched users must have at least one |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1609 |
* of these roles. Default empty array. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1610 |
* @type string[] $role__not_in An array of role names to exclude. Users matching one or more |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1611 |
* of these roles will not be included in results. Default empty array. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1612 |
* @type string|string[] $capability An array or a comma-separated list of capability names that users |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1613 |
* must match to be included in results. Note that this is |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1614 |
* an inclusive list: users must match *each* capability. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1615 |
* Does NOT work for capabilities not in the database or filtered |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1616 |
* via {@see 'map_meta_cap'}. Default empty. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1617 |
* @type string[] $capability__in An array of capability names. Matched users must have at least one |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1618 |
* of these capabilities. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1619 |
* Does NOT work for capabilities not in the database or filtered |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1620 |
* via {@see 'map_meta_cap'}. Default empty array. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1621 |
* @type string[] $capability__not_in An array of capability names to exclude. Users matching one or more |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1622 |
* of these capabilities will not be included in results. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1623 |
* Does NOT work for capabilities not in the database or filtered |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1624 |
* via {@see 'map_meta_cap'}. Default empty array. |
5 | 1625 |
* } |
16 | 1626 |
* @return string HTML dropdown list of users. |
0 | 1627 |
*/ |
1628 |
function wp_dropdown_users( $args = '' ) { |
|
1629 |
$defaults = array( |
|
9 | 1630 |
'show_option_all' => '', |
1631 |
'show_option_none' => '', |
|
1632 |
'hide_if_only_one_author' => '', |
|
1633 |
'orderby' => 'display_name', |
|
1634 |
'order' => 'ASC', |
|
1635 |
'include' => '', |
|
1636 |
'exclude' => '', |
|
1637 |
'multi' => 0, |
|
1638 |
'show' => 'display_name', |
|
1639 |
'echo' => 1, |
|
1640 |
'selected' => 0, |
|
1641 |
'name' => 'user', |
|
1642 |
'class' => '', |
|
1643 |
'id' => '', |
|
1644 |
'blog_id' => get_current_blog_id(), |
|
1645 |
'who' => '', |
|
1646 |
'include_selected' => false, |
|
1647 |
'option_none_value' => -1, |
|
1648 |
'role' => '', |
|
1649 |
'role__in' => array(), |
|
1650 |
'role__not_in' => array(), |
|
19 | 1651 |
'capability' => '', |
1652 |
'capability__in' => array(), |
|
1653 |
'capability__not_in' => array(), |
|
0 | 1654 |
); |
1655 |
||
1656 |
$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0; |
|
1657 |
||
16 | 1658 |
$parsed_args = wp_parse_args( $args, $defaults ); |
1659 |
||
19 | 1660 |
$query_args = wp_array_slice_assoc( |
1661 |
$parsed_args, |
|
1662 |
array( |
|
1663 |
'blog_id', |
|
1664 |
'include', |
|
1665 |
'exclude', |
|
1666 |
'orderby', |
|
1667 |
'order', |
|
1668 |
'who', |
|
1669 |
'role', |
|
1670 |
'role__in', |
|
1671 |
'role__not_in', |
|
1672 |
'capability', |
|
1673 |
'capability__in', |
|
1674 |
'capability__not_in', |
|
1675 |
) |
|
1676 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1677 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1678 |
$fields = array( 'ID', 'user_login' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1679 |
|
16 | 1680 |
$show = ! empty( $parsed_args['show'] ) ? $parsed_args['show'] : 'display_name'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1681 |
if ( 'display_name_with_login' === $show ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1682 |
$fields[] = 'display_name'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1683 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1684 |
$fields[] = $show; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1685 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1686 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1687 |
$query_args['fields'] = $fields; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1688 |
|
16 | 1689 |
$show_option_all = $parsed_args['show_option_all']; |
1690 |
$show_option_none = $parsed_args['show_option_none']; |
|
1691 |
$option_none_value = $parsed_args['option_none_value']; |
|
0 | 1692 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1693 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1694 |
* Filters the query arguments for the list of users in the dropdown. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1695 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1696 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1697 |
* |
16 | 1698 |
* @param array $query_args The query arguments for get_users(). |
1699 |
* @param array $parsed_args The arguments passed to wp_dropdown_users() combined with the defaults. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1700 |
*/ |
16 | 1701 |
$query_args = apply_filters( 'wp_dropdown_users_args', $query_args, $parsed_args ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1702 |
|
0 | 1703 |
$users = get_users( $query_args ); |
1704 |
||
1705 |
$output = ''; |
|
16 | 1706 |
if ( ! empty( $users ) && ( empty( $parsed_args['hide_if_only_one_author'] ) || count( $users ) > 1 ) ) { |
1707 |
$name = esc_attr( $parsed_args['name'] ); |
|
1708 |
if ( $parsed_args['multi'] && ! $parsed_args['id'] ) { |
|
0 | 1709 |
$id = ''; |
5 | 1710 |
} else { |
16 | 1711 |
$id = $parsed_args['id'] ? " id='" . esc_attr( $parsed_args['id'] ) . "'" : " id='$name'"; |
5 | 1712 |
} |
16 | 1713 |
$output = "<select name='{$name}'{$id} class='" . $parsed_args['class'] . "'>\n"; |
0 | 1714 |
|
5 | 1715 |
if ( $show_option_all ) { |
0 | 1716 |
$output .= "\t<option value='0'>$show_option_all</option>\n"; |
5 | 1717 |
} |
0 | 1718 |
|
1719 |
if ( $show_option_none ) { |
|
16 | 1720 |
$_selected = selected( $option_none_value, $parsed_args['selected'], false ); |
9 | 1721 |
$output .= "\t<option value='" . esc_attr( $option_none_value ) . "'$_selected>$show_option_none</option>\n"; |
0 | 1722 |
} |
1723 |
||
16 | 1724 |
if ( $parsed_args['include_selected'] && ( $parsed_args['selected'] > 0 ) ) { |
1725 |
$found_selected = false; |
|
1726 |
$parsed_args['selected'] = (int) $parsed_args['selected']; |
|
18 | 1727 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1728 |
foreach ( (array) $users as $user ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1729 |
$user->ID = (int) $user->ID; |
16 | 1730 |
if ( $user->ID === $parsed_args['selected'] ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1731 |
$found_selected = true; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1732 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1733 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1734 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1735 |
if ( ! $found_selected ) { |
18 | 1736 |
$selected_user = get_userdata( $parsed_args['selected'] ); |
1737 |
if ( $selected_user ) { |
|
1738 |
$users[] = $selected_user; |
|
1739 |
} |
|
5 | 1740 |
} |
0 | 1741 |
} |
1742 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1743 |
foreach ( (array) $users as $user ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1744 |
if ( 'display_name_with_login' === $show ) { |
16 | 1745 |
/* translators: 1: User's display name, 2: User login. */ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1746 |
$display = sprintf( _x( '%1$s (%2$s)', 'user dropdown' ), $user->display_name, $user->user_login ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1747 |
} elseif ( ! empty( $user->$show ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1748 |
$display = $user->$show; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1749 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1750 |
$display = '(' . $user->user_login . ')'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1751 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1752 |
|
16 | 1753 |
$_selected = selected( $user->ID, $parsed_args['selected'], false ); |
9 | 1754 |
$output .= "\t<option value='$user->ID'$_selected>" . esc_html( $display ) . "</option>\n"; |
0 | 1755 |
} |
1756 |
||
9 | 1757 |
$output .= '</select>'; |
0 | 1758 |
} |
1759 |
||
5 | 1760 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1761 |
* Filters the wp_dropdown_users() HTML output. |
5 | 1762 |
* |
1763 |
* @since 2.3.0 |
|
1764 |
* |
|
1765 |
* @param string $output HTML output generated by wp_dropdown_users(). |
|
1766 |
*/ |
|
1767 |
$html = apply_filters( 'wp_dropdown_users', $output ); |
|
0 | 1768 |
|
16 | 1769 |
if ( $parsed_args['echo'] ) { |
5 | 1770 |
echo $html; |
1771 |
} |
|
1772 |
return $html; |
|
0 | 1773 |
} |
1774 |
||
1775 |
/** |
|
19 | 1776 |
* Sanitizes user field based on context. |
0 | 1777 |
* |
1778 |
* Possible context values are: 'raw', 'edit', 'db', 'display', 'attribute' and 'js'. The |
|
1779 |
* 'display' context is used by default. 'attribute' and 'js' contexts are treated like 'display' |
|
1780 |
* when calling filters. |
|
1781 |
* |
|
1782 |
* @since 2.3.0 |
|
1783 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1784 |
* @param string $field The user Object field name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1785 |
* @param mixed $value The user Object value. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1786 |
* @param int $user_id User ID. |
0 | 1787 |
* @param string $context How to sanitize user fields. Looks for 'raw', 'edit', 'db', 'display', |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1788 |
* 'attribute' and 'js'. |
0 | 1789 |
* @return mixed Sanitized value. |
1790 |
*/ |
|
9 | 1791 |
function sanitize_user_field( $field, $value, $user_id, $context ) { |
1792 |
$int_fields = array( 'ID' ); |
|
16 | 1793 |
if ( in_array( $field, $int_fields, true ) ) { |
0 | 1794 |
$value = (int) $value; |
9 | 1795 |
} |
1796 |
||
16 | 1797 |
if ( 'raw' === $context ) { |
0 | 1798 |
return $value; |
9 | 1799 |
} |
1800 |
||
1801 |
if ( ! is_string( $value ) && ! is_numeric( $value ) ) { |
|
0 | 1802 |
return $value; |
9 | 1803 |
} |
0 | 1804 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1805 |
$prefixed = str_contains( $field, 'user_' ); |
0 | 1806 |
|
16 | 1807 |
if ( 'edit' === $context ) { |
0 | 1808 |
if ( $prefixed ) { |
5 | 1809 |
|
1810 |
/** This filter is documented in wp-includes/post.php */ |
|
1811 |
$value = apply_filters( "edit_{$field}", $value, $user_id ); |
|
0 | 1812 |
} else { |
5 | 1813 |
|
1814 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1815 |
* Filters a user field value in the 'edit' context. |
5 | 1816 |
* |
1817 |
* The dynamic portion of the hook name, `$field`, refers to the prefixed user |
|
1818 |
* field being filtered, such as 'user_login', 'user_email', 'first_name', etc. |
|
1819 |
* |
|
1820 |
* @since 2.9.0 |
|
1821 |
* |
|
1822 |
* @param mixed $value Value of the prefixed user field. |
|
1823 |
* @param int $user_id User ID. |
|
1824 |
*/ |
|
1825 |
$value = apply_filters( "edit_user_{$field}", $value, $user_id ); |
|
0 | 1826 |
} |
1827 |
||
16 | 1828 |
if ( 'description' === $field ) { |
0 | 1829 |
$value = esc_html( $value ); // textarea_escaped? |
9 | 1830 |
} else { |
1831 |
$value = esc_attr( $value ); |
|
1832 |
} |
|
16 | 1833 |
} elseif ( 'db' === $context ) { |
0 | 1834 |
if ( $prefixed ) { |
5 | 1835 |
/** This filter is documented in wp-includes/post.php */ |
1836 |
$value = apply_filters( "pre_{$field}", $value ); |
|
0 | 1837 |
} else { |
5 | 1838 |
|
1839 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1840 |
* Filters the value of a user field in the 'db' context. |
5 | 1841 |
* |
1842 |
* The dynamic portion of the hook name, `$field`, refers to the prefixed user |
|
1843 |
* field being filtered, such as 'user_login', 'user_email', 'first_name', etc. |
|
9 | 1844 |
* |
5 | 1845 |
* @since 2.9.0 |
1846 |
* |
|
1847 |
* @param mixed $value Value of the prefixed user field. |
|
1848 |
*/ |
|
1849 |
$value = apply_filters( "pre_user_{$field}", $value ); |
|
0 | 1850 |
} |
1851 |
} else { |
|
1852 |
// Use display filters by default. |
|
5 | 1853 |
if ( $prefixed ) { |
1854 |
||
1855 |
/** This filter is documented in wp-includes/post.php */ |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1856 |
$value = apply_filters( "{$field}", $value, $user_id, $context ); |
5 | 1857 |
} else { |
1858 |
||
1859 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1860 |
* Filters the value of a user field in a standard context. |
5 | 1861 |
* |
1862 |
* The dynamic portion of the hook name, `$field`, refers to the prefixed user |
|
1863 |
* field being filtered, such as 'user_login', 'user_email', 'first_name', etc. |
|
1864 |
* |
|
1865 |
* @since 2.9.0 |
|
1866 |
* |
|
1867 |
* @param mixed $value The user object value to sanitize. |
|
1868 |
* @param int $user_id User ID. |
|
1869 |
* @param string $context The context to filter within. |
|
1870 |
*/ |
|
1871 |
$value = apply_filters( "user_{$field}", $value, $user_id, $context ); |
|
1872 |
} |
|
0 | 1873 |
} |
1874 |
||
16 | 1875 |
if ( 'user_url' === $field ) { |
9 | 1876 |
$value = esc_url( $value ); |
1877 |
} |
|
0 | 1878 |
|
16 | 1879 |
if ( 'attribute' === $context ) { |
5 | 1880 |
$value = esc_attr( $value ); |
16 | 1881 |
} elseif ( 'js' === $context ) { |
5 | 1882 |
$value = esc_js( $value ); |
1883 |
} |
|
18 | 1884 |
|
1885 |
// Restore the type for integer fields after esc_attr(). |
|
1886 |
if ( in_array( $field, $int_fields, true ) ) { |
|
1887 |
$value = (int) $value; |
|
1888 |
} |
|
1889 |
||
0 | 1890 |
return $value; |
1891 |
} |
|
1892 |
||
1893 |
/** |
|
19 | 1894 |
* Updates all user caches. |
0 | 1895 |
* |
1896 |
* @since 3.0.0 |
|
1897 |
* |
|
18 | 1898 |
* @param object|WP_User $user User object or database row to be cached |
1899 |
* @return void|false Void on success, false on failure. |
|
0 | 1900 |
*/ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1901 |
function update_user_caches( $user ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1902 |
if ( $user instanceof WP_User ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1903 |
if ( ! $user->exists() ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1904 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1905 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1906 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1907 |
$user = $user->data; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1908 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1909 |
|
9 | 1910 |
wp_cache_add( $user->ID, $user, 'users' ); |
1911 |
wp_cache_add( $user->user_login, $user->ID, 'userlogins' ); |
|
1912 |
wp_cache_add( $user->user_nicename, $user->ID, 'userslugs' ); |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1913 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1914 |
if ( ! empty( $user->user_email ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1915 |
wp_cache_add( $user->user_email, $user->ID, 'useremail' ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1916 |
} |
0 | 1917 |
} |
1918 |
||
1919 |
/** |
|
19 | 1920 |
* Cleans all user caches. |
0 | 1921 |
* |
1922 |
* @since 3.0.0 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1923 |
* @since 4.4.0 'clean_user_cache' action was added. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1924 |
* @since 6.2.0 User metadata caches are now cleared. |
0 | 1925 |
* |
1926 |
* @param WP_User|int $user User object or ID to be cleaned from the cache |
|
1927 |
*/ |
|
1928 |
function clean_user_cache( $user ) { |
|
9 | 1929 |
if ( is_numeric( $user ) ) { |
0 | 1930 |
$user = new WP_User( $user ); |
9 | 1931 |
} |
1932 |
||
1933 |
if ( ! $user->exists() ) { |
|
0 | 1934 |
return; |
9 | 1935 |
} |
0 | 1936 |
|
1937 |
wp_cache_delete( $user->ID, 'users' ); |
|
1938 |
wp_cache_delete( $user->user_login, 'userlogins' ); |
|
1939 |
wp_cache_delete( $user->user_nicename, 'userslugs' ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1940 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1941 |
if ( ! empty( $user->user_email ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1942 |
wp_cache_delete( $user->user_email, 'useremail' ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1943 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1944 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1945 |
wp_cache_delete( $user->ID, 'user_meta' ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1946 |
wp_cache_set_users_last_changed(); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
1947 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1948 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1949 |
* Fires immediately after the given user's cache is cleaned. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1950 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1951 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1952 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1953 |
* @param int $user_id User ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1954 |
* @param WP_User $user User object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1955 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1956 |
do_action( 'clean_user_cache', $user->ID, $user ); |
0 | 1957 |
} |
1958 |
||
1959 |
/** |
|
9 | 1960 |
* Determines whether the given username exists. |
1961 |
* |
|
1962 |
* For more information on this and similar theme functions, check out |
|
1963 |
* the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ |
|
1964 |
* Conditional Tags} article in the Theme Developer Handbook. |
|
0 | 1965 |
* |
1966 |
* @since 2.0.0 |
|
1967 |
* |
|
18 | 1968 |
* @param string $username The username to check for existence. |
1969 |
* @return int|false The user ID on success, false on failure. |
|
0 | 1970 |
*/ |
1971 |
function username_exists( $username ) { |
|
9 | 1972 |
$user = get_user_by( 'login', $username ); |
1973 |
if ( $user ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1974 |
$user_id = $user->ID; |
0 | 1975 |
} else { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1976 |
$user_id = false; |
0 | 1977 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1978 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1979 |
/** |
18 | 1980 |
* Filters whether the given username exists. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1981 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1982 |
* @since 4.9.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1983 |
* |
18 | 1984 |
* @param int|false $user_id The user ID associated with the username, |
1985 |
* or false if the username does not exist. |
|
1986 |
* @param string $username The username to check for existence. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1987 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
1988 |
return apply_filters( 'username_exists', $user_id, $username ); |
0 | 1989 |
} |
1990 |
||
1991 |
/** |
|
9 | 1992 |
* Determines whether the given email exists. |
1993 |
* |
|
1994 |
* For more information on this and similar theme functions, check out |
|
1995 |
* the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ |
|
1996 |
* Conditional Tags} article in the Theme Developer Handbook. |
|
0 | 1997 |
* |
1998 |
* @since 2.1.0 |
|
1999 |
* |
|
18 | 2000 |
* @param string $email The email to check for existence. |
2001 |
* @return int|false The user ID on success, false on failure. |
|
0 | 2002 |
*/ |
2003 |
function email_exists( $email ) { |
|
9 | 2004 |
$user = get_user_by( 'email', $email ); |
2005 |
if ( $user ) { |
|
18 | 2006 |
$user_id = $user->ID; |
2007 |
} else { |
|
2008 |
$user_id = false; |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2009 |
} |
18 | 2010 |
|
2011 |
/** |
|
2012 |
* Filters whether the given email exists. |
|
2013 |
* |
|
2014 |
* @since 5.6.0 |
|
2015 |
* |
|
2016 |
* @param int|false $user_id The user ID associated with the email, |
|
2017 |
* or false if the email does not exist. |
|
2018 |
* @param string $email The email to check for existence. |
|
2019 |
*/ |
|
2020 |
return apply_filters( 'email_exists', $user_id, $email ); |
|
0 | 2021 |
} |
2022 |
||
2023 |
/** |
|
5 | 2024 |
* Checks whether a username is valid. |
0 | 2025 |
* |
2026 |
* @since 2.0.1 |
|
18 | 2027 |
* @since 4.4.0 Empty sanitized usernames are now considered invalid. |
0 | 2028 |
* |
2029 |
* @param string $username Username. |
|
18 | 2030 |
* @return bool Whether username given is valid. |
0 | 2031 |
*/ |
2032 |
function validate_username( $username ) { |
|
2033 |
$sanitized = sanitize_user( $username, true ); |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2034 |
$valid = ( $sanitized === $username && ! empty( $sanitized ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2035 |
|
5 | 2036 |
/** |
18 | 2037 |
* Filters whether the provided username is valid. |
5 | 2038 |
* |
2039 |
* @since 2.0.1 |
|
2040 |
* |
|
2041 |
* @param bool $valid Whether given username is valid. |
|
2042 |
* @param string $username Username to check. |
|
2043 |
*/ |
|
0 | 2044 |
return apply_filters( 'validate_username', $valid, $username ); |
2045 |
} |
|
2046 |
||
2047 |
/** |
|
19 | 2048 |
* Inserts a user into the database. |
0 | 2049 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2050 |
* Most of the `$userdata` array fields have filters associated with the values. Exceptions are |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2051 |
* 'ID', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', |
16 | 2052 |
* 'user_registered', 'user_activation_key', 'spam', and 'role'. The filters have the prefix |
2053 |
* 'pre_user_' followed by the field name. An example using 'description' would have the filter |
|
2054 |
* called 'pre_user_description' that can be hooked into. |
|
0 | 2055 |
* |
5 | 2056 |
* @since 2.0.0 |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2057 |
* @since 3.6.0 The `aim`, `jabber`, and `yim` fields were removed as default user contact |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2058 |
* methods for new installations. See wp_get_user_contact_methods(). |
19 | 2059 |
* @since 4.7.0 The `locale` field can be passed to `$userdata`. |
16 | 2060 |
* @since 5.3.0 The `user_activation_key` field can be passed to `$userdata`. |
2061 |
* @since 5.3.0 The `spam` field can be passed to `$userdata` (Multisite only). |
|
19 | 2062 |
* @since 5.9.0 The `meta_input` field can be passed to `$userdata` to allow addition of user meta data. |
5 | 2063 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2064 |
* @global wpdb $wpdb WordPress database abstraction object. |
5 | 2065 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2066 |
* @param array|object|WP_User $userdata { |
5 | 2067 |
* An array, object, or WP_User object of user data arguments. |
0 | 2068 |
* |
16 | 2069 |
* @type int $ID User ID. If supplied, the user will be updated. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2070 |
* @type string $user_pass The plain-text user password for new users. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2071 |
* Hashed password for existing users. |
16 | 2072 |
* @type string $user_login The user's login username. |
2073 |
* @type string $user_nicename The URL-friendly user name. |
|
2074 |
* @type string $user_url The user URL. |
|
2075 |
* @type string $user_email The user email address. |
|
2076 |
* @type string $display_name The user's display name. |
|
2077 |
* Default is the user's username. |
|
2078 |
* @type string $nickname The user's nickname. |
|
2079 |
* Default is the user's username. |
|
2080 |
* @type string $first_name The user's first name. For new users, will be used |
|
2081 |
* to build the first part of the user's display name |
|
2082 |
* if `$display_name` is not specified. |
|
2083 |
* @type string $last_name The user's last name. For new users, will be used |
|
2084 |
* to build the second part of the user's display name |
|
2085 |
* if `$display_name` is not specified. |
|
2086 |
* @type string $description The user's biographical description. |
|
2087 |
* @type string $rich_editing Whether to enable the rich-editor for the user. |
|
2088 |
* Accepts 'true' or 'false' as a string literal, |
|
2089 |
* not boolean. Default 'true'. |
|
2090 |
* @type string $syntax_highlighting Whether to enable the rich code editor for the user. |
|
2091 |
* Accepts 'true' or 'false' as a string literal, |
|
2092 |
* not boolean. Default 'true'. |
|
2093 |
* @type string $comment_shortcuts Whether to enable comment moderation keyboard |
|
2094 |
* shortcuts for the user. Accepts 'true' or 'false' |
|
2095 |
* as a string literal, not boolean. Default 'false'. |
|
2096 |
* @type string $admin_color Admin color scheme for the user. Default 'fresh'. |
|
2097 |
* @type bool $use_ssl Whether the user should always access the admin over |
|
2098 |
* https. Default false. |
|
19 | 2099 |
* @type string $user_registered Date the user registered in UTC. Format is 'Y-m-d H:i:s'. |
16 | 2100 |
* @type string $user_activation_key Password reset key. Default empty. |
2101 |
* @type bool $spam Multisite only. Whether the user is marked as spam. |
|
2102 |
* Default false. |
|
2103 |
* @type string $show_admin_bar_front Whether to display the Admin Bar for the user |
|
2104 |
* on the site's front end. Accepts 'true' or 'false' |
|
2105 |
* as a string literal, not boolean. Default 'true'. |
|
2106 |
* @type string $role User's role. |
|
2107 |
* @type string $locale User's locale. Default empty. |
|
19 | 2108 |
* @type array $meta_input Array of custom user meta values keyed by meta key. |
2109 |
* Default empty. |
|
5 | 2110 |
* } |
2111 |
* @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not |
|
2112 |
* be created. |
|
0 | 2113 |
*/ |
2114 |
function wp_insert_user( $userdata ) { |
|
2115 |
global $wpdb; |
|
2116 |
||
5 | 2117 |
if ( $userdata instanceof stdClass ) { |
0 | 2118 |
$userdata = get_object_vars( $userdata ); |
5 | 2119 |
} elseif ( $userdata instanceof WP_User ) { |
0 | 2120 |
$userdata = $userdata->to_array(); |
5 | 2121 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2122 |
|
0 | 2123 |
// Are we updating or creating? |
5 | 2124 |
if ( ! empty( $userdata['ID'] ) ) { |
19 | 2125 |
$user_id = (int) $userdata['ID']; |
9 | 2126 |
$update = true; |
19 | 2127 |
$old_user_data = get_userdata( $user_id ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2128 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2129 |
if ( ! $old_user_data ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2130 |
return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2131 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2132 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2133 |
// Slash current user email to compare it later with slashed new user email. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2134 |
$old_user_data->user_email = wp_slash( $old_user_data->user_email ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2135 |
|
16 | 2136 |
// Hashed in wp_update_user(), plaintext if called directly. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2137 |
$user_pass = ! empty( $userdata['user_pass'] ) ? $userdata['user_pass'] : $old_user_data->user_pass; |
0 | 2138 |
} else { |
2139 |
$update = false; |
|
16 | 2140 |
// Hash the password. |
5 | 2141 |
$user_pass = wp_hash_password( $userdata['user_pass'] ); |
0 | 2142 |
} |
2143 |
||
5 | 2144 |
$sanitized_user_login = sanitize_user( $userdata['user_login'], true ); |
2145 |
||
2146 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2147 |
* Filters a username after it has been sanitized. |
5 | 2148 |
* |
2149 |
* This filter is called before the user is created or updated. |
|
2150 |
* |
|
2151 |
* @since 2.0.3 |
|
2152 |
* |
|
2153 |
* @param string $sanitized_user_login Username after it has been sanitized. |
|
2154 |
*/ |
|
2155 |
$pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login ); |
|
0 | 2156 |
|
16 | 2157 |
// Remove any non-printable chars from the login string to see if we have ended up with an empty username. |
5 | 2158 |
$user_login = trim( $pre_user_login ); |
0 | 2159 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2160 |
// user_login must be between 0 and 60 characters. |
5 | 2161 |
if ( empty( $user_login ) ) { |
9 | 2162 |
return new WP_Error( 'empty_user_login', __( 'Cannot create a user with an empty login name.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2163 |
} elseif ( mb_strlen( $user_login ) > 60 ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2164 |
return new WP_Error( 'user_login_too_long', __( 'Username may not be longer than 60 characters.' ) ); |
5 | 2165 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2166 |
|
5 | 2167 |
if ( ! $update && username_exists( $user_login ) ) { |
2168 |
return new WP_Error( 'existing_user_login', __( 'Sorry, that username already exists!' ) ); |
|
2169 |
} |
|
0 | 2170 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2171 |
/** |
16 | 2172 |
* Filters the list of disallowed usernames. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2173 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2174 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2175 |
* |
16 | 2176 |
* @param array $usernames Array of disallowed usernames. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2177 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2178 |
$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2179 |
|
16 | 2180 |
if ( in_array( strtolower( $user_login ), array_map( 'strtolower', $illegal_logins ), true ) ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2181 |
return new WP_Error( 'invalid_username', __( 'Sorry, that username is not allowed.' ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2182 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2183 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2184 |
/* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2185 |
* If a nicename is provided, remove unsafe user characters before using it. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2186 |
* Otherwise build a nicename from the user_login. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2187 |
*/ |
5 | 2188 |
if ( ! empty( $userdata['user_nicename'] ) ) { |
2189 |
$user_nicename = sanitize_user( $userdata['user_nicename'], true ); |
|
2190 |
} else { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2191 |
$user_nicename = mb_substr( $user_login, 0, 50 ); |
5 | 2192 |
} |
2193 |
||
2194 |
$user_nicename = sanitize_title( $user_nicename ); |
|
2195 |
||
2196 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2197 |
* Filters a user's nicename before the user is created or updated. |
5 | 2198 |
* |
2199 |
* @since 2.0.3 |
|
2200 |
* |
|
2201 |
* @param string $user_nicename The user's nicename. |
|
2202 |
*/ |
|
2203 |
$user_nicename = apply_filters( 'pre_user_nicename', $user_nicename ); |
|
2204 |
||
19 | 2205 |
if ( mb_strlen( $user_nicename ) > 50 ) { |
2206 |
return new WP_Error( 'user_nicename_too_long', __( 'Nicename may not be longer than 50 characters.' ) ); |
|
2207 |
} |
|
2208 |
||
16 | 2209 |
$user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $user_nicename, $user_login ) ); |
2210 |
||
2211 |
if ( $user_nicename_check ) { |
|
2212 |
$suffix = 2; |
|
2213 |
while ( $user_nicename_check ) { |
|
2214 |
// user_nicename allows 50 chars. Subtract one for a hyphen, plus the length of the suffix. |
|
2215 |
$base_length = 49 - mb_strlen( $suffix ); |
|
2216 |
$alt_user_nicename = mb_substr( $user_nicename, 0, $base_length ) . "-$suffix"; |
|
2217 |
$user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $alt_user_nicename, $user_login ) ); |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2218 |
++$suffix; |
16 | 2219 |
} |
2220 |
$user_nicename = $alt_user_nicename; |
|
2221 |
} |
|
0 | 2222 |
|
5 | 2223 |
$raw_user_email = empty( $userdata['user_email'] ) ? '' : $userdata['user_email']; |
0 | 2224 |
|
5 | 2225 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2226 |
* Filters a user's email before the user is created or updated. |
5 | 2227 |
* |
2228 |
* @since 2.0.3 |
|
2229 |
* |
|
2230 |
* @param string $raw_user_email The user's email. |
|
2231 |
*/ |
|
2232 |
$user_email = apply_filters( 'pre_user_email', $raw_user_email ); |
|
0 | 2233 |
|
5 | 2234 |
/* |
2235 |
* If there is no update, just check for `email_exists`. If there is an update, |
|
18 | 2236 |
* check if current email and new email are the same, and check `email_exists` |
5 | 2237 |
* accordingly. |
2238 |
*/ |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2239 |
if ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) ) |
5 | 2240 |
&& ! defined( 'WP_IMPORTING' ) |
2241 |
&& email_exists( $user_email ) |
|
2242 |
) { |
|
2243 |
return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) ); |
|
2244 |
} |
|
16 | 2245 |
|
2246 |
$raw_user_url = empty( $userdata['user_url'] ) ? '' : $userdata['user_url']; |
|
2247 |
||
2248 |
/** |
|
2249 |
* Filters a user's URL before the user is created or updated. |
|
2250 |
* |
|
2251 |
* @since 2.0.3 |
|
2252 |
* |
|
2253 |
* @param string $raw_user_url The user's URL. |
|
2254 |
*/ |
|
2255 |
$user_url = apply_filters( 'pre_user_url', $raw_user_url ); |
|
2256 |
||
19 | 2257 |
if ( mb_strlen( $user_url ) > 100 ) { |
2258 |
return new WP_Error( 'user_url_too_long', __( 'User URL may not be longer than 100 characters.' ) ); |
|
2259 |
} |
|
2260 |
||
16 | 2261 |
$user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered']; |
2262 |
||
2263 |
$user_activation_key = empty( $userdata['user_activation_key'] ) ? '' : $userdata['user_activation_key']; |
|
2264 |
||
2265 |
if ( ! empty( $userdata['spam'] ) && ! is_multisite() ) { |
|
2266 |
return new WP_Error( 'no_spam', __( 'Sorry, marking a user as spam is only supported on Multisite.' ) ); |
|
2267 |
} |
|
2268 |
||
2269 |
$spam = empty( $userdata['spam'] ) ? 0 : (bool) $userdata['spam']; |
|
2270 |
||
2271 |
// Store values to save in user meta. |
|
2272 |
$meta = array(); |
|
2273 |
||
5 | 2274 |
$nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname']; |
0 | 2275 |
|
5 | 2276 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2277 |
* Filters a user's nickname before the user is created or updated. |
5 | 2278 |
* |
2279 |
* @since 2.0.3 |
|
2280 |
* |
|
2281 |
* @param string $nickname The user's nickname. |
|
2282 |
*/ |
|
2283 |
$meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname ); |
|
0 | 2284 |
|
5 | 2285 |
$first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name']; |
2286 |
||
2287 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2288 |
* Filters a user's first name before the user is created or updated. |
5 | 2289 |
* |
2290 |
* @since 2.0.3 |
|
2291 |
* |
|
2292 |
* @param string $first_name The user's first name. |
|
2293 |
*/ |
|
2294 |
$meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name ); |
|
0 | 2295 |
|
5 | 2296 |
$last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name']; |
2297 |
||
2298 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2299 |
* Filters a user's last name before the user is created or updated. |
5 | 2300 |
* |
2301 |
* @since 2.0.3 |
|
2302 |
* |
|
2303 |
* @param string $last_name The user's last name. |
|
2304 |
*/ |
|
2305 |
$meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name ); |
|
2306 |
||
2307 |
if ( empty( $userdata['display_name'] ) ) { |
|
2308 |
if ( $update ) { |
|
0 | 2309 |
$display_name = $user_login; |
5 | 2310 |
} elseif ( $meta['first_name'] && $meta['last_name'] ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2311 |
$display_name = sprintf( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2312 |
/* translators: 1: User's first name, 2: Last name. */ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2313 |
_x( '%1$s %2$s', 'Display name based on first name and last name' ), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2314 |
$meta['first_name'], |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2315 |
$meta['last_name'] |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2316 |
); |
5 | 2317 |
} elseif ( $meta['first_name'] ) { |
2318 |
$display_name = $meta['first_name']; |
|
2319 |
} elseif ( $meta['last_name'] ) { |
|
2320 |
$display_name = $meta['last_name']; |
|
2321 |
} else { |
|
0 | 2322 |
$display_name = $user_login; |
5 | 2323 |
} |
2324 |
} else { |
|
2325 |
$display_name = $userdata['display_name']; |
|
0 | 2326 |
} |
5 | 2327 |
|
2328 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2329 |
* Filters a user's display name before the user is created or updated. |
5 | 2330 |
* |
2331 |
* @since 2.0.3 |
|
2332 |
* |
|
2333 |
* @param string $display_name The user's display name. |
|
2334 |
*/ |
|
0 | 2335 |
$display_name = apply_filters( 'pre_user_display_name', $display_name ); |
2336 |
||
5 | 2337 |
$description = empty( $userdata['description'] ) ? '' : $userdata['description']; |
0 | 2338 |
|
5 | 2339 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2340 |
* Filters a user's description before the user is created or updated. |
5 | 2341 |
* |
2342 |
* @since 2.0.3 |
|
2343 |
* |
|
2344 |
* @param string $description The user's description. |
|
2345 |
*/ |
|
2346 |
$meta['description'] = apply_filters( 'pre_user_description', $description ); |
|
0 | 2347 |
|
5 | 2348 |
$meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing']; |
2349 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2350 |
$meta['syntax_highlighting'] = empty( $userdata['syntax_highlighting'] ) ? 'true' : $userdata['syntax_highlighting']; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2351 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2352 |
$meta['comment_shortcuts'] = empty( $userdata['comment_shortcuts'] ) || 'false' === $userdata['comment_shortcuts'] ? 'false' : 'true'; |
0 | 2353 |
|
9 | 2354 |
$admin_color = empty( $userdata['admin_color'] ) ? 'fresh' : $userdata['admin_color']; |
5 | 2355 |
$meta['admin_color'] = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $admin_color ); |
0 | 2356 |
|
16 | 2357 |
$meta['use_ssl'] = empty( $userdata['use_ssl'] ) ? 0 : (bool) $userdata['use_ssl']; |
5 | 2358 |
|
2359 |
$meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front']; |
|
0 | 2360 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2361 |
$meta['locale'] = isset( $userdata['locale'] ) ? $userdata['locale'] : ''; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2362 |
|
16 | 2363 |
$compacted = compact( 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'user_activation_key', 'display_name' ); |
9 | 2364 |
$data = wp_unslash( $compacted ); |
0 | 2365 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2366 |
if ( ! $update ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2367 |
$data = $data + compact( 'user_login' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2368 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2369 |
|
16 | 2370 |
if ( is_multisite() ) { |
2371 |
$data = $data + compact( 'spam' ); |
|
2372 |
} |
|
2373 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2374 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2375 |
* Filters user data before the record is created or updated. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2376 |
* |
18 | 2377 |
* It only includes data in the users table, not any user metadata. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2378 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2379 |
* @since 4.9.0 |
19 | 2380 |
* @since 5.8.0 The `$userdata` parameter was added. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2381 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2382 |
* @param array $data { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2383 |
* Values and keys for the user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2384 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2385 |
* @type string $user_login The user's login. Only included if $update == false |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2386 |
* @type string $user_pass The user's password. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2387 |
* @type string $user_email The user's email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2388 |
* @type string $user_url The user's url. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2389 |
* @type string $user_nicename The user's nice name. Defaults to a URL-safe version of user's login |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2390 |
* @type string $display_name The user's display name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2391 |
* @type string $user_registered MySQL timestamp describing the moment when the user registered. Defaults to |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2392 |
* the current UTC timestamp. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2393 |
* } |
18 | 2394 |
* @param bool $update Whether the user is being updated rather than created. |
19 | 2395 |
* @param int|null $user_id ID of the user to be updated, or NULL if the user is being created. |
18 | 2396 |
* @param array $userdata The raw array of data passed to wp_insert_user(). |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2397 |
*/ |
19 | 2398 |
$data = apply_filters( 'wp_pre_insert_user_data', $data, $update, ( $update ? $user_id : null ), $userdata ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2399 |
|
16 | 2400 |
if ( empty( $data ) || ! is_array( $data ) ) { |
2401 |
return new WP_Error( 'empty_data', __( 'Not enough data to create this user.' ) ); |
|
2402 |
} |
|
2403 |
||
0 | 2404 |
if ( $update ) { |
16 | 2405 |
if ( $user_email !== $old_user_data->user_email || $user_pass !== $old_user_data->user_pass ) { |
5 | 2406 |
$data['user_activation_key'] = ''; |
2407 |
} |
|
19 | 2408 |
$wpdb->update( $wpdb->users, $data, array( 'ID' => $user_id ) ); |
0 | 2409 |
} else { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2410 |
$wpdb->insert( $wpdb->users, $data ); |
0 | 2411 |
$user_id = (int) $wpdb->insert_id; |
2412 |
} |
|
2413 |
||
2414 |
$user = new WP_User( $user_id ); |
|
2415 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2416 |
/** |
9 | 2417 |
* Filters a user's meta values and keys immediately after the user is created or updated |
2418 |
* and before any user meta is inserted or updated. |
|
2419 |
* |
|
2420 |
* Does not include contact methods. These are added using `wp_get_user_contact_methods( $user )`. |
|
2421 |
* |
|
19 | 2422 |
* For custom meta fields, see the {@see 'insert_custom_user_meta'} filter. |
2423 |
* |
|
9 | 2424 |
* @since 4.4.0 |
19 | 2425 |
* @since 5.8.0 The `$userdata` parameter was added. |
9 | 2426 |
* |
2427 |
* @param array $meta { |
|
2428 |
* Default meta values and keys for the user. |
|
2429 |
* |
|
2430 |
* @type string $nickname The user's nickname. Default is the user's username. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2431 |
* @type string $first_name The user's first name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2432 |
* @type string $last_name The user's last name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2433 |
* @type string $description The user's description. |
16 | 2434 |
* @type string $rich_editing Whether to enable the rich-editor for the user. Default 'true'. |
2435 |
* @type string $syntax_highlighting Whether to enable the rich code editor for the user. Default 'true'. |
|
2436 |
* @type string $comment_shortcuts Whether to enable keyboard shortcuts for the user. Default 'false'. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2437 |
* @type string $admin_color The color scheme for a user's admin screen. Default 'fresh'. |
16 | 2438 |
* @type int|bool $use_ssl Whether to force SSL on the user's admin area. 0|false if SSL |
2439 |
* is not forced. |
|
2440 |
* @type string $show_admin_bar_front Whether to show the admin bar on the front end for the user. |
|
2441 |
* Default 'true'. |
|
2442 |
* @type string $locale User's locale. Default empty. |
|
9 | 2443 |
* } |
18 | 2444 |
* @param WP_User $user User object. |
2445 |
* @param bool $update Whether the user is being updated rather than created. |
|
2446 |
* @param array $userdata The raw array of data passed to wp_insert_user(). |
|
9 | 2447 |
*/ |
18 | 2448 |
$meta = apply_filters( 'insert_user_meta', $meta, $user, $update, $userdata ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2449 |
|
19 | 2450 |
$custom_meta = array(); |
2451 |
if ( array_key_exists( 'meta_input', $userdata ) && is_array( $userdata['meta_input'] ) && ! empty( $userdata['meta_input'] ) ) { |
|
2452 |
$custom_meta = $userdata['meta_input']; |
|
2453 |
} |
|
2454 |
||
2455 |
/** |
|
2456 |
* Filters a user's custom meta values and keys immediately after the user is created or updated |
|
2457 |
* and before any user meta is inserted or updated. |
|
2458 |
* |
|
2459 |
* For non-custom meta fields, see the {@see 'insert_user_meta'} filter. |
|
2460 |
* |
|
2461 |
* @since 5.9.0 |
|
2462 |
* |
|
2463 |
* @param array $custom_meta Array of custom user meta values keyed by meta key. |
|
2464 |
* @param WP_User $user User object. |
|
2465 |
* @param bool $update Whether the user is being updated rather than created. |
|
2466 |
* @param array $userdata The raw array of data passed to wp_insert_user(). |
|
2467 |
*/ |
|
2468 |
$custom_meta = apply_filters( 'insert_custom_user_meta', $custom_meta, $user, $update, $userdata ); |
|
2469 |
||
2470 |
$meta = array_merge( $meta, $custom_meta ); |
|
2471 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2472 |
if ( $update ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2473 |
// Update user meta. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2474 |
foreach ( $meta as $key => $value ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2475 |
update_user_meta( $user_id, $key, $value ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2476 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2477 |
} else { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2478 |
// Add user meta. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2479 |
foreach ( $meta as $key => $value ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2480 |
add_user_meta( $user_id, $key, $value ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2481 |
} |
5 | 2482 |
} |
2483 |
||
2484 |
foreach ( wp_get_user_contact_methods( $user ) as $key => $value ) { |
|
2485 |
if ( isset( $userdata[ $key ] ) ) { |
|
2486 |
update_user_meta( $user_id, $key, $userdata[ $key ] ); |
|
2487 |
} |
|
0 | 2488 |
} |
2489 |
||
5 | 2490 |
if ( isset( $userdata['role'] ) ) { |
2491 |
$user->set_role( $userdata['role'] ); |
|
2492 |
} elseif ( ! $update ) { |
|
9 | 2493 |
$user->set_role( get_option( 'default_role' ) ); |
5 | 2494 |
} |
16 | 2495 |
|
2496 |
clean_user_cache( $user_id ); |
|
0 | 2497 |
|
5 | 2498 |
if ( $update ) { |
2499 |
/** |
|
2500 |
* Fires immediately after an existing user is updated. |
|
2501 |
* |
|
2502 |
* @since 2.0.0 |
|
19 | 2503 |
* @since 5.8.0 The `$userdata` parameter was added. |
5 | 2504 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2505 |
* @param int $user_id User ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2506 |
* @param WP_User $old_user_data Object containing user's data prior to update. |
18 | 2507 |
* @param array $userdata The raw array of data passed to wp_insert_user(). |
5 | 2508 |
*/ |
18 | 2509 |
do_action( 'profile_update', $user_id, $old_user_data, $userdata ); |
16 | 2510 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2511 |
if ( isset( $userdata['spam'] ) && $userdata['spam'] !== $old_user_data->spam ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2512 |
if ( '1' === $userdata['spam'] ) { |
16 | 2513 |
/** |
2514 |
* Fires after the user is marked as a SPAM user. |
|
2515 |
* |
|
2516 |
* @since 3.0.0 |
|
2517 |
* |
|
2518 |
* @param int $user_id ID of the user marked as SPAM. |
|
2519 |
*/ |
|
2520 |
do_action( 'make_spam_user', $user_id ); |
|
2521 |
} else { |
|
2522 |
/** |
|
2523 |
* Fires after the user is marked as a HAM user. Opposite of SPAM. |
|
2524 |
* |
|
2525 |
* @since 3.0.0 |
|
2526 |
* |
|
2527 |
* @param int $user_id ID of the user marked as HAM. |
|
2528 |
*/ |
|
2529 |
do_action( 'make_ham_user', $user_id ); |
|
2530 |
} |
|
2531 |
} |
|
5 | 2532 |
} else { |
2533 |
/** |
|
2534 |
* Fires immediately after a new user is registered. |
|
2535 |
* |
|
2536 |
* @since 1.5.0 |
|
19 | 2537 |
* @since 5.8.0 The `$userdata` parameter was added. |
5 | 2538 |
* |
18 | 2539 |
* @param int $user_id User ID. |
2540 |
* @param array $userdata The raw array of data passed to wp_insert_user(). |
|
5 | 2541 |
*/ |
18 | 2542 |
do_action( 'user_register', $user_id, $userdata ); |
5 | 2543 |
} |
0 | 2544 |
|
2545 |
return $user_id; |
|
2546 |
} |
|
2547 |
||
2548 |
/** |
|
19 | 2549 |
* Updates a user in the database. |
0 | 2550 |
* |
2551 |
* It is possible to update a user's password by specifying the 'user_pass' |
|
2552 |
* value in the $userdata parameter array. |
|
2553 |
* |
|
2554 |
* If current user's password is being updated, then the cookies will be |
|
2555 |
* cleared. |
|
2556 |
* |
|
2557 |
* @since 2.0.0 |
|
5 | 2558 |
* |
2559 |
* @see wp_insert_user() For what fields can be set in $userdata. |
|
0 | 2560 |
* |
9 | 2561 |
* @param array|object|WP_User $userdata An array of user data or a user object of type stdClass or WP_User. |
0 | 2562 |
* @return int|WP_Error The updated user's ID or a WP_Error object if the user could not be updated. |
2563 |
*/ |
|
9 | 2564 |
function wp_update_user( $userdata ) { |
5 | 2565 |
if ( $userdata instanceof stdClass ) { |
0 | 2566 |
$userdata = get_object_vars( $userdata ); |
5 | 2567 |
} elseif ( $userdata instanceof WP_User ) { |
0 | 2568 |
$userdata = $userdata->to_array(); |
5 | 2569 |
} |
0 | 2570 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2571 |
$userdata_raw = $userdata; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2572 |
|
19 | 2573 |
$user_id = isset( $userdata['ID'] ) ? (int) $userdata['ID'] : 0; |
2574 |
if ( ! $user_id ) { |
|
5 | 2575 |
return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); |
2576 |
} |
|
0 | 2577 |
|
16 | 2578 |
// First, get all of the original fields. |
19 | 2579 |
$user_obj = get_userdata( $user_id ); |
5 | 2580 |
if ( ! $user_obj ) { |
0 | 2581 |
return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); |
5 | 2582 |
} |
0 | 2583 |
|
2584 |
$user = $user_obj->to_array(); |
|
2585 |
||
16 | 2586 |
// Add additional custom fields. |
0 | 2587 |
foreach ( _get_additional_user_keys( $user_obj ) as $key ) { |
19 | 2588 |
$user[ $key ] = get_user_meta( $user_id, $key, true ); |
0 | 2589 |
} |
2590 |
||
2591 |
// Escape data pulled from DB. |
|
2592 |
$user = add_magic_quotes( $user ); |
|
2593 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2594 |
if ( ! empty( $userdata['user_pass'] ) && $userdata['user_pass'] !== $user_obj->user_pass ) { |
16 | 2595 |
// If password is changing, hash it now. |
9 | 2596 |
$plaintext_pass = $userdata['user_pass']; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2597 |
$userdata['user_pass'] = wp_hash_password( $userdata['user_pass'] ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2598 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2599 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2600 |
* Filters whether to send the password change email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2601 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2602 |
* @since 4.3.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2603 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2604 |
* @see wp_insert_user() For `$user` and `$userdata` fields. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2605 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2606 |
* @param bool $send Whether to send the email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2607 |
* @param array $user The original user array. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2608 |
* @param array $userdata The updated user array. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2609 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2610 |
$send_password_change_email = apply_filters( 'send_password_change_email', true, $user, $userdata ); |
0 | 2611 |
} |
2612 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2613 |
if ( isset( $userdata['user_email'] ) && $user['user_email'] !== $userdata['user_email'] ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2614 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2615 |
* Filters whether to send the email change email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2616 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2617 |
* @since 4.3.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2618 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2619 |
* @see wp_insert_user() For `$user` and `$userdata` fields. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2620 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2621 |
* @param bool $send Whether to send the email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2622 |
* @param array $user The original user array. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2623 |
* @param array $userdata The updated user array. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2624 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2625 |
$send_email_change_email = apply_filters( 'send_email_change_email', true, $user, $userdata ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2626 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2627 |
|
16 | 2628 |
clean_user_cache( $user_obj ); |
0 | 2629 |
|
2630 |
// Merge old and new fields with new fields overwriting old ones. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2631 |
$userdata = array_merge( $user, $userdata ); |
9 | 2632 |
$user_id = wp_insert_user( $userdata ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2633 |
|
19 | 2634 |
if ( is_wp_error( $user_id ) ) { |
2635 |
return $user_id; |
|
2636 |
} |
|
2637 |
||
2638 |
$blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); |
|
2639 |
||
2640 |
$switched_locale = false; |
|
2641 |
if ( ! empty( $send_password_change_email ) || ! empty( $send_email_change_email ) ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2642 |
$switched_locale = switch_to_user_locale( $user_id ); |
19 | 2643 |
} |
2644 |
||
2645 |
if ( ! empty( $send_password_change_email ) ) { |
|
2646 |
/* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */ |
|
2647 |
$pass_change_text = __( |
|
2648 |
'Hi ###USERNAME###, |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2649 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2650 |
This notice confirms that your password was changed on ###SITENAME###. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2651 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2652 |
If you did not change your password, please contact the Site Administrator at |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2653 |
###ADMIN_EMAIL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2654 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2655 |
This email has been sent to ###EMAIL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2656 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2657 |
Regards, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2658 |
All at ###SITENAME### |
9 | 2659 |
###SITEURL###' |
19 | 2660 |
); |
2661 |
||
2662 |
$pass_change_email = array( |
|
2663 |
'to' => $user['user_email'], |
|
2664 |
/* translators: Password change notification email subject. %s: Site title. */ |
|
2665 |
'subject' => __( '[%s] Password Changed' ), |
|
2666 |
'message' => $pass_change_text, |
|
2667 |
'headers' => '', |
|
2668 |
); |
|
2669 |
||
2670 |
/** |
|
2671 |
* Filters the contents of the email sent when the user's password is changed. |
|
2672 |
* |
|
2673 |
* @since 4.3.0 |
|
2674 |
* |
|
2675 |
* @param array $pass_change_email { |
|
2676 |
* Used to build wp_mail(). |
|
2677 |
* |
|
2678 |
* @type string $to The intended recipients. Add emails in a comma separated string. |
|
2679 |
* @type string $subject The subject of the email. |
|
2680 |
* @type string $message The content of the email. |
|
2681 |
* The following strings have a special meaning and will get replaced dynamically: |
|
2682 |
* - ###USERNAME### The current user's username. |
|
2683 |
* - ###ADMIN_EMAIL### The admin email in case this was unexpected. |
|
2684 |
* - ###EMAIL### The user's email address. |
|
2685 |
* - ###SITENAME### The name of the site. |
|
2686 |
* - ###SITEURL### The URL to the site. |
|
2687 |
* @type string $headers Headers. Add headers in a newline (\r\n) separated string. |
|
2688 |
* } |
|
2689 |
* @param array $user The original user array. |
|
2690 |
* @param array $userdata The updated user array. |
|
2691 |
*/ |
|
2692 |
$pass_change_email = apply_filters( 'password_change_email', $pass_change_email, $user, $userdata ); |
|
2693 |
||
2694 |
$pass_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $pass_change_email['message'] ); |
|
2695 |
$pass_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $pass_change_email['message'] ); |
|
2696 |
$pass_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $pass_change_email['message'] ); |
|
2697 |
$pass_change_email['message'] = str_replace( '###SITENAME###', $blog_name, $pass_change_email['message'] ); |
|
2698 |
$pass_change_email['message'] = str_replace( '###SITEURL###', home_url(), $pass_change_email['message'] ); |
|
2699 |
||
2700 |
wp_mail( $pass_change_email['to'], sprintf( $pass_change_email['subject'], $blog_name ), $pass_change_email['message'], $pass_change_email['headers'] ); |
|
2701 |
} |
|
2702 |
||
2703 |
if ( ! empty( $send_email_change_email ) ) { |
|
2704 |
/* translators: Do not translate USERNAME, ADMIN_EMAIL, NEW_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */ |
|
2705 |
$email_change_text = __( |
|
2706 |
'Hi ###USERNAME###, |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2707 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2708 |
This notice confirms that your email address on ###SITENAME### was changed to ###NEW_EMAIL###. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2709 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2710 |
If you did not change your email, please contact the Site Administrator at |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2711 |
###ADMIN_EMAIL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2712 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2713 |
This email has been sent to ###EMAIL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2714 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2715 |
Regards, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2716 |
All at ###SITENAME### |
9 | 2717 |
###SITEURL###' |
19 | 2718 |
); |
2719 |
||
2720 |
$email_change_email = array( |
|
2721 |
'to' => $user['user_email'], |
|
2722 |
/* translators: Email change notification email subject. %s: Site title. */ |
|
2723 |
'subject' => __( '[%s] Email Changed' ), |
|
2724 |
'message' => $email_change_text, |
|
2725 |
'headers' => '', |
|
2726 |
); |
|
2727 |
||
2728 |
/** |
|
2729 |
* Filters the contents of the email sent when the user's email is changed. |
|
2730 |
* |
|
2731 |
* @since 4.3.0 |
|
2732 |
* |
|
2733 |
* @param array $email_change_email { |
|
2734 |
* Used to build wp_mail(). |
|
2735 |
* |
|
2736 |
* @type string $to The intended recipients. |
|
2737 |
* @type string $subject The subject of the email. |
|
2738 |
* @type string $message The content of the email. |
|
2739 |
* The following strings have a special meaning and will get replaced dynamically: |
|
2740 |
* - ###USERNAME### The current user's username. |
|
2741 |
* - ###ADMIN_EMAIL### The admin email in case this was unexpected. |
|
2742 |
* - ###NEW_EMAIL### The new email address. |
|
2743 |
* - ###EMAIL### The old email address. |
|
2744 |
* - ###SITENAME### The name of the site. |
|
2745 |
* - ###SITEURL### The URL to the site. |
|
2746 |
* @type string $headers Headers. |
|
2747 |
* } |
|
2748 |
* @param array $user The original user array. |
|
2749 |
* @param array $userdata The updated user array. |
|
2750 |
*/ |
|
2751 |
$email_change_email = apply_filters( 'email_change_email', $email_change_email, $user, $userdata ); |
|
2752 |
||
2753 |
$email_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $email_change_email['message'] ); |
|
2754 |
$email_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $email_change_email['message'] ); |
|
2755 |
$email_change_email['message'] = str_replace( '###NEW_EMAIL###', $userdata['user_email'], $email_change_email['message'] ); |
|
2756 |
$email_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $email_change_email['message'] ); |
|
2757 |
$email_change_email['message'] = str_replace( '###SITENAME###', $blog_name, $email_change_email['message'] ); |
|
2758 |
$email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] ); |
|
2759 |
||
2760 |
wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $blog_name ), $email_change_email['message'], $email_change_email['headers'] ); |
|
2761 |
} |
|
2762 |
||
2763 |
if ( $switched_locale ) { |
|
2764 |
restore_previous_locale(); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2765 |
} |
0 | 2766 |
|
2767 |
// Update the cookies if the password changed. |
|
2768 |
$current_user = wp_get_current_user(); |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2769 |
if ( $current_user->ID === $user_id ) { |
9 | 2770 |
if ( isset( $plaintext_pass ) ) { |
0 | 2771 |
wp_clear_auth_cookie(); |
5 | 2772 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2773 |
/* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2774 |
* Here we calculate the expiration length of the current auth cookie and compare it to the default expiration. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2775 |
* If it's greater than this, then we know the user checked 'Remember Me' when they logged in. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2776 |
*/ |
9 | 2777 |
$logged_in_cookie = wp_parse_auth_cookie( '', 'logged_in' ); |
5 | 2778 |
/** This filter is documented in wp-includes/pluggable.php */ |
19 | 2779 |
$default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $user_id, false ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2780 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2781 |
$remember = false; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2782 |
|
16 | 2783 |
if ( false !== $logged_in_cookie && ( $logged_in_cookie['expiration'] - time() ) > $default_cookie_life ) { |
2784 |
$remember = true; |
|
2785 |
} |
|
5 | 2786 |
|
19 | 2787 |
wp_set_auth_cookie( $user_id, $remember ); |
0 | 2788 |
} |
2789 |
} |
|
2790 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2791 |
/** |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2792 |
* Fires after the user has been updated and emails have been sent. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2793 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2794 |
* @since 6.3.0 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2795 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2796 |
* @param int $user_id The ID of the user that was just updated. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2797 |
* @param array $userdata The array of user data that was updated. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2798 |
* @param array $userdata_raw The unedited array of user data that was updated. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2799 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2800 |
do_action( 'wp_update_user', $user_id, $userdata, $userdata_raw ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2801 |
|
0 | 2802 |
return $user_id; |
2803 |
} |
|
2804 |
||
2805 |
/** |
|
19 | 2806 |
* Provides a simpler way of inserting a user into the database. |
0 | 2807 |
* |
2808 |
* Creates a new user with just the username, password, and email. For more |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2809 |
* complex user creation use wp_insert_user() to specify more information. |
0 | 2810 |
* |
2811 |
* @since 2.0.0 |
|
16 | 2812 |
* |
2813 |
* @see wp_insert_user() More complete way to create a new user. |
|
0 | 2814 |
* |
2815 |
* @param string $username The user's username. |
|
2816 |
* @param string $password The user's password. |
|
5 | 2817 |
* @param string $email Optional. The user's email. Default empty. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2818 |
* @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2819 |
* be created. |
0 | 2820 |
*/ |
9 | 2821 |
function wp_create_user( $username, $password, $email = '' ) { |
0 | 2822 |
$user_login = wp_slash( $username ); |
9 | 2823 |
$user_email = wp_slash( $email ); |
2824 |
$user_pass = $password; |
|
2825 |
||
2826 |
$userdata = compact( 'user_login', 'user_email', 'user_pass' ); |
|
2827 |
return wp_insert_user( $userdata ); |
|
0 | 2828 |
} |
2829 |
||
2830 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2831 |
* Returns a list of meta keys to be (maybe) populated in wp_update_user(). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2832 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2833 |
* The list of keys returned via this function are dependent on the presence |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2834 |
* of those keys in the user meta data to be set. |
0 | 2835 |
* |
2836 |
* @since 3.3.0 |
|
2837 |
* @access private |
|
2838 |
* |
|
5 | 2839 |
* @param WP_User $user WP_User instance. |
16 | 2840 |
* @return string[] List of user keys to be populated in wp_update_user(). |
0 | 2841 |
*/ |
2842 |
function _get_additional_user_keys( $user ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2843 |
$keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' ); |
0 | 2844 |
return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) ); |
2845 |
} |
|
2846 |
||
2847 |
/** |
|
19 | 2848 |
* Sets up the user contact methods. |
0 | 2849 |
* |
2850 |
* Default contact methods were removed in 3.6. A filter dictates contact methods. |
|
2851 |
* |
|
2852 |
* @since 3.7.0 |
|
2853 |
* |
|
19 | 2854 |
* @param WP_User|null $user Optional. WP_User object. |
16 | 2855 |
* @return string[] Array of contact method labels keyed by contact method. |
0 | 2856 |
*/ |
2857 |
function wp_get_user_contact_methods( $user = null ) { |
|
2858 |
$methods = array(); |
|
2859 |
if ( get_site_option( 'initial_db_version' ) < 23588 ) { |
|
2860 |
$methods = array( |
|
2861 |
'aim' => __( 'AIM' ), |
|
2862 |
'yim' => __( 'Yahoo IM' ), |
|
9 | 2863 |
'jabber' => __( 'Jabber / Google Talk' ), |
0 | 2864 |
); |
2865 |
} |
|
2866 |
||
2867 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2868 |
* Filters the user contact methods. |
0 | 2869 |
* |
2870 |
* @since 2.9.0 |
|
2871 |
* |
|
19 | 2872 |
* @param string[] $methods Array of contact method labels keyed by contact method. |
2873 |
* @param WP_User|null $user WP_User object or null if none was provided. |
|
0 | 2874 |
*/ |
2875 |
return apply_filters( 'user_contactmethods', $methods, $user ); |
|
2876 |
} |
|
2877 |
||
2878 |
/** |
|
2879 |
* The old private function for setting up user contact methods. |
|
2880 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2881 |
* Use wp_get_user_contact_methods() instead. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2882 |
* |
0 | 2883 |
* @since 2.9.0 |
2884 |
* @access private |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2885 |
* |
19 | 2886 |
* @param WP_User|null $user Optional. WP_User object. Default null. |
16 | 2887 |
* @return string[] Array of contact method labels keyed by contact method. |
0 | 2888 |
*/ |
2889 |
function _wp_get_user_contactmethods( $user = null ) { |
|
2890 |
return wp_get_user_contact_methods( $user ); |
|
2891 |
} |
|
2892 |
||
2893 |
/** |
|
5 | 2894 |
* Gets the text suggesting how to create strong passwords. |
2895 |
* |
|
2896 |
* @since 4.1.0 |
|
2897 |
* |
|
2898 |
* @return string The password hint text. |
|
2899 |
*/ |
|
2900 |
function wp_get_password_hint() { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2901 |
$hint = __( 'Hint: The password should be at least twelve characters long. To make it stronger, use upper and lower case letters, numbers, and symbols like ! " ? $ % ^ & ).' ); |
5 | 2902 |
|
2903 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2904 |
* Filters the text describing the site's password complexity policy. |
5 | 2905 |
* |
2906 |
* @since 4.1.0 |
|
2907 |
* |
|
2908 |
* @param string $hint The password hint text. |
|
2909 |
*/ |
|
2910 |
return apply_filters( 'password_hint', $hint ); |
|
2911 |
} |
|
2912 |
||
2913 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2914 |
* Creates, stores, then returns a password reset key for user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2915 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2916 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2917 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2918 |
* @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2919 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2920 |
* @param WP_User $user User to retrieve password reset key for. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2921 |
* @return string|WP_Error Password reset key on success. WP_Error on error. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2922 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2923 |
function get_password_reset_key( $user ) { |
16 | 2924 |
global $wp_hasher; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2925 |
|
9 | 2926 |
if ( ! ( $user instanceof WP_User ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2927 |
return new WP_Error( 'invalidcombo', __( '<strong>Error:</strong> There is no account with that username or email address.' ) ); |
9 | 2928 |
} |
2929 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2930 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2931 |
* Fires before a new password is retrieved. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2932 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2933 |
* Use the {@see 'retrieve_password'} hook instead. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2934 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2935 |
* @since 1.5.0 |
16 | 2936 |
* @deprecated 1.5.1 Misspelled. Use {@see 'retrieve_password'} hook instead. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2937 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2938 |
* @param string $user_login The user login name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2939 |
*/ |
16 | 2940 |
do_action_deprecated( 'retreive_password', array( $user->user_login ), '1.5.1', 'retrieve_password' ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2941 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2942 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2943 |
* Fires before a new password is retrieved. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2944 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2945 |
* @since 1.5.1 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2946 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2947 |
* @param string $user_login The user login name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2948 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2949 |
do_action( 'retrieve_password', $user->user_login ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2950 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2951 |
$password_reset_allowed = wp_is_password_reset_allowed_for_user( $user ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2952 |
if ( ! $password_reset_allowed ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2953 |
return new WP_Error( 'no_password_reset', __( 'Password reset is not allowed for this user' ) ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2954 |
} elseif ( is_wp_error( $password_reset_allowed ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
2955 |
return $password_reset_allowed; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2956 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2957 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2958 |
// Generate something random for a password reset key. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2959 |
$key = wp_generate_password( 20, false ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2960 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2961 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2962 |
* Fires when a password reset key is generated. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2963 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2964 |
* @since 2.5.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2965 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2966 |
* @param string $user_login The username for the user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2967 |
* @param string $key The generated password reset key. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2968 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2969 |
do_action( 'retrieve_password_key', $user->user_login, $key ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2970 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2971 |
// Now insert the key, hashed, into the DB. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2972 |
if ( empty( $wp_hasher ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2973 |
require_once ABSPATH . WPINC . '/class-phpass.php'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2974 |
$wp_hasher = new PasswordHash( 8, true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2975 |
} |
16 | 2976 |
|
2977 |
$hashed = time() . ':' . $wp_hasher->HashPassword( $key ); |
|
2978 |
||
2979 |
$key_saved = wp_update_user( |
|
2980 |
array( |
|
2981 |
'ID' => $user->ID, |
|
2982 |
'user_activation_key' => $hashed, |
|
2983 |
) |
|
2984 |
); |
|
2985 |
||
2986 |
if ( is_wp_error( $key_saved ) ) { |
|
2987 |
return $key_saved; |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2988 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2989 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2990 |
return $key; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2991 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2992 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
2993 |
/** |
19 | 2994 |
* Retrieves a user row based on password reset key and login. |
0 | 2995 |
* |
2996 |
* A key is considered 'expired' if it exactly matches the value of the |
|
2997 |
* user_activation_key field, rather than being matched after going through the |
|
2998 |
* hashing process. This field is now hashed; old values are no longer accepted |
|
2999 |
* but have a different WP_Error code so good user feedback can be provided. |
|
3000 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3001 |
* @since 3.1.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3002 |
* |
5 | 3003 |
* @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. |
0 | 3004 |
* |
3005 |
* @param string $key Hash to validate sending user's password. |
|
3006 |
* @param string $login The user login. |
|
3007 |
* @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys. |
|
3008 |
*/ |
|
9 | 3009 |
function check_password_reset_key( $key, $login ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3010 |
global $wp_hasher; |
0 | 3011 |
|
9 | 3012 |
$key = preg_replace( '/[^a-z0-9]/i', '', $key ); |
3013 |
||
3014 |
if ( empty( $key ) || ! is_string( $key ) ) { |
|
3015 |
return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); |
|
3016 |
} |
|
3017 |
||
3018 |
if ( empty( $login ) || ! is_string( $login ) ) { |
|
3019 |
return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); |
|
3020 |
} |
|
0 | 3021 |
|
16 | 3022 |
$user = get_user_by( 'login', $login ); |
3023 |
||
3024 |
if ( ! $user ) { |
|
9 | 3025 |
return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); |
3026 |
} |
|
0 | 3027 |
|
3028 |
if ( empty( $wp_hasher ) ) { |
|
5 | 3029 |
require_once ABSPATH . WPINC . '/class-phpass.php'; |
0 | 3030 |
$wp_hasher = new PasswordHash( 8, true ); |
3031 |
} |
|
3032 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3033 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3034 |
* Filters the expiration time of password reset keys. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3035 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3036 |
* @since 4.3.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3037 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3038 |
* @param int $expiration The expiration time in seconds. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3039 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3040 |
$expiration_duration = apply_filters( 'password_reset_expiration', DAY_IN_SECONDS ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3041 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3042 |
if ( str_contains( $user->user_activation_key, ':' ) ) { |
16 | 3043 |
list( $pass_request_time, $pass_key ) = explode( ':', $user->user_activation_key, 2 ); |
9 | 3044 |
$expiration_time = $pass_request_time + $expiration_duration; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3045 |
} else { |
16 | 3046 |
$pass_key = $user->user_activation_key; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3047 |
$expiration_time = false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3048 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3049 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3050 |
if ( ! $pass_key ) { |
9 | 3051 |
return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3052 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3053 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3054 |
$hash_is_correct = $wp_hasher->CheckPassword( $key, $pass_key ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3055 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3056 |
if ( $hash_is_correct && $expiration_time && time() < $expiration_time ) { |
16 | 3057 |
return $user; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3058 |
} elseif ( $hash_is_correct && $expiration_time ) { |
16 | 3059 |
// Key has an expiration time that's passed. |
9 | 3060 |
return new WP_Error( 'expired_key', __( 'Invalid key.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3061 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3062 |
|
16 | 3063 |
if ( hash_equals( $user->user_activation_key, $key ) || ( $hash_is_correct && ! $expiration_time ) ) { |
9 | 3064 |
$return = new WP_Error( 'expired_key', __( 'Invalid key.' ) ); |
16 | 3065 |
$user_id = $user->ID; |
0 | 3066 |
|
3067 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3068 |
* Filters the return value of check_password_reset_key() when an |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3069 |
* old-style key is used. |
0 | 3070 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3071 |
* @since 3.7.0 Previously plain-text keys were stored in the database. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3072 |
* @since 4.3.0 Previously key hashes were stored without an expiration time. |
0 | 3073 |
* |
3074 |
* @param WP_Error $return A WP_Error object denoting an expired key. |
|
3075 |
* Return a WP_User object to validate the key. |
|
3076 |
* @param int $user_id The matched user ID. |
|
3077 |
*/ |
|
3078 |
return apply_filters( 'password_reset_key_expired', $return, $user_id ); |
|
3079 |
} |
|
3080 |
||
9 | 3081 |
return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); |
0 | 3082 |
} |
3083 |
||
3084 |
/** |
|
18 | 3085 |
* Handles sending a password retrieval email to a user. |
3086 |
* |
|
3087 |
* @since 2.5.0 |
|
3088 |
* @since 5.7.0 Added `$user_login` parameter. |
|
3089 |
* |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3090 |
* @global wpdb $wpdb WordPress database abstraction object. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3091 |
* @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. |
18 | 3092 |
* |
3093 |
* @param string $user_login Optional. Username to send a password retrieval email for. |
|
3094 |
* Defaults to `$_POST['user_login']` if not set. |
|
3095 |
* @return true|WP_Error True when finished, WP_Error object on error. |
|
3096 |
*/ |
|
3097 |
function retrieve_password( $user_login = null ) { |
|
3098 |
$errors = new WP_Error(); |
|
3099 |
$user_data = false; |
|
3100 |
||
3101 |
// Use the passed $user_login if available, otherwise use $_POST['user_login']. |
|
3102 |
if ( ! $user_login && ! empty( $_POST['user_login'] ) ) { |
|
3103 |
$user_login = $_POST['user_login']; |
|
3104 |
} |
|
3105 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3106 |
$user_login = trim( wp_unslash( $user_login ) ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3107 |
|
18 | 3108 |
if ( empty( $user_login ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3109 |
$errors->add( 'empty_username', __( '<strong>Error:</strong> Please enter a username or email address.' ) ); |
18 | 3110 |
} elseif ( strpos( $user_login, '@' ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3111 |
$user_data = get_user_by( 'email', $user_login ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3112 |
|
18 | 3113 |
if ( empty( $user_data ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3114 |
$user_data = get_user_by( 'login', $user_login ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3115 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3116 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3117 |
if ( empty( $user_data ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3118 |
$errors->add( 'invalid_email', __( '<strong>Error:</strong> There is no account with that username or email address.' ) ); |
18 | 3119 |
} |
3120 |
} else { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3121 |
$user_data = get_user_by( 'login', $user_login ); |
18 | 3122 |
} |
3123 |
||
3124 |
/** |
|
3125 |
* Filters the user data during a password reset request. |
|
3126 |
* |
|
3127 |
* Allows, for example, custom validation using data other than username or email address. |
|
3128 |
* |
|
3129 |
* @since 5.7.0 |
|
3130 |
* |
|
3131 |
* @param WP_User|false $user_data WP_User object if found, false if the user does not exist. |
|
3132 |
* @param WP_Error $errors A WP_Error object containing any errors generated |
|
3133 |
* by using invalid credentials. |
|
3134 |
*/ |
|
3135 |
$user_data = apply_filters( 'lostpassword_user_data', $user_data, $errors ); |
|
3136 |
||
3137 |
/** |
|
3138 |
* Fires before errors are returned from a password reset request. |
|
3139 |
* |
|
3140 |
* @since 2.1.0 |
|
3141 |
* @since 4.4.0 Added the `$errors` parameter. |
|
3142 |
* @since 5.4.0 Added the `$user_data` parameter. |
|
3143 |
* |
|
3144 |
* @param WP_Error $errors A WP_Error object containing any errors generated |
|
3145 |
* by using invalid credentials. |
|
3146 |
* @param WP_User|false $user_data WP_User object if found, false if the user does not exist. |
|
3147 |
*/ |
|
3148 |
do_action( 'lostpassword_post', $errors, $user_data ); |
|
3149 |
||
3150 |
/** |
|
3151 |
* Filters the errors encountered on a password reset request. |
|
3152 |
* |
|
3153 |
* The filtered WP_Error object may, for example, contain errors for an invalid |
|
3154 |
* username or email address. A WP_Error object should always be returned, |
|
3155 |
* but may or may not contain errors. |
|
3156 |
* |
|
3157 |
* If any errors are present in $errors, this will abort the password reset request. |
|
3158 |
* |
|
3159 |
* @since 5.5.0 |
|
3160 |
* |
|
3161 |
* @param WP_Error $errors A WP_Error object containing any errors generated |
|
3162 |
* by using invalid credentials. |
|
3163 |
* @param WP_User|false $user_data WP_User object if found, false if the user does not exist. |
|
3164 |
*/ |
|
3165 |
$errors = apply_filters( 'lostpassword_errors', $errors, $user_data ); |
|
3166 |
||
3167 |
if ( $errors->has_errors() ) { |
|
3168 |
return $errors; |
|
3169 |
} |
|
3170 |
||
3171 |
if ( ! $user_data ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3172 |
$errors->add( 'invalidcombo', __( '<strong>Error:</strong> There is no account with that username or email address.' ) ); |
18 | 3173 |
return $errors; |
3174 |
} |
|
3175 |
||
19 | 3176 |
/** |
3177 |
* Filters whether to send the retrieve password email. |
|
3178 |
* |
|
3179 |
* Return false to disable sending the email. |
|
3180 |
* |
|
3181 |
* @since 6.0.0 |
|
3182 |
* |
|
3183 |
* @param bool $send Whether to send the email. |
|
3184 |
* @param string $user_login The username for the user. |
|
3185 |
* @param WP_User $user_data WP_User object. |
|
3186 |
*/ |
|
3187 |
if ( ! apply_filters( 'send_retrieve_password_email', true, $user_login, $user_data ) ) { |
|
3188 |
return true; |
|
3189 |
} |
|
3190 |
||
18 | 3191 |
// Redefining user_login ensures we return the right case in the email. |
3192 |
$user_login = $user_data->user_login; |
|
3193 |
$user_email = $user_data->user_email; |
|
3194 |
$key = get_password_reset_key( $user_data ); |
|
3195 |
||
3196 |
if ( is_wp_error( $key ) ) { |
|
3197 |
return $key; |
|
3198 |
} |
|
3199 |
||
3200 |
// Localize password reset message content for user. |
|
3201 |
$locale = get_user_locale( $user_data ); |
|
3202 |
||
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3203 |
$switched_locale = switch_to_user_locale( $user_data->ID ); |
18 | 3204 |
|
3205 |
if ( is_multisite() ) { |
|
3206 |
$site_name = get_network()->site_name; |
|
3207 |
} else { |
|
3208 |
/* |
|
3209 |
* The blogname option is escaped with esc_html on the way into the database |
|
3210 |
* in sanitize_option. We want to reverse this for the plain text arena of emails. |
|
3211 |
*/ |
|
3212 |
$site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); |
|
3213 |
} |
|
3214 |
||
3215 |
$message = __( 'Someone has requested a password reset for the following account:' ) . "\r\n\r\n"; |
|
3216 |
/* translators: %s: Site name. */ |
|
3217 |
$message .= sprintf( __( 'Site Name: %s' ), $site_name ) . "\r\n\r\n"; |
|
3218 |
/* translators: %s: User login. */ |
|
3219 |
$message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n"; |
|
3220 |
$message .= __( 'If this was a mistake, ignore this email and nothing will happen.' ) . "\r\n\r\n"; |
|
3221 |
$message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n"; |
|
3222 |
$message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . '&wp_lang=' . $locale . "\r\n\r\n"; |
|
3223 |
||
3224 |
if ( ! is_user_logged_in() ) { |
|
3225 |
$requester_ip = $_SERVER['REMOTE_ADDR']; |
|
3226 |
if ( $requester_ip ) { |
|
3227 |
$message .= sprintf( |
|
3228 |
/* translators: %s: IP address of password reset requester. */ |
|
3229 |
__( 'This password reset request originated from the IP address %s.' ), |
|
3230 |
$requester_ip |
|
3231 |
) . "\r\n"; |
|
3232 |
} |
|
3233 |
} |
|
3234 |
||
3235 |
/* translators: Password reset notification email subject. %s: Site title. */ |
|
3236 |
$title = sprintf( __( '[%s] Password Reset' ), $site_name ); |
|
3237 |
||
3238 |
/** |
|
3239 |
* Filters the subject of the password reset email. |
|
3240 |
* |
|
3241 |
* @since 2.8.0 |
|
3242 |
* @since 4.4.0 Added the `$user_login` and `$user_data` parameters. |
|
3243 |
* |
|
3244 |
* @param string $title Email subject. |
|
3245 |
* @param string $user_login The username for the user. |
|
3246 |
* @param WP_User $user_data WP_User object. |
|
3247 |
*/ |
|
3248 |
$title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data ); |
|
3249 |
||
3250 |
/** |
|
3251 |
* Filters the message body of the password reset mail. |
|
3252 |
* |
|
3253 |
* If the filtered message is empty, the password reset email will not be sent. |
|
3254 |
* |
|
3255 |
* @since 2.8.0 |
|
3256 |
* @since 4.1.0 Added `$user_login` and `$user_data` parameters. |
|
3257 |
* |
|
3258 |
* @param string $message Email message. |
|
3259 |
* @param string $key The activation key. |
|
3260 |
* @param string $user_login The username for the user. |
|
3261 |
* @param WP_User $user_data WP_User object. |
|
3262 |
*/ |
|
3263 |
$message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data ); |
|
3264 |
||
19 | 3265 |
// Short-circuit on falsey $message value for backwards compatibility. |
3266 |
if ( ! $message ) { |
|
3267 |
return true; |
|
3268 |
} |
|
3269 |
||
3270 |
/* |
|
3271 |
* Wrap the single notification email arguments in an array |
|
3272 |
* to pass them to the retrieve_password_notification_email filter. |
|
3273 |
*/ |
|
3274 |
$defaults = array( |
|
3275 |
'to' => $user_email, |
|
3276 |
'subject' => $title, |
|
3277 |
'message' => $message, |
|
3278 |
'headers' => '', |
|
3279 |
); |
|
3280 |
||
3281 |
/** |
|
3282 |
* Filters the contents of the reset password notification email sent to the user. |
|
3283 |
* |
|
3284 |
* @since 6.0.0 |
|
3285 |
* |
|
3286 |
* @param array $defaults { |
|
3287 |
* The default notification email arguments. Used to build wp_mail(). |
|
3288 |
* |
|
3289 |
* @type string $to The intended recipient - user email address. |
|
3290 |
* @type string $subject The subject of the email. |
|
3291 |
* @type string $message The body of the email. |
|
3292 |
* @type string $headers The headers of the email. |
|
3293 |
* } |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3294 |
* @param string $key The activation key. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3295 |
* @param string $user_login The username for the user. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3296 |
* @param WP_User $user_data WP_User object. |
19 | 3297 |
*/ |
3298 |
$notification_email = apply_filters( 'retrieve_password_notification_email', $defaults, $key, $user_login, $user_data ); |
|
3299 |
||
18 | 3300 |
if ( $switched_locale ) { |
3301 |
restore_previous_locale(); |
|
3302 |
} |
|
3303 |
||
19 | 3304 |
if ( is_array( $notification_email ) ) { |
3305 |
// Force key order and merge defaults in case any value is missing in the filtered array. |
|
3306 |
$notification_email = array_merge( $defaults, $notification_email ); |
|
3307 |
} else { |
|
3308 |
$notification_email = $defaults; |
|
3309 |
} |
|
3310 |
||
3311 |
list( $to, $subject, $message, $headers ) = array_values( $notification_email ); |
|
3312 |
||
3313 |
$subject = wp_specialchars_decode( $subject ); |
|
3314 |
||
3315 |
if ( ! wp_mail( $to, $subject, $message, $headers ) ) { |
|
18 | 3316 |
$errors->add( |
3317 |
'retrieve_password_email_failure', |
|
3318 |
sprintf( |
|
3319 |
/* translators: %s: Documentation URL. */ |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3320 |
__( '<strong>Error:</strong> The email could not be sent. Your site may not be correctly configured to send emails. <a href="%s">Get support for resetting your password</a>.' ), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3321 |
esc_url( __( 'https://wordpress.org/documentation/article/reset-your-password/' ) ) |
18 | 3322 |
) |
3323 |
); |
|
3324 |
return $errors; |
|
3325 |
} |
|
3326 |
||
3327 |
return true; |
|
3328 |
} |
|
3329 |
||
3330 |
/** |
|
0 | 3331 |
* Handles resetting the user's password. |
3332 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3333 |
* @since 2.5.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3334 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3335 |
* @param WP_User $user The user |
16 | 3336 |
* @param string $new_pass New password for the user in plaintext |
0 | 3337 |
*/ |
3338 |
function reset_password( $user, $new_pass ) { |
|
5 | 3339 |
/** |
3340 |
* Fires before the user's password is reset. |
|
3341 |
* |
|
3342 |
* @since 1.5.0 |
|
3343 |
* |
|
16 | 3344 |
* @param WP_User $user The user. |
3345 |
* @param string $new_pass New user password. |
|
5 | 3346 |
*/ |
0 | 3347 |
do_action( 'password_reset', $user, $new_pass ); |
3348 |
||
3349 |
wp_set_password( $new_pass, $user->ID ); |
|
18 | 3350 |
update_user_meta( $user->ID, 'default_password_nag', false ); |
0 | 3351 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3352 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3353 |
* Fires after the user's password is reset. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3354 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3355 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3356 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3357 |
* @param WP_User $user The user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3358 |
* @param string $new_pass New user password. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3359 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3360 |
do_action( 'after_password_reset', $user, $new_pass ); |
0 | 3361 |
} |
3362 |
||
3363 |
/** |
|
3364 |
* Handles registering a new user. |
|
3365 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3366 |
* @since 2.5.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3367 |
* |
0 | 3368 |
* @param string $user_login User's username for logging in |
3369 |
* @param string $user_email User's email address to send password and add |
|
3370 |
* @return int|WP_Error Either user's ID or error on failure. |
|
3371 |
*/ |
|
3372 |
function register_new_user( $user_login, $user_email ) { |
|
3373 |
$errors = new WP_Error(); |
|
3374 |
||
3375 |
$sanitized_user_login = sanitize_user( $user_login ); |
|
5 | 3376 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3377 |
* Filters the email address of a user being registered. |
5 | 3378 |
* |
3379 |
* @since 2.1.0 |
|
3380 |
* |
|
3381 |
* @param string $user_email The email address of the new user. |
|
3382 |
*/ |
|
0 | 3383 |
$user_email = apply_filters( 'user_registration_email', $user_email ); |
3384 |
||
16 | 3385 |
// Check the username. |
3386 |
if ( '' === $sanitized_user_login ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3387 |
$errors->add( 'empty_username', __( '<strong>Error:</strong> Please enter a username.' ) ); |
0 | 3388 |
} elseif ( ! validate_username( $user_login ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3389 |
$errors->add( 'invalid_username', __( '<strong>Error:</strong> This username is invalid because it uses illegal characters. Please enter a valid username.' ) ); |
0 | 3390 |
$sanitized_user_login = ''; |
3391 |
} elseif ( username_exists( $sanitized_user_login ) ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3392 |
$errors->add( 'username_exists', __( '<strong>Error:</strong> This username is already registered. Please choose another one.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3393 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3394 |
/** This filter is documented in wp-includes/user.php */ |
16 | 3395 |
$illegal_user_logins = (array) apply_filters( 'illegal_user_logins', array() ); |
3396 |
if ( in_array( strtolower( $sanitized_user_login ), array_map( 'strtolower', $illegal_user_logins ), true ) ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3397 |
$errors->add( 'invalid_username', __( '<strong>Error:</strong> Sorry, that username is not allowed.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3398 |
} |
0 | 3399 |
} |
3400 |
||
16 | 3401 |
// Check the email address. |
3402 |
if ( '' === $user_email ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3403 |
$errors->add( 'empty_email', __( '<strong>Error:</strong> Please type your email address.' ) ); |
0 | 3404 |
} elseif ( ! is_email( $user_email ) ) { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3405 |
$errors->add( 'invalid_email', __( '<strong>Error:</strong> The email address is not correct.' ) ); |
0 | 3406 |
$user_email = ''; |
3407 |
} elseif ( email_exists( $user_email ) ) { |
|
19 | 3408 |
$errors->add( |
3409 |
'email_exists', |
|
3410 |
sprintf( |
|
3411 |
/* translators: %s: Link to the login page. */ |
|
3412 |
__( '<strong>Error:</strong> This email address is already registered. <a href="%s">Log in</a> with this address or choose another one.' ), |
|
3413 |
wp_login_url() |
|
3414 |
) |
|
3415 |
); |
|
0 | 3416 |
} |
3417 |
||
5 | 3418 |
/** |
3419 |
* Fires when submitting registration form data, before the user is created. |
|
3420 |
* |
|
3421 |
* @since 2.1.0 |
|
3422 |
* |
|
3423 |
* @param string $sanitized_user_login The submitted username after being sanitized. |
|
3424 |
* @param string $user_email The submitted email. |
|
3425 |
* @param WP_Error $errors Contains any errors with submitted username and email, |
|
3426 |
* e.g., an empty field, an invalid username or email, |
|
3427 |
* or an existing username or email. |
|
3428 |
*/ |
|
0 | 3429 |
do_action( 'register_post', $sanitized_user_login, $user_email, $errors ); |
3430 |
||
5 | 3431 |
/** |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3432 |
* Filters the errors encountered when a new user is being registered. |
5 | 3433 |
* |
3434 |
* The filtered WP_Error object may, for example, contain errors for an invalid |
|
16 | 3435 |
* or existing username or email address. A WP_Error object should always be returned, |
5 | 3436 |
* but may or may not contain errors. |
3437 |
* |
|
3438 |
* If any errors are present in $errors, this will abort the user's registration. |
|
3439 |
* |
|
3440 |
* @since 2.1.0 |
|
3441 |
* |
|
3442 |
* @param WP_Error $errors A WP_Error object containing any errors encountered |
|
3443 |
* during registration. |
|
3444 |
* @param string $sanitized_user_login User's username after it has been sanitized. |
|
3445 |
* @param string $user_email User's email. |
|
3446 |
*/ |
|
0 | 3447 |
$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email ); |
3448 |
||
9 | 3449 |
if ( $errors->has_errors() ) { |
0 | 3450 |
return $errors; |
9 | 3451 |
} |
0 | 3452 |
|
3453 |
$user_pass = wp_generate_password( 12, false ); |
|
9 | 3454 |
$user_id = wp_create_user( $sanitized_user_login, $user_pass, $user_email ); |
0 | 3455 |
if ( ! $user_id || is_wp_error( $user_id ) ) { |
16 | 3456 |
$errors->add( |
3457 |
'registerfail', |
|
3458 |
sprintf( |
|
3459 |
/* translators: %s: Admin email address. */ |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3460 |
__( '<strong>Error:</strong> Could not register you… please contact the <a href="mailto:%s">site admin</a>!' ), |
16 | 3461 |
get_option( 'admin_email' ) |
3462 |
) |
|
3463 |
); |
|
0 | 3464 |
return $errors; |
3465 |
} |
|
3466 |
||
18 | 3467 |
update_user_meta( $user_id, 'default_password_nag', true ); // Set up the password change nag. |
0 | 3468 |
|
19 | 3469 |
if ( ! empty( $_COOKIE['wp_lang'] ) ) { |
3470 |
$wp_lang = sanitize_text_field( $_COOKIE['wp_lang'] ); |
|
3471 |
if ( in_array( $wp_lang, get_available_languages(), true ) ) { |
|
3472 |
update_user_meta( $user_id, 'locale', $wp_lang ); // Set user locale if defined on registration. |
|
3473 |
} |
|
3474 |
} |
|
3475 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3476 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3477 |
* Fires after a new user registration has been recorded. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3478 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3479 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3480 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3481 |
* @param int $user_id ID of the newly registered user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3482 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3483 |
do_action( 'register_new_user', $user_id ); |
0 | 3484 |
|
3485 |
return $user_id; |
|
3486 |
} |
|
5 | 3487 |
|
3488 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3489 |
* Initiates email notifications related to the creation of new users. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3490 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3491 |
* Notifications are sent both to the site admin and to the newly created user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3492 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3493 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3494 |
* @since 4.6.0 Converted the `$notify` parameter to accept 'user' for sending |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3495 |
* notifications only to the user created. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3496 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3497 |
* @param int $user_id ID of the newly created user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3498 |
* @param string $notify Optional. Type of notification that should happen. Accepts 'admin' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3499 |
* or an empty string (admin only), 'user', or 'both' (admin and user). |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3500 |
* Default 'both'. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3501 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3502 |
function wp_send_new_user_notifications( $user_id, $notify = 'both' ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3503 |
wp_new_user_notification( $user_id, null, $notify ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3504 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3505 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3506 |
/** |
19 | 3507 |
* Retrieves the current session token from the logged_in cookie. |
5 | 3508 |
* |
3509 |
* @since 4.0.0 |
|
3510 |
* |
|
3511 |
* @return string Token. |
|
3512 |
*/ |
|
3513 |
function wp_get_session_token() { |
|
3514 |
$cookie = wp_parse_auth_cookie( '', 'logged_in' ); |
|
3515 |
return ! empty( $cookie['token'] ) ? $cookie['token'] : ''; |
|
3516 |
} |
|
3517 |
||
3518 |
/** |
|
19 | 3519 |
* Retrieves a list of sessions for the current user. |
5 | 3520 |
* |
3521 |
* @since 4.0.0 |
|
16 | 3522 |
* |
5 | 3523 |
* @return array Array of sessions. |
3524 |
*/ |
|
3525 |
function wp_get_all_sessions() { |
|
3526 |
$manager = WP_Session_Tokens::get_instance( get_current_user_id() ); |
|
3527 |
return $manager->get_all(); |
|
3528 |
} |
|
3529 |
||
3530 |
/** |
|
19 | 3531 |
* Removes the current session token from the database. |
5 | 3532 |
* |
3533 |
* @since 4.0.0 |
|
3534 |
*/ |
|
3535 |
function wp_destroy_current_session() { |
|
3536 |
$token = wp_get_session_token(); |
|
3537 |
if ( $token ) { |
|
3538 |
$manager = WP_Session_Tokens::get_instance( get_current_user_id() ); |
|
3539 |
$manager->destroy( $token ); |
|
3540 |
} |
|
3541 |
} |
|
3542 |
||
3543 |
/** |
|
19 | 3544 |
* Removes all but the current session token for the current user for the database. |
5 | 3545 |
* |
3546 |
* @since 4.0.0 |
|
3547 |
*/ |
|
3548 |
function wp_destroy_other_sessions() { |
|
3549 |
$token = wp_get_session_token(); |
|
3550 |
if ( $token ) { |
|
3551 |
$manager = WP_Session_Tokens::get_instance( get_current_user_id() ); |
|
3552 |
$manager->destroy_others( $token ); |
|
3553 |
} |
|
3554 |
} |
|
3555 |
||
3556 |
/** |
|
19 | 3557 |
* Removes all session tokens for the current user from the database. |
5 | 3558 |
* |
3559 |
* @since 4.0.0 |
|
3560 |
*/ |
|
3561 |
function wp_destroy_all_sessions() { |
|
3562 |
$manager = WP_Session_Tokens::get_instance( get_current_user_id() ); |
|
3563 |
$manager->destroy_all(); |
|
3564 |
} |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3565 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3566 |
/** |
19 | 3567 |
* Gets the user IDs of all users with no role on this site. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3568 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3569 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3570 |
* @since 4.9.0 The `$site_id` parameter was added to support multisite. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3571 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3572 |
* @global wpdb $wpdb WordPress database abstraction object. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3573 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3574 |
* @param int|null $site_id Optional. The site ID to get users with no role for. Defaults to the current site. |
16 | 3575 |
* @return string[] Array of user IDs as strings. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3576 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3577 |
function wp_get_users_with_no_role( $site_id = null ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3578 |
global $wpdb; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3579 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3580 |
if ( ! $site_id ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3581 |
$site_id = get_current_blog_id(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3582 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3583 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3584 |
$prefix = $wpdb->get_blog_prefix( $site_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3585 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3586 |
if ( is_multisite() && get_current_blog_id() !== $site_id ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3587 |
switch_to_blog( $site_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3588 |
$role_names = wp_roles()->get_names(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3589 |
restore_current_blog(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3590 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3591 |
$role_names = wp_roles()->get_names(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3592 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3593 |
|
9 | 3594 |
$regex = implode( '|', array_keys( $role_names ) ); |
3595 |
$regex = preg_replace( '/[^a-zA-Z_\|-]/', '', $regex ); |
|
3596 |
$users = $wpdb->get_col( |
|
3597 |
$wpdb->prepare( |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3598 |
"SELECT user_id |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3599 |
FROM $wpdb->usermeta |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3600 |
WHERE meta_key = '{$prefix}capabilities' |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3601 |
AND meta_value NOT REGEXP %s", |
9 | 3602 |
$regex |
3603 |
) |
|
3604 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3605 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3606 |
return $users; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3607 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3608 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3609 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3610 |
* Retrieves the current user object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3611 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3612 |
* Will set the current user, if the current user is not set. The current user |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3613 |
* will be set to the logged-in person. If no user is logged-in, then it will |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3614 |
* set the current user to 0, which is invalid and won't have any permissions. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3615 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3616 |
* This function is used by the pluggable functions wp_get_current_user() and |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3617 |
* get_currentuserinfo(), the latter of which is deprecated but used for backward |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3618 |
* compatibility. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3619 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3620 |
* @since 4.5.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3621 |
* @access private |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3622 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3623 |
* @see wp_get_current_user() |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3624 |
* @global WP_User $current_user Checks if the current user is set. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3625 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3626 |
* @return WP_User Current WP_User instance. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3627 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3628 |
function _wp_get_current_user() { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3629 |
global $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3630 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3631 |
if ( ! empty( $current_user ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3632 |
if ( $current_user instanceof WP_User ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3633 |
return $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3634 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3635 |
|
16 | 3636 |
// Upgrade stdClass to WP_User. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3637 |
if ( is_object( $current_user ) && isset( $current_user->ID ) ) { |
9 | 3638 |
$cur_id = $current_user->ID; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3639 |
$current_user = null; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3640 |
wp_set_current_user( $cur_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3641 |
return $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3642 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3643 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3644 |
// $current_user has a junk value. Force to WP_User with ID 0. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3645 |
$current_user = null; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3646 |
wp_set_current_user( 0 ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3647 |
return $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3648 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3649 |
|
9 | 3650 |
if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3651 |
wp_set_current_user( 0 ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3652 |
return $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3653 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3654 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3655 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3656 |
* Filters the current user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3657 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3658 |
* The default filters use this to determine the current user from the |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3659 |
* request's cookies, if available. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3660 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3661 |
* Returning a value of false will effectively short-circuit setting |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3662 |
* the current user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3663 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3664 |
* @since 3.9.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3665 |
* |
18 | 3666 |
* @param int|false $user_id User ID if one has been determined, false otherwise. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3667 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3668 |
$user_id = apply_filters( 'determine_current_user', false ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3669 |
if ( ! $user_id ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3670 |
wp_set_current_user( 0 ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3671 |
return $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3672 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3673 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3674 |
wp_set_current_user( $user_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3675 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3676 |
return $current_user; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3677 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3678 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3679 |
/** |
19 | 3680 |
* Sends a confirmation request email when a change of user email address is attempted. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3681 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3682 |
* @since 3.0.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3683 |
* @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3684 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3685 |
* @global WP_Error $errors WP_Error object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3686 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3687 |
function send_confirmation_on_profile_email() { |
9 | 3688 |
global $errors; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3689 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3690 |
$current_user = wp_get_current_user(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3691 |
if ( ! is_object( $errors ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3692 |
$errors = new WP_Error(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3693 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3694 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3695 |
if ( $current_user->ID !== (int) $_POST['user_id'] ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3696 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3697 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3698 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3699 |
if ( $current_user->user_email !== $_POST['email'] ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3700 |
if ( ! is_email( $_POST['email'] ) ) { |
9 | 3701 |
$errors->add( |
3702 |
'user_email', |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3703 |
__( '<strong>Error:</strong> The email address is not correct.' ), |
9 | 3704 |
array( |
3705 |
'form-field' => 'email', |
|
3706 |
) |
|
3707 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3708 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3709 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3710 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3711 |
|
9 | 3712 |
if ( email_exists( $_POST['email'] ) ) { |
3713 |
$errors->add( |
|
3714 |
'user_email', |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3715 |
__( '<strong>Error:</strong> The email address is already used.' ), |
9 | 3716 |
array( |
3717 |
'form-field' => 'email', |
|
3718 |
) |
|
3719 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3720 |
delete_user_meta( $current_user->ID, '_new_email' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3721 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3722 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3723 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3724 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3725 |
$hash = md5( $_POST['email'] . time() . wp_rand() ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3726 |
$new_user_email = array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3727 |
'hash' => $hash, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3728 |
'newemail' => $_POST['email'], |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3729 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3730 |
update_user_meta( $current_user->ID, '_new_email', $new_user_email ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3731 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3732 |
$sitename = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3733 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3734 |
/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ |
9 | 3735 |
$email_text = __( |
3736 |
'Howdy ###USERNAME###, |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3737 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3738 |
You recently requested to have the email address on your account changed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3739 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3740 |
If this is correct, please click on the following link to change it: |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3741 |
###ADMIN_URL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3742 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3743 |
You can safely ignore and delete this email if you do not want to |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3744 |
take this action. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3745 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3746 |
This email has been sent to ###EMAIL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3747 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3748 |
Regards, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3749 |
All at ###SITENAME### |
9 | 3750 |
###SITEURL###' |
3751 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3752 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3753 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3754 |
* Filters the text of the email sent when a change of user email address is attempted. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3755 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3756 |
* The following strings have a special meaning and will get replaced dynamically: |
16 | 3757 |
* - ###USERNAME### The current user's username. |
3758 |
* - ###ADMIN_URL### The link to click on to confirm the email change. |
|
3759 |
* - ###EMAIL### The new email. |
|
3760 |
* - ###SITENAME### The name of the site. |
|
3761 |
* - ###SITEURL### The URL to the site. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3762 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3763 |
* @since MU (3.0.0) |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3764 |
* @since 4.9.0 This filter is no longer Multisite specific. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3765 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3766 |
* @param string $email_text Text in the email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3767 |
* @param array $new_user_email { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3768 |
* Data relating to the new user email address. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3769 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3770 |
* @type string $hash The secure hash used in the confirmation link URL. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3771 |
* @type string $newemail The proposed new email address. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3772 |
* } |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3773 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3774 |
$content = apply_filters( 'new_user_email_content', $email_text, $new_user_email ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3775 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3776 |
$content = str_replace( '###USERNAME###', $current_user->user_login, $content ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3777 |
$content = str_replace( '###ADMIN_URL###', esc_url( self_admin_url( 'profile.php?newuseremail=' . $hash ) ), $content ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3778 |
$content = str_replace( '###EMAIL###', $_POST['email'], $content ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3779 |
$content = str_replace( '###SITENAME###', $sitename, $content ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3780 |
$content = str_replace( '###SITEURL###', home_url(), $content ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3781 |
|
16 | 3782 |
/* translators: New email address notification email subject. %s: Site title. */ |
9 | 3783 |
wp_mail( $_POST['email'], sprintf( __( '[%s] Email Change Request' ), $sitename ), $content ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3784 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3785 |
$_POST['email'] = $current_user->user_email; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3786 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3787 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3788 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3789 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3790 |
* Adds an admin notice alerting the user to check for confirmation request email |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3791 |
* after email address change. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3792 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3793 |
* @since 3.0.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3794 |
* @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3795 |
* |
19 | 3796 |
* @global string $pagenow The filename of the current screen. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3797 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3798 |
function new_user_email_admin_notice() { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3799 |
global $pagenow; |
9 | 3800 |
|
3801 |
if ( 'profile.php' === $pagenow && isset( $_GET['updated'] ) ) { |
|
3802 |
$email = get_user_meta( get_current_user_id(), '_new_email', true ); |
|
3803 |
if ( $email ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3804 |
$message = sprintf( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3805 |
/* translators: %s: New email address. */ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3806 |
__( 'Your email address has not been updated yet. Please check your inbox at %s for a confirmation email.' ), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3807 |
'<code>' . esc_html( $email['newemail'] ) . '</code>' |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3808 |
); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3809 |
wp_admin_notice( $message, array( 'type' => 'info' ) ); |
9 | 3810 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3811 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3812 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3813 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3814 |
/** |
19 | 3815 |
* Gets all personal data request types. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3816 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3817 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3818 |
* @access private |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3819 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3820 |
* @return string[] List of core privacy action types. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3821 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3822 |
function _wp_privacy_action_request_types() { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3823 |
return array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3824 |
'export_personal_data', |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3825 |
'remove_personal_data', |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3826 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3827 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3828 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3829 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3830 |
* Registers the personal data exporter for users. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3831 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3832 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3833 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3834 |
* @param array[] $exporters An array of personal data exporters. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3835 |
* @return array[] An array of personal data exporters. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3836 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3837 |
function wp_register_user_personal_data_exporter( $exporters ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3838 |
$exporters['wordpress-user'] = array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3839 |
'exporter_friendly_name' => __( 'WordPress User' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3840 |
'callback' => 'wp_user_personal_data_exporter', |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3841 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3842 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3843 |
return $exporters; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3844 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3845 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3846 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3847 |
* Finds and exports personal data associated with an email address from the user and user_meta table. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3848 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3849 |
* @since 4.9.6 |
16 | 3850 |
* @since 5.4.0 Added 'Community Events Location' group to the export data. |
3851 |
* @since 5.4.0 Added 'Session Tokens' group to the export data. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3852 |
* |
16 | 3853 |
* @param string $email_address The user's email address. |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3854 |
* @return array { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3855 |
* An array of personal data. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3856 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3857 |
* @type array[] $data An array of personal data arrays. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3858 |
* @type bool $done Whether the exporter is finished. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3859 |
* } |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3860 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3861 |
function wp_user_personal_data_exporter( $email_address ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3862 |
$email_address = trim( $email_address ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3863 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3864 |
$data_to_export = array(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3865 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3866 |
$user = get_user_by( 'email', $email_address ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3867 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3868 |
if ( ! $user ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3869 |
return array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3870 |
'data' => array(), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3871 |
'done' => true, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3872 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3873 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3874 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3875 |
$user_meta = get_user_meta( $user->ID ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3876 |
|
16 | 3877 |
$user_props_to_export = array( |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3878 |
'ID' => __( 'User ID' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3879 |
'user_login' => __( 'User Login Name' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3880 |
'user_nicename' => __( 'User Nice Name' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3881 |
'user_email' => __( 'User Email' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3882 |
'user_url' => __( 'User URL' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3883 |
'user_registered' => __( 'User Registration Date' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3884 |
'display_name' => __( 'User Display Name' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3885 |
'nickname' => __( 'User Nickname' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3886 |
'first_name' => __( 'User First Name' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3887 |
'last_name' => __( 'User Last Name' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3888 |
'description' => __( 'User Description' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3889 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3890 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3891 |
$user_data_to_export = array(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3892 |
|
16 | 3893 |
foreach ( $user_props_to_export as $key => $name ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3894 |
$value = ''; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3895 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3896 |
switch ( $key ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3897 |
case 'ID': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3898 |
case 'user_login': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3899 |
case 'user_nicename': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3900 |
case 'user_email': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3901 |
case 'user_url': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3902 |
case 'user_registered': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3903 |
case 'display_name': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3904 |
$value = $user->data->$key; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3905 |
break; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3906 |
case 'nickname': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3907 |
case 'first_name': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3908 |
case 'last_name': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3909 |
case 'description': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3910 |
$value = $user_meta[ $key ][0]; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3911 |
break; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3912 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3913 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3914 |
if ( ! empty( $value ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3915 |
$user_data_to_export[] = array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3916 |
'name' => $name, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3917 |
'value' => $value, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3918 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3919 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3920 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3921 |
|
16 | 3922 |
// Get the list of reserved names. |
3923 |
$reserved_names = array_values( $user_props_to_export ); |
|
3924 |
||
3925 |
/** |
|
19 | 3926 |
* Filters the user's profile data for the privacy exporter. |
16 | 3927 |
* |
3928 |
* @since 5.4.0 |
|
3929 |
* |
|
3930 |
* @param array $additional_user_profile_data { |
|
3931 |
* An array of name-value pairs of additional user data items. Default empty array. |
|
3932 |
* |
|
3933 |
* @type string $name The user-facing name of an item name-value pair,e.g. 'IP Address'. |
|
3934 |
* @type string $value The user-facing value of an item data pair, e.g. '50.60.70.0'. |
|
3935 |
* } |
|
3936 |
* @param WP_User $user The user whose data is being exported. |
|
3937 |
* @param string[] $reserved_names An array of reserved names. Any item in `$additional_user_data` |
|
3938 |
* that uses one of these for its `name` will not be included in the export. |
|
3939 |
*/ |
|
3940 |
$_extra_data = apply_filters( 'wp_privacy_additional_user_profile_data', array(), $user, $reserved_names ); |
|
3941 |
||
3942 |
if ( is_array( $_extra_data ) && ! empty( $_extra_data ) ) { |
|
3943 |
// Remove items that use reserved names. |
|
3944 |
$extra_data = array_filter( |
|
3945 |
$_extra_data, |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
3946 |
static function ( $item ) use ( $reserved_names ) { |
16 | 3947 |
return ! in_array( $item['name'], $reserved_names, true ); |
3948 |
} |
|
3949 |
); |
|
3950 |
||
3951 |
if ( count( $extra_data ) !== count( $_extra_data ) ) { |
|
3952 |
_doing_it_wrong( |
|
3953 |
__FUNCTION__, |
|
3954 |
sprintf( |
|
3955 |
/* translators: %s: wp_privacy_additional_user_profile_data */ |
|
3956 |
__( 'Filter %s returned items with reserved names.' ), |
|
3957 |
'<code>wp_privacy_additional_user_profile_data</code>' |
|
3958 |
), |
|
3959 |
'5.4.0' |
|
3960 |
); |
|
3961 |
} |
|
3962 |
||
3963 |
if ( ! empty( $extra_data ) ) { |
|
3964 |
$user_data_to_export = array_merge( $user_data_to_export, $extra_data ); |
|
3965 |
} |
|
3966 |
} |
|
3967 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3968 |
$data_to_export[] = array( |
16 | 3969 |
'group_id' => 'user', |
3970 |
'group_label' => __( 'User' ), |
|
3971 |
'group_description' => __( 'User’s profile data.' ), |
|
3972 |
'item_id' => "user-{$user->ID}", |
|
3973 |
'data' => $user_data_to_export, |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3974 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
3975 |
|
16 | 3976 |
if ( isset( $user_meta['community-events-location'] ) ) { |
3977 |
$location = maybe_unserialize( $user_meta['community-events-location'][0] ); |
|
3978 |
||
3979 |
$location_props_to_export = array( |
|
3980 |
'description' => __( 'City' ), |
|
3981 |
'country' => __( 'Country' ), |
|
3982 |
'latitude' => __( 'Latitude' ), |
|
3983 |
'longitude' => __( 'Longitude' ), |
|
3984 |
'ip' => __( 'IP' ), |
|
3985 |
); |
|
3986 |
||
3987 |
$location_data_to_export = array(); |
|
3988 |
||
3989 |
foreach ( $location_props_to_export as $key => $name ) { |
|
3990 |
if ( ! empty( $location[ $key ] ) ) { |
|
3991 |
$location_data_to_export[] = array( |
|
3992 |
'name' => $name, |
|
3993 |
'value' => $location[ $key ], |
|
3994 |
); |
|
3995 |
} |
|
3996 |
} |
|
3997 |
||
3998 |
$data_to_export[] = array( |
|
3999 |
'group_id' => 'community-events-location', |
|
4000 |
'group_label' => __( 'Community Events Location' ), |
|
4001 |
'group_description' => __( 'User’s location data used for the Community Events in the WordPress Events and News dashboard widget.' ), |
|
4002 |
'item_id' => "community-events-location-{$user->ID}", |
|
4003 |
'data' => $location_data_to_export, |
|
4004 |
); |
|
4005 |
} |
|
4006 |
||
4007 |
if ( isset( $user_meta['session_tokens'] ) ) { |
|
4008 |
$session_tokens = maybe_unserialize( $user_meta['session_tokens'][0] ); |
|
4009 |
||
4010 |
$session_tokens_props_to_export = array( |
|
4011 |
'expiration' => __( 'Expiration' ), |
|
4012 |
'ip' => __( 'IP' ), |
|
4013 |
'ua' => __( 'User Agent' ), |
|
4014 |
'login' => __( 'Last Login' ), |
|
4015 |
); |
|
4016 |
||
4017 |
foreach ( $session_tokens as $token_key => $session_token ) { |
|
4018 |
$session_tokens_data_to_export = array(); |
|
4019 |
||
4020 |
foreach ( $session_tokens_props_to_export as $key => $name ) { |
|
4021 |
if ( ! empty( $session_token[ $key ] ) ) { |
|
4022 |
$value = $session_token[ $key ]; |
|
4023 |
if ( in_array( $key, array( 'expiration', 'login' ), true ) ) { |
|
4024 |
$value = date_i18n( 'F d, Y H:i A', $value ); |
|
4025 |
} |
|
4026 |
$session_tokens_data_to_export[] = array( |
|
4027 |
'name' => $name, |
|
4028 |
'value' => $value, |
|
4029 |
); |
|
4030 |
} |
|
4031 |
} |
|
4032 |
||
4033 |
$data_to_export[] = array( |
|
4034 |
'group_id' => 'session-tokens', |
|
4035 |
'group_label' => __( 'Session Tokens' ), |
|
4036 |
'group_description' => __( 'User’s Session Tokens data.' ), |
|
4037 |
'item_id' => "session-tokens-{$user->ID}-{$token_key}", |
|
4038 |
'data' => $session_tokens_data_to_export, |
|
4039 |
); |
|
4040 |
} |
|
4041 |
} |
|
4042 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4043 |
return array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4044 |
'data' => $data_to_export, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4045 |
'done' => true, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4046 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4047 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4048 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4049 |
/** |
19 | 4050 |
* Updates log when privacy request is confirmed. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4051 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4052 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4053 |
* @access private |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4054 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4055 |
* @param int $request_id ID of the request. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4056 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4057 |
function _wp_privacy_account_request_confirmed( $request_id ) { |
16 | 4058 |
$request = wp_get_user_request( $request_id ); |
9 | 4059 |
|
4060 |
if ( ! $request ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4061 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4062 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4063 |
|
9 | 4064 |
if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4065 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4066 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4067 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4068 |
update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() ); |
9 | 4069 |
wp_update_post( |
4070 |
array( |
|
4071 |
'ID' => $request_id, |
|
4072 |
'post_status' => 'request-confirmed', |
|
4073 |
) |
|
4074 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4075 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4076 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4077 |
/** |
19 | 4078 |
* Notifies the site administrator via email when a request is confirmed. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4079 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4080 |
* Without this, the admin would have to manually check the site to see if any |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4081 |
* action was needed on their part yet. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4082 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4083 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4084 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4085 |
* @param int $request_id The ID of the request. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4086 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4087 |
function _wp_privacy_send_request_confirmation_notification( $request_id ) { |
16 | 4088 |
$request = wp_get_user_request( $request_id ); |
9 | 4089 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4090 |
if ( ! ( $request instanceof WP_User_Request ) || 'request-confirmed' !== $request->status ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4091 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4092 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4093 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4094 |
$already_notified = (bool) get_post_meta( $request_id, '_wp_admin_notified', true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4095 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4096 |
if ( $already_notified ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4097 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4098 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4099 |
|
16 | 4100 |
if ( 'export_personal_data' === $request->action_name ) { |
4101 |
$manage_url = admin_url( 'export-personal-data.php' ); |
|
4102 |
} elseif ( 'remove_personal_data' === $request->action_name ) { |
|
4103 |
$manage_url = admin_url( 'erase-personal-data.php' ); |
|
4104 |
} |
|
9 | 4105 |
$action_description = wp_user_request_action_description( $request->action_name ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4106 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4107 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4108 |
* Filters the recipient of the data request confirmation notification. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4109 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4110 |
* In a Multisite environment, this will default to the email address of the |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4111 |
* network admin because, by default, single site admins do not have the |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4112 |
* capabilities required to process requests. Some networks may wish to |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4113 |
* delegate those capabilities to a single-site admin, or a dedicated person |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4114 |
* responsible for managing privacy requests. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4115 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4116 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4117 |
* |
9 | 4118 |
* @param string $admin_email The email address of the notification recipient. |
4119 |
* @param WP_User_Request $request The request that is initiating the notification. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4120 |
*/ |
9 | 4121 |
$admin_email = apply_filters( 'user_request_confirmed_email_to', get_site_option( 'admin_email' ), $request ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4122 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4123 |
$email_data = array( |
9 | 4124 |
'request' => $request, |
4125 |
'user_email' => $request->email, |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4126 |
'description' => $action_description, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4127 |
'manage_url' => $manage_url, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4128 |
'sitename' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4129 |
'siteurl' => home_url(), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4130 |
'admin_email' => $admin_email, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4131 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4132 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4133 |
$subject = sprintf( |
9 | 4134 |
/* translators: Privacy data request confirmed notification email subject. 1: Site title, 2: Name of the confirmed action. */ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4135 |
__( '[%1$s] Action Confirmed: %2$s' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4136 |
$email_data['sitename'], |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4137 |
$action_description |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4138 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4139 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4140 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4141 |
* Filters the subject of the user request confirmation email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4142 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4143 |
* @since 4.9.8 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4144 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4145 |
* @param string $subject The email subject. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4146 |
* @param string $sitename The name of the site. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4147 |
* @param array $email_data { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4148 |
* Data relating to the account action email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4149 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4150 |
* @type WP_User_Request $request User request object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4151 |
* @type string $user_email The email address confirming a request |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4152 |
* @type string $description Description of the action being performed so the user knows what the email is for. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4153 |
* @type string $manage_url The link to click manage privacy requests of this type. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4154 |
* @type string $sitename The site name sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4155 |
* @type string $siteurl The site URL sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4156 |
* @type string $admin_email The administrator email receiving the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4157 |
* } |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4158 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4159 |
$subject = apply_filters( 'user_request_confirmed_email_subject', $subject, $email_data['sitename'], $email_data ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4160 |
|
18 | 4161 |
/* translators: Do not translate SITENAME, USER_EMAIL, DESCRIPTION, MANAGE_URL, SITEURL; those are placeholders. */ |
4162 |
$content = __( |
|
4163 |
'Howdy, |
|
4164 |
||
4165 |
A user data privacy request has been confirmed on ###SITENAME###: |
|
4166 |
||
4167 |
User: ###USER_EMAIL### |
|
4168 |
Request: ###DESCRIPTION### |
|
4169 |
||
4170 |
You can view and manage these data privacy requests here: |
|
4171 |
||
4172 |
###MANAGE_URL### |
|
4173 |
||
4174 |
Regards, |
|
4175 |
All at ###SITENAME### |
|
4176 |
###SITEURL###' |
|
4177 |
); |
|
4178 |
||
4179 |
/** |
|
4180 |
* Filters the body of the user request confirmation email. |
|
4181 |
* |
|
4182 |
* The email is sent to an administrator when a user request is confirmed. |
|
4183 |
* |
|
4184 |
* The following strings have a special meaning and will get replaced dynamically: |
|
4185 |
* |
|
4186 |
* ###SITENAME### The name of the site. |
|
4187 |
* ###USER_EMAIL### The user email for the request. |
|
4188 |
* ###DESCRIPTION### Description of the action being performed so the user knows what the email is for. |
|
4189 |
* ###MANAGE_URL### The URL to manage requests. |
|
4190 |
* ###SITEURL### The URL to the site. |
|
4191 |
* |
|
4192 |
* @since 4.9.6 |
|
4193 |
* @deprecated 5.8.0 Use {@see 'user_request_confirmed_email_content'} instead. |
|
4194 |
* For user erasure fulfillment email content |
|
4195 |
* use {@see 'user_erasure_fulfillment_email_content'} instead. |
|
4196 |
* |
|
4197 |
* @param string $content The email content. |
|
4198 |
* @param array $email_data { |
|
4199 |
* Data relating to the account action email. |
|
4200 |
* |
|
4201 |
* @type WP_User_Request $request User request object. |
|
4202 |
* @type string $user_email The email address confirming a request |
|
4203 |
* @type string $description Description of the action being performed |
|
4204 |
* so the user knows what the email is for. |
|
4205 |
* @type string $manage_url The link to click manage privacy requests of this type. |
|
4206 |
* @type string $sitename The site name sending the mail. |
|
4207 |
* @type string $siteurl The site URL sending the mail. |
|
4208 |
* @type string $admin_email The administrator email receiving the mail. |
|
4209 |
* } |
|
4210 |
*/ |
|
4211 |
$content = apply_filters_deprecated( |
|
4212 |
'user_confirmed_action_email_content', |
|
4213 |
array( $content, $email_data ), |
|
4214 |
'5.8.0', |
|
4215 |
sprintf( |
|
4216 |
/* translators: 1 & 2: Deprecation replacement options. */ |
|
4217 |
__( '%1$s or %2$s' ), |
|
4218 |
'user_request_confirmed_email_content', |
|
4219 |
'user_erasure_fulfillment_email_content' |
|
4220 |
) |
|
4221 |
); |
|
4222 |
||
4223 |
/** |
|
4224 |
* Filters the body of the user request confirmation email. |
|
4225 |
* |
|
4226 |
* The email is sent to an administrator when a user request is confirmed. |
|
4227 |
* The following strings have a special meaning and will get replaced dynamically: |
|
4228 |
* |
|
4229 |
* ###SITENAME### The name of the site. |
|
4230 |
* ###USER_EMAIL### The user email for the request. |
|
4231 |
* ###DESCRIPTION### Description of the action being performed so the user knows what the email is for. |
|
4232 |
* ###MANAGE_URL### The URL to manage requests. |
|
4233 |
* ###SITEURL### The URL to the site. |
|
4234 |
* |
|
4235 |
* @since 5.8.0 |
|
4236 |
* |
|
4237 |
* @param string $content The email content. |
|
4238 |
* @param array $email_data { |
|
4239 |
* Data relating to the account action email. |
|
4240 |
* |
|
4241 |
* @type WP_User_Request $request User request object. |
|
4242 |
* @type string $user_email The email address confirming a request |
|
4243 |
* @type string $description Description of the action being performed so the user knows what the email is for. |
|
4244 |
* @type string $manage_url The link to click manage privacy requests of this type. |
|
4245 |
* @type string $sitename The site name sending the mail. |
|
4246 |
* @type string $siteurl The site URL sending the mail. |
|
4247 |
* @type string $admin_email The administrator email receiving the mail. |
|
4248 |
* } |
|
4249 |
*/ |
|
4250 |
$content = apply_filters( 'user_request_confirmed_email_content', $content, $email_data ); |
|
4251 |
||
4252 |
$content = str_replace( '###SITENAME###', $email_data['sitename'], $content ); |
|
4253 |
$content = str_replace( '###USER_EMAIL###', $email_data['user_email'], $content ); |
|
4254 |
$content = str_replace( '###DESCRIPTION###', $email_data['description'], $content ); |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4255 |
$content = str_replace( '###MANAGE_URL###', sanitize_url( $email_data['manage_url'] ), $content ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4256 |
$content = str_replace( '###SITEURL###', sanitize_url( $email_data['siteurl'] ), $content ); |
18 | 4257 |
|
16 | 4258 |
$headers = ''; |
4259 |
||
4260 |
/** |
|
4261 |
* Filters the headers of the user request confirmation email. |
|
4262 |
* |
|
4263 |
* @since 5.4.0 |
|
4264 |
* |
|
4265 |
* @param string|array $headers The email headers. |
|
4266 |
* @param string $subject The email subject. |
|
4267 |
* @param string $content The email content. |
|
4268 |
* @param int $request_id The request ID. |
|
4269 |
* @param array $email_data { |
|
4270 |
* Data relating to the account action email. |
|
4271 |
* |
|
4272 |
* @type WP_User_Request $request User request object. |
|
4273 |
* @type string $user_email The email address confirming a request |
|
4274 |
* @type string $description Description of the action being performed so the user knows what the email is for. |
|
4275 |
* @type string $manage_url The link to click manage privacy requests of this type. |
|
4276 |
* @type string $sitename The site name sending the mail. |
|
4277 |
* @type string $siteurl The site URL sending the mail. |
|
4278 |
* @type string $admin_email The administrator email receiving the mail. |
|
4279 |
* } |
|
4280 |
*/ |
|
4281 |
$headers = apply_filters( 'user_request_confirmed_email_headers', $headers, $subject, $content, $request_id, $email_data ); |
|
4282 |
||
4283 |
$email_sent = wp_mail( $email_data['admin_email'], $subject, $content, $headers ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4284 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4285 |
if ( $email_sent ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4286 |
update_post_meta( $request_id, '_wp_admin_notified', true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4287 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4288 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4289 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4290 |
/** |
19 | 4291 |
* Notifies the user when their erasure request is fulfilled. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4292 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4293 |
* Without this, the user would never know if their data was actually erased. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4294 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4295 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4296 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4297 |
* @param int $request_id The privacy request post ID associated with this request. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4298 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4299 |
function _wp_privacy_send_erasure_fulfillment_notification( $request_id ) { |
16 | 4300 |
$request = wp_get_user_request( $request_id ); |
9 | 4301 |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4302 |
if ( ! ( $request instanceof WP_User_Request ) || 'request-completed' !== $request->status ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4303 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4304 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4305 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4306 |
$already_notified = (bool) get_post_meta( $request_id, '_wp_user_notified', true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4307 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4308 |
if ( $already_notified ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4309 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4310 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4311 |
|
9 | 4312 |
// Localize message content for user; fallback to site default for visitors. |
4313 |
if ( ! empty( $request->user_id ) ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4314 |
$switched_locale = switch_to_user_locale( $request->user_id ); |
9 | 4315 |
} else { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4316 |
$switched_locale = switch_to_locale( get_locale() ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4317 |
} |
9 | 4318 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4319 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4320 |
* Filters the recipient of the data erasure fulfillment notification. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4321 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4322 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4323 |
* |
9 | 4324 |
* @param string $user_email The email address of the notification recipient. |
4325 |
* @param WP_User_Request $request The request that is initiating the notification. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4326 |
*/ |
9 | 4327 |
$user_email = apply_filters( 'user_erasure_fulfillment_email_to', $request->email, $request ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4328 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4329 |
$email_data = array( |
9 | 4330 |
'request' => $request, |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4331 |
'message_recipient' => $user_email, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4332 |
'privacy_policy_url' => get_privacy_policy_url(), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4333 |
'sitename' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4334 |
'siteurl' => home_url(), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4335 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4336 |
|
9 | 4337 |
$subject = sprintf( |
16 | 4338 |
/* translators: Erasure request fulfilled notification email subject. %s: Site title. */ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4339 |
__( '[%s] Erasure Request Fulfilled' ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4340 |
$email_data['sitename'] |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4341 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4342 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4343 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4344 |
* Filters the subject of the email sent when an erasure request is completed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4345 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4346 |
* @since 4.9.8 |
18 | 4347 |
* @deprecated 5.8.0 Use {@see 'user_erasure_fulfillment_email_subject'} instead. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4348 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4349 |
* @param string $subject The email subject. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4350 |
* @param string $sitename The name of the site. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4351 |
* @param array $email_data { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4352 |
* Data relating to the account action email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4353 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4354 |
* @type WP_User_Request $request User request object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4355 |
* @type string $message_recipient The address that the email will be sent to. Defaults |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4356 |
* to the value of `$request->email`, but can be changed |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4357 |
* by the `user_erasure_fulfillment_email_to` filter. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4358 |
* @type string $privacy_policy_url Privacy policy URL. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4359 |
* @type string $sitename The site name sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4360 |
* @type string $siteurl The site URL sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4361 |
* } |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4362 |
*/ |
18 | 4363 |
$subject = apply_filters_deprecated( |
4364 |
'user_erasure_complete_email_subject', |
|
4365 |
array( $subject, $email_data['sitename'], $email_data ), |
|
4366 |
'5.8.0', |
|
4367 |
'user_erasure_fulfillment_email_subject' |
|
4368 |
); |
|
4369 |
||
4370 |
/** |
|
4371 |
* Filters the subject of the email sent when an erasure request is completed. |
|
4372 |
* |
|
4373 |
* @since 5.8.0 |
|
4374 |
* |
|
4375 |
* @param string $subject The email subject. |
|
4376 |
* @param string $sitename The name of the site. |
|
4377 |
* @param array $email_data { |
|
4378 |
* Data relating to the account action email. |
|
4379 |
* |
|
4380 |
* @type WP_User_Request $request User request object. |
|
4381 |
* @type string $message_recipient The address that the email will be sent to. Defaults |
|
4382 |
* to the value of `$request->email`, but can be changed |
|
4383 |
* by the `user_erasure_fulfillment_email_to` filter. |
|
4384 |
* @type string $privacy_policy_url Privacy policy URL. |
|
4385 |
* @type string $sitename The site name sending the mail. |
|
4386 |
* @type string $siteurl The site URL sending the mail. |
|
4387 |
* } |
|
4388 |
*/ |
|
4389 |
$subject = apply_filters( 'user_erasure_fulfillment_email_subject', $subject, $email_data['sitename'], $email_data ); |
|
4390 |
||
4391 |
/* translators: Do not translate SITENAME, SITEURL; those are placeholders. */ |
|
4392 |
$content = __( |
|
4393 |
'Howdy, |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4394 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4395 |
Your request to erase your personal data on ###SITENAME### has been completed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4396 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4397 |
If you have any follow-up questions or concerns, please contact the site administrator. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4398 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4399 |
Regards, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4400 |
All at ###SITENAME### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4401 |
###SITEURL###' |
18 | 4402 |
); |
4403 |
||
4404 |
if ( ! empty( $email_data['privacy_policy_url'] ) ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4405 |
/* translators: Do not translate SITENAME, SITEURL, PRIVACY_POLICY_URL; those are placeholders. */ |
18 | 4406 |
$content = __( |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4407 |
'Howdy, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4408 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4409 |
Your request to erase your personal data on ###SITENAME### has been completed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4410 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4411 |
If you have any follow-up questions or concerns, please contact the site administrator. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4412 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4413 |
For more information, you can also read our privacy policy: ###PRIVACY_POLICY_URL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4414 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4415 |
Regards, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4416 |
All at ###SITENAME### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4417 |
###SITEURL###' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4418 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4419 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4420 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4421 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4422 |
* Filters the body of the data erasure fulfillment notification. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4423 |
* |
18 | 4424 |
* The email is sent to a user when their data erasure request is fulfilled |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4425 |
* by an administrator. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4426 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4427 |
* The following strings have a special meaning and will get replaced dynamically: |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4428 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4429 |
* ###SITENAME### The name of the site. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4430 |
* ###PRIVACY_POLICY_URL### Privacy policy page URL. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4431 |
* ###SITEURL### The URL to the site. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4432 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4433 |
* @since 4.9.6 |
18 | 4434 |
* @deprecated 5.8.0 Use {@see 'user_erasure_fulfillment_email_content'} instead. |
4435 |
* For user request confirmation email content |
|
4436 |
* use {@see 'user_request_confirmed_email_content'} instead. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4437 |
* |
18 | 4438 |
* @param string $content The email content. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4439 |
* @param array $email_data { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4440 |
* Data relating to the account action email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4441 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4442 |
* @type WP_User_Request $request User request object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4443 |
* @type string $message_recipient The address that the email will be sent to. Defaults |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4444 |
* to the value of `$request->email`, but can be changed |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4445 |
* by the `user_erasure_fulfillment_email_to` filter. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4446 |
* @type string $privacy_policy_url Privacy policy URL. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4447 |
* @type string $sitename The site name sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4448 |
* @type string $siteurl The site URL sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4449 |
* } |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4450 |
*/ |
18 | 4451 |
$content = apply_filters_deprecated( |
4452 |
'user_confirmed_action_email_content', |
|
4453 |
array( $content, $email_data ), |
|
4454 |
'5.8.0', |
|
4455 |
sprintf( |
|
4456 |
/* translators: 1 & 2: Deprecation replacement options. */ |
|
4457 |
__( '%1$s or %2$s' ), |
|
4458 |
'user_erasure_fulfillment_email_content', |
|
4459 |
'user_request_confirmed_email_content' |
|
4460 |
) |
|
4461 |
); |
|
4462 |
||
4463 |
/** |
|
4464 |
* Filters the body of the data erasure fulfillment notification. |
|
4465 |
* |
|
4466 |
* The email is sent to a user when their data erasure request is fulfilled |
|
4467 |
* by an administrator. |
|
4468 |
* |
|
4469 |
* The following strings have a special meaning and will get replaced dynamically: |
|
4470 |
* |
|
4471 |
* ###SITENAME### The name of the site. |
|
4472 |
* ###PRIVACY_POLICY_URL### Privacy policy page URL. |
|
4473 |
* ###SITEURL### The URL to the site. |
|
4474 |
* |
|
4475 |
* @since 5.8.0 |
|
4476 |
* |
|
4477 |
* @param string $content The email content. |
|
4478 |
* @param array $email_data { |
|
4479 |
* Data relating to the account action email. |
|
4480 |
* |
|
4481 |
* @type WP_User_Request $request User request object. |
|
4482 |
* @type string $message_recipient The address that the email will be sent to. Defaults |
|
4483 |
* to the value of `$request->email`, but can be changed |
|
4484 |
* by the `user_erasure_fulfillment_email_to` filter. |
|
4485 |
* @type string $privacy_policy_url Privacy policy URL. |
|
4486 |
* @type string $sitename The site name sending the mail. |
|
4487 |
* @type string $siteurl The site URL sending the mail. |
|
4488 |
* } |
|
4489 |
*/ |
|
4490 |
$content = apply_filters( 'user_erasure_fulfillment_email_content', $content, $email_data ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4491 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4492 |
$content = str_replace( '###SITENAME###', $email_data['sitename'], $content ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4493 |
$content = str_replace( '###PRIVACY_POLICY_URL###', $email_data['privacy_policy_url'], $content ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4494 |
$content = str_replace( '###SITEURL###', sanitize_url( $email_data['siteurl'] ), $content ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4495 |
|
16 | 4496 |
$headers = ''; |
4497 |
||
4498 |
/** |
|
4499 |
* Filters the headers of the data erasure fulfillment notification. |
|
4500 |
* |
|
4501 |
* @since 5.4.0 |
|
18 | 4502 |
* @deprecated 5.8.0 Use {@see 'user_erasure_fulfillment_email_headers'} instead. |
16 | 4503 |
* |
4504 |
* @param string|array $headers The email headers. |
|
4505 |
* @param string $subject The email subject. |
|
4506 |
* @param string $content The email content. |
|
4507 |
* @param int $request_id The request ID. |
|
4508 |
* @param array $email_data { |
|
4509 |
* Data relating to the account action email. |
|
4510 |
* |
|
4511 |
* @type WP_User_Request $request User request object. |
|
4512 |
* @type string $message_recipient The address that the email will be sent to. Defaults |
|
4513 |
* to the value of `$request->email`, but can be changed |
|
4514 |
* by the `user_erasure_fulfillment_email_to` filter. |
|
4515 |
* @type string $privacy_policy_url Privacy policy URL. |
|
4516 |
* @type string $sitename The site name sending the mail. |
|
4517 |
* @type string $siteurl The site URL sending the mail. |
|
4518 |
* } |
|
4519 |
*/ |
|
18 | 4520 |
$headers = apply_filters_deprecated( |
4521 |
'user_erasure_complete_email_headers', |
|
4522 |
array( $headers, $subject, $content, $request_id, $email_data ), |
|
4523 |
'5.8.0', |
|
4524 |
'user_erasure_fulfillment_email_headers' |
|
4525 |
); |
|
4526 |
||
4527 |
/** |
|
4528 |
* Filters the headers of the data erasure fulfillment notification. |
|
4529 |
* |
|
4530 |
* @since 5.8.0 |
|
4531 |
* |
|
4532 |
* @param string|array $headers The email headers. |
|
4533 |
* @param string $subject The email subject. |
|
4534 |
* @param string $content The email content. |
|
4535 |
* @param int $request_id The request ID. |
|
4536 |
* @param array $email_data { |
|
4537 |
* Data relating to the account action email. |
|
4538 |
* |
|
4539 |
* @type WP_User_Request $request User request object. |
|
4540 |
* @type string $message_recipient The address that the email will be sent to. Defaults |
|
4541 |
* to the value of `$request->email`, but can be changed |
|
4542 |
* by the `user_erasure_fulfillment_email_to` filter. |
|
4543 |
* @type string $privacy_policy_url Privacy policy URL. |
|
4544 |
* @type string $sitename The site name sending the mail. |
|
4545 |
* @type string $siteurl The site URL sending the mail. |
|
4546 |
* } |
|
4547 |
*/ |
|
4548 |
$headers = apply_filters( 'user_erasure_fulfillment_email_headers', $headers, $subject, $content, $request_id, $email_data ); |
|
16 | 4549 |
|
4550 |
$email_sent = wp_mail( $user_email, $subject, $content, $headers ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4551 |
|
9 | 4552 |
if ( $switched_locale ) { |
4553 |
restore_previous_locale(); |
|
4554 |
} |
|
4555 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4556 |
if ( $email_sent ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4557 |
update_post_meta( $request_id, '_wp_user_notified', true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4558 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4559 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4560 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4561 |
/** |
19 | 4562 |
* Returns request confirmation message HTML. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4563 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4564 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4565 |
* @access private |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4566 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4567 |
* @param int $request_id The request ID being confirmed. |
16 | 4568 |
* @return string The confirmation message. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4569 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4570 |
function _wp_privacy_account_request_confirmed_message( $request_id ) { |
16 | 4571 |
$request = wp_get_user_request( $request_id ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4572 |
|
9 | 4573 |
$message = '<p class="success">' . __( 'Action has been confirmed.' ) . '</p>'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4574 |
$message .= '<p>' . __( 'The site administrator has been notified and will fulfill your request as soon as possible.' ) . '</p>'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4575 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4576 |
if ( $request && in_array( $request->action_name, _wp_privacy_action_request_types(), true ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4577 |
if ( 'export_personal_data' === $request->action_name ) { |
9 | 4578 |
$message = '<p class="success">' . __( 'Thanks for confirming your export request.' ) . '</p>'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4579 |
$message .= '<p>' . __( 'The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request.' ) . '</p>'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4580 |
} elseif ( 'remove_personal_data' === $request->action_name ) { |
9 | 4581 |
$message = '<p class="success">' . __( 'Thanks for confirming your erasure request.' ) . '</p>'; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4582 |
$message .= '<p>' . __( 'The site administrator has been notified. You will receive an email confirmation when they erase your data.' ) . '</p>'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4583 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4584 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4585 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4586 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4587 |
* Filters the message displayed to a user when they confirm a data request. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4588 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4589 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4590 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4591 |
* @param string $message The message to the user. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4592 |
* @param int $request_id The ID of the request being confirmed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4593 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4594 |
$message = apply_filters( 'user_request_action_confirmed_message', $message, $request_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4595 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4596 |
return $message; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4597 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4598 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4599 |
/** |
19 | 4600 |
* Creates and logs a user request to perform a specific action. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4601 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4602 |
* Requests are stored inside a post type named `user_request` since they can apply to both |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4603 |
* users on the site, or guests without a user account. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4604 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4605 |
* @since 4.9.6 |
18 | 4606 |
* @since 5.7.0 Added the `$status` parameter. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4607 |
* |
18 | 4608 |
* @param string $email_address User email address. This can be the address of a registered |
4609 |
* or non-registered user. |
|
4610 |
* @param string $action_name Name of the action that is being confirmed. Required. |
|
4611 |
* @param array $request_data Misc data you want to send with the verification request and pass |
|
4612 |
* to the actions once the request is confirmed. |
|
4613 |
* @param string $status Optional request status (pending or confirmed). Default 'pending'. |
|
4614 |
* @return int|WP_Error Returns the request ID if successful, or a WP_Error object on failure. |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4615 |
*/ |
18 | 4616 |
function wp_create_user_request( $email_address = '', $action_name = '', $request_data = array(), $status = 'pending' ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4617 |
$email_address = sanitize_email( $email_address ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4618 |
$action_name = sanitize_key( $action_name ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4619 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4620 |
if ( ! is_email( $email_address ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4621 |
return new WP_Error( 'invalid_email', __( 'Invalid email address.' ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4622 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4623 |
|
18 | 4624 |
if ( ! in_array( $action_name, _wp_privacy_action_request_types(), true ) ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4625 |
return new WP_Error( 'invalid_action', __( 'Invalid action name.' ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4626 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4627 |
|
18 | 4628 |
if ( ! in_array( $status, array( 'pending', 'confirmed' ), true ) ) { |
4629 |
return new WP_Error( 'invalid_status', __( 'Invalid request status.' ) ); |
|
4630 |
} |
|
4631 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4632 |
$user = get_user_by( 'email', $email_address ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4633 |
$user_id = $user && ! is_wp_error( $user ) ? $user->ID : 0; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4634 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4635 |
// Check for duplicates. |
9 | 4636 |
$requests_query = new WP_Query( |
4637 |
array( |
|
4638 |
'post_type' => 'user_request', |
|
16 | 4639 |
'post_name__in' => array( $action_name ), // Action name stored in post_name column. |
4640 |
'title' => $email_address, // Email address stored in post_title column. |
|
9 | 4641 |
'post_status' => array( |
4642 |
'request-pending', |
|
4643 |
'request-confirmed', |
|
4644 |
), |
|
4645 |
'fields' => 'ids', |
|
4646 |
) |
|
4647 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4648 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4649 |
if ( $requests_query->found_posts ) { |
18 | 4650 |
return new WP_Error( 'duplicate_request', __( 'An incomplete personal data request for this email address already exists.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4651 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4652 |
|
9 | 4653 |
$request_id = wp_insert_post( |
4654 |
array( |
|
4655 |
'post_author' => $user_id, |
|
4656 |
'post_name' => $action_name, |
|
4657 |
'post_title' => $email_address, |
|
4658 |
'post_content' => wp_json_encode( $request_data ), |
|
18 | 4659 |
'post_status' => 'request-' . $status, |
9 | 4660 |
'post_type' => 'user_request', |
4661 |
'post_date' => current_time( 'mysql', false ), |
|
4662 |
'post_date_gmt' => current_time( 'mysql', true ), |
|
4663 |
), |
|
4664 |
true |
|
4665 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4666 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4667 |
return $request_id; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4668 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4669 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4670 |
/** |
19 | 4671 |
* Gets action description from the name and return a string. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4672 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4673 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4674 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4675 |
* @param string $action_name Action name of the request. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4676 |
* @return string Human readable action name. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4677 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4678 |
function wp_user_request_action_description( $action_name ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4679 |
switch ( $action_name ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4680 |
case 'export_personal_data': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4681 |
$description = __( 'Export Personal Data' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4682 |
break; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4683 |
case 'remove_personal_data': |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4684 |
$description = __( 'Erase Personal Data' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4685 |
break; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4686 |
default: |
16 | 4687 |
/* translators: %s: Action name. */ |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4688 |
$description = sprintf( __( 'Confirm the "%s" action' ), $action_name ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4689 |
break; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4690 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4691 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4692 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4693 |
* Filters the user action description. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4694 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4695 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4696 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4697 |
* @param string $description The default description. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4698 |
* @param string $action_name The name of the request. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4699 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4700 |
return apply_filters( 'user_request_action_description', $description, $action_name ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4701 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4702 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4703 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4704 |
* Send a confirmation request email to confirm an action. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4705 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4706 |
* If the request is not already pending, it will be updated. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4707 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4708 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4709 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4710 |
* @param string $request_id ID of the request created via wp_create_user_request(). |
18 | 4711 |
* @return true|WP_Error True on success, `WP_Error` on failure. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4712 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4713 |
function wp_send_user_request( $request_id ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4714 |
$request_id = absint( $request_id ); |
16 | 4715 |
$request = wp_get_user_request( $request_id ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4716 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4717 |
if ( ! $request ) { |
18 | 4718 |
return new WP_Error( 'invalid_request', __( 'Invalid personal data request.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4719 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4720 |
|
9 | 4721 |
// Localize message content for user; fallback to site default for visitors. |
4722 |
if ( ! empty( $request->user_id ) ) { |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4723 |
$switched_locale = switch_to_user_locale( $request->user_id ); |
9 | 4724 |
} else { |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4725 |
$switched_locale = switch_to_locale( get_locale() ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4726 |
} |
9 | 4727 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4728 |
$email_data = array( |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4729 |
'request' => $request, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4730 |
'email' => $request->email, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4731 |
'description' => wp_user_request_action_description( $request->action_name ), |
9 | 4732 |
'confirm_url' => add_query_arg( |
4733 |
array( |
|
4734 |
'action' => 'confirmaction', |
|
4735 |
'request_id' => $request_id, |
|
4736 |
'confirm_key' => wp_generate_user_request_key( $request_id ), |
|
4737 |
), |
|
4738 |
wp_login_url() |
|
4739 |
), |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4740 |
'sitename' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4741 |
'siteurl' => home_url(), |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4742 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4743 |
|
18 | 4744 |
/* translators: Confirm privacy data request notification email subject. 1: Site title, 2: Name of the action. */ |
4745 |
$subject = sprintf( __( '[%1$s] Confirm Action: %2$s' ), $email_data['sitename'], $email_data['description'] ); |
|
4746 |
||
4747 |
/** |
|
4748 |
* Filters the subject of the email sent when an account action is attempted. |
|
4749 |
* |
|
4750 |
* @since 4.9.6 |
|
4751 |
* |
|
4752 |
* @param string $subject The email subject. |
|
4753 |
* @param string $sitename The name of the site. |
|
4754 |
* @param array $email_data { |
|
4755 |
* Data relating to the account action email. |
|
4756 |
* |
|
4757 |
* @type WP_User_Request $request User request object. |
|
4758 |
* @type string $email The email address this is being sent to. |
|
4759 |
* @type string $description Description of the action being performed so the user knows what the email is for. |
|
4760 |
* @type string $confirm_url The link to click on to confirm the account action. |
|
4761 |
* @type string $sitename The site name sending the mail. |
|
4762 |
* @type string $siteurl The site URL sending the mail. |
|
4763 |
* } |
|
4764 |
*/ |
|
4765 |
$subject = apply_filters( 'user_request_action_email_subject', $subject, $email_data['sitename'], $email_data ); |
|
4766 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4767 |
/* translators: Do not translate DESCRIPTION, CONFIRM_URL, SITENAME, SITEURL: those are placeholders. */ |
18 | 4768 |
$content = __( |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4769 |
'Howdy, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4770 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4771 |
A request has been made to perform the following action on your account: |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4772 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4773 |
###DESCRIPTION### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4774 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4775 |
To confirm this, please click on the following link: |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4776 |
###CONFIRM_URL### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4777 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4778 |
You can safely ignore and delete this email if you do not want to |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4779 |
take this action. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4780 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4781 |
Regards, |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4782 |
All at ###SITENAME### |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4783 |
###SITEURL###' |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4784 |
); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4785 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4786 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4787 |
* Filters the text of the email sent when an account action is attempted. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4788 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4789 |
* The following strings have a special meaning and will get replaced dynamically: |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4790 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4791 |
* ###DESCRIPTION### Description of the action being performed so the user knows what the email is for. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4792 |
* ###CONFIRM_URL### The link to click on to confirm the account action. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4793 |
* ###SITENAME### The name of the site. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4794 |
* ###SITEURL### The URL to the site. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4795 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4796 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4797 |
* |
18 | 4798 |
* @param string $content Text in the email. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4799 |
* @param array $email_data { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4800 |
* Data relating to the account action email. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4801 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4802 |
* @type WP_User_Request $request User request object. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4803 |
* @type string $email The email address this is being sent to. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4804 |
* @type string $description Description of the action being performed so the user knows what the email is for. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4805 |
* @type string $confirm_url The link to click on to confirm the account action. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4806 |
* @type string $sitename The site name sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4807 |
* @type string $siteurl The site URL sending the mail. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4808 |
* } |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4809 |
*/ |
18 | 4810 |
$content = apply_filters( 'user_request_action_email_content', $content, $email_data ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4811 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4812 |
$content = str_replace( '###DESCRIPTION###', $email_data['description'], $content ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4813 |
$content = str_replace( '###CONFIRM_URL###', sanitize_url( $email_data['confirm_url'] ), $content ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4814 |
$content = str_replace( '###EMAIL###', $email_data['email'], $content ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4815 |
$content = str_replace( '###SITENAME###', $email_data['sitename'], $content ); |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4816 |
$content = str_replace( '###SITEURL###', sanitize_url( $email_data['siteurl'] ), $content ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4817 |
|
16 | 4818 |
$headers = ''; |
4819 |
||
4820 |
/** |
|
4821 |
* Filters the headers of the email sent when an account action is attempted. |
|
4822 |
* |
|
4823 |
* @since 5.4.0 |
|
4824 |
* |
|
4825 |
* @param string|array $headers The email headers. |
|
4826 |
* @param string $subject The email subject. |
|
4827 |
* @param string $content The email content. |
|
4828 |
* @param int $request_id The request ID. |
|
4829 |
* @param array $email_data { |
|
4830 |
* Data relating to the account action email. |
|
4831 |
* |
|
4832 |
* @type WP_User_Request $request User request object. |
|
4833 |
* @type string $email The email address this is being sent to. |
|
4834 |
* @type string $description Description of the action being performed so the user knows what the email is for. |
|
4835 |
* @type string $confirm_url The link to click on to confirm the account action. |
|
4836 |
* @type string $sitename The site name sending the mail. |
|
4837 |
* @type string $siteurl The site URL sending the mail. |
|
4838 |
* } |
|
4839 |
*/ |
|
4840 |
$headers = apply_filters( 'user_request_action_email_headers', $headers, $subject, $content, $request_id, $email_data ); |
|
4841 |
||
4842 |
$email_sent = wp_mail( $email_data['email'], $subject, $content, $headers ); |
|
9 | 4843 |
|
4844 |
if ( $switched_locale ) { |
|
4845 |
restore_previous_locale(); |
|
4846 |
} |
|
4847 |
||
4848 |
if ( ! $email_sent ) { |
|
4849 |
return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export confirmation email.' ) ); |
|
4850 |
} |
|
4851 |
||
4852 |
return true; |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4853 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4854 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4855 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4856 |
* Returns a confirmation key for a user action and stores the hashed version for future comparison. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4857 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4858 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4859 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4860 |
* @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4861 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4862 |
* @param int $request_id Request ID. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4863 |
* @return string Confirmation key. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4864 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4865 |
function wp_generate_user_request_key( $request_id ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4866 |
global $wp_hasher; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4867 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4868 |
// Generate something random for a confirmation key. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4869 |
$key = wp_generate_password( 20, false ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4870 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4871 |
// Return the key, hashed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4872 |
if ( empty( $wp_hasher ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4873 |
require_once ABSPATH . WPINC . '/class-phpass.php'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4874 |
$wp_hasher = new PasswordHash( 8, true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4875 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4876 |
|
9 | 4877 |
wp_update_post( |
4878 |
array( |
|
4879 |
'ID' => $request_id, |
|
4880 |
'post_status' => 'request-pending', |
|
4881 |
'post_password' => $wp_hasher->HashPassword( $key ), |
|
4882 |
) |
|
4883 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4884 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4885 |
return $key; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4886 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4887 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4888 |
/** |
19 | 4889 |
* Validates a user request by comparing the key with the request's key. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4890 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4891 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4892 |
* |
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4893 |
* @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
4894 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4895 |
* @param string $request_id ID of the request being confirmed. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4896 |
* @param string $key Provided key to validate. |
18 | 4897 |
* @return true|WP_Error True on success, WP_Error on failure. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4898 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4899 |
function wp_validate_user_request_key( $request_id, $key ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4900 |
global $wp_hasher; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4901 |
|
18 | 4902 |
$request_id = absint( $request_id ); |
4903 |
$request = wp_get_user_request( $request_id ); |
|
4904 |
$saved_key = $request->confirm_key; |
|
4905 |
$key_request_time = $request->modified_timestamp; |
|
4906 |
||
4907 |
if ( ! $request || ! $saved_key || ! $key_request_time ) { |
|
4908 |
return new WP_Error( 'invalid_request', __( 'Invalid personal data request.' ) ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4909 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4910 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4911 |
if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) { |
18 | 4912 |
return new WP_Error( 'expired_request', __( 'This personal data request has expired.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4913 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4914 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4915 |
if ( empty( $key ) ) { |
18 | 4916 |
return new WP_Error( 'missing_key', __( 'The confirmation key is missing from this personal data request.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4917 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4918 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4919 |
if ( empty( $wp_hasher ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4920 |
require_once ABSPATH . WPINC . '/class-phpass.php'; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4921 |
$wp_hasher = new PasswordHash( 8, true ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4922 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4923 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4924 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4925 |
* Filters the expiration time of confirm keys. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4926 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4927 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4928 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4929 |
* @param int $expiration The expiration time in seconds. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4930 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4931 |
$expiration_duration = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4932 |
$expiration_time = $key_request_time + $expiration_duration; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4933 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4934 |
if ( ! $wp_hasher->CheckPassword( $key, $saved_key ) ) { |
18 | 4935 |
return new WP_Error( 'invalid_key', __( 'The confirmation key is invalid for this personal data request.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4936 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4937 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4938 |
if ( ! $expiration_time || time() > $expiration_time ) { |
18 | 4939 |
return new WP_Error( 'expired_key', __( 'The confirmation key has expired for this personal data request.' ) ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4940 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4941 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4942 |
return true; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4943 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4944 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4945 |
/** |
19 | 4946 |
* Returns the user request object for the specified request ID. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4947 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4948 |
* @since 4.9.6 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4949 |
* |
16 | 4950 |
* @param int $request_id The ID of the user request. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4951 |
* @return WP_User_Request|false |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4952 |
*/ |
16 | 4953 |
function wp_get_user_request( $request_id ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4954 |
$request_id = absint( $request_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4955 |
$post = get_post( $request_id ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4956 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4957 |
if ( ! $post || 'user_request' !== $post->post_type ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4958 |
return false; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4959 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4960 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4961 |
return new WP_User_Request( $post ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
4962 |
} |
18 | 4963 |
|
4964 |
/** |
|
19 | 4965 |
* Checks if Application Passwords is supported. |
4966 |
* |
|
4967 |
* Application Passwords is supported only by sites using SSL or local environments |
|
4968 |
* but may be made available using the {@see 'wp_is_application_passwords_available'} filter. |
|
4969 |
* |
|
4970 |
* @since 5.9.0 |
|
4971 |
* |
|
4972 |
* @return bool |
|
4973 |
*/ |
|
4974 |
function wp_is_application_passwords_supported() { |
|
4975 |
return is_ssl() || 'local' === wp_get_environment_type(); |
|
4976 |
} |
|
4977 |
||
4978 |
/** |
|
18 | 4979 |
* Checks if Application Passwords is globally available. |
4980 |
* |
|
4981 |
* By default, Application Passwords is available to all sites using SSL or to local environments. |
|
19 | 4982 |
* Use the {@see 'wp_is_application_passwords_available'} filter to adjust its availability. |
18 | 4983 |
* |
4984 |
* @since 5.6.0 |
|
4985 |
* |
|
4986 |
* @return bool |
|
4987 |
*/ |
|
4988 |
function wp_is_application_passwords_available() { |
|
4989 |
/** |
|
4990 |
* Filters whether Application Passwords is available. |
|
4991 |
* |
|
4992 |
* @since 5.6.0 |
|
4993 |
* |
|
4994 |
* @param bool $available True if available, false otherwise. |
|
4995 |
*/ |
|
19 | 4996 |
return apply_filters( 'wp_is_application_passwords_available', wp_is_application_passwords_supported() ); |
18 | 4997 |
} |
4998 |
||
4999 |
/** |
|
5000 |
* Checks if Application Passwords is available for a specific user. |
|
5001 |
* |
|
5002 |
* By default all users can use Application Passwords. Use {@see 'wp_is_application_passwords_available_for_user'} |
|
5003 |
* to restrict availability to certain users. |
|
5004 |
* |
|
5005 |
* @since 5.6.0 |
|
5006 |
* |
|
5007 |
* @param int|WP_User $user The user to check. |
|
5008 |
* @return bool |
|
5009 |
*/ |
|
5010 |
function wp_is_application_passwords_available_for_user( $user ) { |
|
5011 |
if ( ! wp_is_application_passwords_available() ) { |
|
5012 |
return false; |
|
5013 |
} |
|
5014 |
||
5015 |
if ( ! is_object( $user ) ) { |
|
5016 |
$user = get_userdata( $user ); |
|
5017 |
} |
|
5018 |
||
5019 |
if ( ! $user || ! $user->exists() ) { |
|
5020 |
return false; |
|
5021 |
} |
|
5022 |
||
5023 |
/** |
|
5024 |
* Filters whether Application Passwords is available for a specific user. |
|
5025 |
* |
|
5026 |
* @since 5.6.0 |
|
5027 |
* |
|
5028 |
* @param bool $available True if available, false otherwise. |
|
5029 |
* @param WP_User $user The user to check. |
|
5030 |
*/ |
|
5031 |
return apply_filters( 'wp_is_application_passwords_available_for_user', true, $user ); |
|
5032 |
} |
|
21
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5033 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5034 |
/** |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5035 |
* Registers the user meta property for persisted preferences. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5036 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5037 |
* This property is used to store user preferences across page reloads and is |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5038 |
* currently used by the block editor for preferences like 'fullscreenMode' and |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5039 |
* 'fixedToolbar'. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5040 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5041 |
* @since 6.1.0 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5042 |
* @access private |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5043 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5044 |
* @global wpdb $wpdb WordPress database abstraction object. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5045 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5046 |
function wp_register_persisted_preferences_meta() { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5047 |
/* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5048 |
* Create a meta key that incorporates the blog prefix so that each site |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5049 |
* on a multisite can have distinct user preferences. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5050 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5051 |
global $wpdb; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5052 |
$meta_key = $wpdb->get_blog_prefix() . 'persisted_preferences'; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5053 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5054 |
register_meta( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5055 |
'user', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5056 |
$meta_key, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5057 |
array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5058 |
'type' => 'object', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5059 |
'single' => true, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5060 |
'show_in_rest' => array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5061 |
'name' => 'persisted_preferences', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5062 |
'type' => 'object', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5063 |
'schema' => array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5064 |
'type' => 'object', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5065 |
'context' => array( 'edit' ), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5066 |
'properties' => array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5067 |
'_modified' => array( |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5068 |
'description' => __( 'The date and time the preferences were updated.' ), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5069 |
'type' => 'string', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5070 |
'format' => 'date-time', |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5071 |
'readonly' => false, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5072 |
), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5073 |
), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5074 |
'additionalProperties' => true, |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5075 |
), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5076 |
), |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5077 |
) |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5078 |
); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5079 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5080 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5081 |
/** |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5082 |
* Sets the last changed time for the 'users' cache group. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5083 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5084 |
* @since 6.3.0 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5085 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5086 |
function wp_cache_set_users_last_changed() { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5087 |
wp_cache_set_last_changed( 'users' ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5088 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5089 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5090 |
/** |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5091 |
* Checks if password reset is allowed for a specific user. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5092 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5093 |
* @since 6.3.0 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5094 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5095 |
* @param int|WP_User $user The user to check. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5096 |
* @return bool|WP_Error True if allowed, false or WP_Error otherwise. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5097 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5098 |
function wp_is_password_reset_allowed_for_user( $user ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5099 |
if ( ! is_object( $user ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5100 |
$user = get_userdata( $user ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5101 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5102 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5103 |
if ( ! $user || ! $user->exists() ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5104 |
return false; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5105 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5106 |
$allow = true; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5107 |
if ( is_multisite() && is_user_spammy( $user ) ) { |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5108 |
$allow = false; |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5109 |
} |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5110 |
|
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5111 |
/** |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5112 |
* Filters whether to allow a password to be reset. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5113 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5114 |
* @since 2.7.0 |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5115 |
* |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5116 |
* @param bool $allow Whether to allow the password to be reset. Default true. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5117 |
* @param int $user_id The ID of the user attempting to reset a password. |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5118 |
*/ |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5119 |
return apply_filters( 'allow_password_reset', $allow, $user->ID ); |
48c4eec2b7e6
Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents:
19
diff
changeset
|
5120 |
} |