|
1 <?php |
|
2 /** |
|
3 * Multisite WordPress API |
|
4 * |
|
5 * @package WordPress |
|
6 * @subpackage Multisite |
|
7 * @since 3.0.0 |
|
8 */ |
|
9 |
|
10 /** |
|
11 * Gets the network's site and user counts. |
|
12 * |
|
13 * @since MU 1.0 |
|
14 * @uses get_blog_count() |
|
15 * @uses get_user_count() |
|
16 * |
|
17 * @return array Site and user count for the network. |
|
18 */ |
|
19 function get_sitestats() { |
|
20 global $wpdb; |
|
21 |
|
22 $stats = array( |
|
23 'blogs' => get_blog_count(), |
|
24 'users' => get_user_count(), |
|
25 ); |
|
26 |
|
27 return $stats; |
|
28 } |
|
29 |
|
30 /** |
|
31 * Get the admin for a domain/path combination. |
|
32 * |
|
33 * @since MU 1.0 |
|
34 * |
|
35 * @param string $sitedomain Optional. Site domain. |
|
36 * @param string $path Optional. Site path. |
|
37 * @return array The network admins |
|
38 */ |
|
39 function get_admin_users_for_domain( $sitedomain = '', $path = '' ) { |
|
40 global $wpdb; |
|
41 |
|
42 if ( ! $sitedomain ) |
|
43 $site_id = $wpdb->siteid; |
|
44 else |
|
45 $site_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE domain = %s AND path = %s", $sitedomain, $path ) ); |
|
46 |
|
47 if ( $site_id ) |
|
48 return $wpdb->get_results( $wpdb->prepare( "SELECT u.ID, u.user_login, u.user_pass FROM $wpdb->users AS u, $wpdb->sitemeta AS sm WHERE sm.meta_key = 'admin_user_id' AND u.ID = sm.meta_value AND sm.site_id = %d", $site_id ), ARRAY_A ); |
|
49 |
|
50 return false; |
|
51 } |
|
52 |
|
53 /** |
|
54 * Get one of a user's active blogs |
|
55 * |
|
56 * Returns the user's primary blog, if she has one and |
|
57 * it is active. If it's inactive, function returns another |
|
58 * active blog of the user. If none are found, the user |
|
59 * is added as a Subscriber to the Dashboard Blog and that blog |
|
60 * is returned. |
|
61 * |
|
62 * @since MU 1.0 |
|
63 * @uses get_blogs_of_user() |
|
64 * @uses add_user_to_blog() |
|
65 * @uses get_blog_details() |
|
66 * |
|
67 * @param int $user_id The unique ID of the user |
|
68 * @return object The blog object |
|
69 */ |
|
70 function get_active_blog_for_user( $user_id ) { |
|
71 global $wpdb; |
|
72 $blogs = get_blogs_of_user( $user_id ); |
|
73 if ( empty( $blogs ) ) |
|
74 return null; |
|
75 |
|
76 if ( !is_multisite() ) |
|
77 return $blogs[$wpdb->blogid]; |
|
78 |
|
79 $primary_blog = get_user_meta( $user_id, 'primary_blog', true ); |
|
80 $first_blog = current($blogs); |
|
81 if ( false !== $primary_blog ) { |
|
82 if ( ! isset( $blogs[ $primary_blog ] ) ) { |
|
83 update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id ); |
|
84 $primary = get_blog_details( $first_blog->userblog_id ); |
|
85 } else { |
|
86 $primary = get_blog_details( $primary_blog ); |
|
87 } |
|
88 } else { |
|
89 //TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog? |
|
90 add_user_to_blog( $first_blog->userblog_id, $user_id, 'subscriber' ); |
|
91 update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id ); |
|
92 $primary = $first_blog; |
|
93 } |
|
94 |
|
95 if ( ( ! is_object( $primary ) ) || ( $primary->archived == 1 || $primary->spam == 1 || $primary->deleted == 1 ) ) { |
|
96 $blogs = get_blogs_of_user( $user_id, true ); // if a user's primary blog is shut down, check their other blogs. |
|
97 $ret = false; |
|
98 if ( is_array( $blogs ) && count( $blogs ) > 0 ) { |
|
99 foreach ( (array) $blogs as $blog_id => $blog ) { |
|
100 if ( $blog->site_id != $wpdb->siteid ) |
|
101 continue; |
|
102 $details = get_blog_details( $blog_id ); |
|
103 if ( is_object( $details ) && $details->archived == 0 && $details->spam == 0 && $details->deleted == 0 ) { |
|
104 $ret = $blog; |
|
105 if ( get_user_meta( $user_id , 'primary_blog', true ) != $blog_id ) |
|
106 update_user_meta( $user_id, 'primary_blog', $blog_id ); |
|
107 if ( !get_user_meta($user_id , 'source_domain', true) ) |
|
108 update_user_meta( $user_id, 'source_domain', $blog->domain ); |
|
109 break; |
|
110 } |
|
111 } |
|
112 } else { |
|
113 return null; |
|
114 } |
|
115 return $ret; |
|
116 } else { |
|
117 return $primary; |
|
118 } |
|
119 } |
|
120 |
|
121 /** |
|
122 * The number of active users in your installation. |
|
123 * |
|
124 * The count is cached and updated twice daily. This is not a live count. |
|
125 * |
|
126 * @since MU 2.7 |
|
127 * |
|
128 * @return int |
|
129 */ |
|
130 function get_user_count() { |
|
131 return get_site_option( 'user_count' ); |
|
132 } |
|
133 |
|
134 /** |
|
135 * The number of active sites on your installation. |
|
136 * |
|
137 * The count is cached and updated twice daily. This is not a live count. |
|
138 * |
|
139 * @since MU 1.0 |
|
140 * |
|
141 * @param int $id Optional. A site_id. |
|
142 * @return int |
|
143 */ |
|
144 function get_blog_count( $id = 0 ) { |
|
145 return get_site_option( 'blog_count' ); |
|
146 } |
|
147 |
|
148 /** |
|
149 * Get a blog post from any site on the network. |
|
150 * |
|
151 * @since MU 1.0 |
|
152 * |
|
153 * @param int $blog_id ID of the blog. |
|
154 * @param int $post_id ID of the post you're looking for. |
|
155 * @return object The post. |
|
156 */ |
|
157 function get_blog_post( $blog_id, $post_id ) { |
|
158 global $wpdb; |
|
159 |
|
160 $key = $blog_id . '-' . $post_id; |
|
161 $post = wp_cache_get( $key, 'global-posts' ); |
|
162 if ( $post == false ) { |
|
163 $post = $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM ' . $wpdb->get_blog_prefix( $blog_id ) . 'posts WHERE ID = %d', $post_id ) ); |
|
164 wp_cache_add( $key, $post, 'global-posts' ); |
|
165 } |
|
166 |
|
167 return $post; |
|
168 } |
|
169 |
|
170 /** |
|
171 * Add a user to a blog. |
|
172 * |
|
173 * Use the 'add_user_to_blog' action to fire an event when |
|
174 * users are added to a blog. |
|
175 * |
|
176 * @since MU 1.0 |
|
177 * |
|
178 * @param int $blog_id ID of the blog you're adding the user to. |
|
179 * @param int $user_id ID of the user you're adding. |
|
180 * @param string $role The role you want the user to have |
|
181 * @return bool |
|
182 */ |
|
183 function add_user_to_blog( $blog_id, $user_id, $role ) { |
|
184 switch_to_blog($blog_id); |
|
185 |
|
186 $user = new WP_User($user_id); |
|
187 |
|
188 if ( ! $user->exists() ) { |
|
189 restore_current_blog(); |
|
190 return new WP_Error('user_does_not_exist', __('That user does not exist.')); |
|
191 } |
|
192 |
|
193 if ( !get_user_meta($user_id, 'primary_blog', true) ) { |
|
194 update_user_meta($user_id, 'primary_blog', $blog_id); |
|
195 $details = get_blog_details($blog_id); |
|
196 update_user_meta($user_id, 'source_domain', $details->domain); |
|
197 } |
|
198 |
|
199 $user->set_role($role); |
|
200 |
|
201 do_action('add_user_to_blog', $user_id, $role, $blog_id); |
|
202 wp_cache_delete( $user_id, 'users' ); |
|
203 restore_current_blog(); |
|
204 return true; |
|
205 } |
|
206 |
|
207 /** |
|
208 * Remove a user from a blog. |
|
209 * |
|
210 * Use the 'remove_user_from_blog' action to fire an event when |
|
211 * users are removed from a blog. |
|
212 * |
|
213 * Accepts an optional $reassign parameter, if you want to |
|
214 * reassign the user's blog posts to another user upon removal. |
|
215 * |
|
216 * @since MU 1.0 |
|
217 * |
|
218 * @param int $user_id ID of the user you're removing. |
|
219 * @param int $blog_id ID of the blog you're removing the user from. |
|
220 * @param string $reassign Optional. A user to whom to reassign posts. |
|
221 * @return bool |
|
222 */ |
|
223 function remove_user_from_blog($user_id, $blog_id = '', $reassign = '') { |
|
224 global $wpdb; |
|
225 switch_to_blog($blog_id); |
|
226 $user_id = (int) $user_id; |
|
227 do_action('remove_user_from_blog', $user_id, $blog_id); |
|
228 |
|
229 // If being removed from the primary blog, set a new primary if the user is assigned |
|
230 // to multiple blogs. |
|
231 $primary_blog = get_user_meta($user_id, 'primary_blog', true); |
|
232 if ( $primary_blog == $blog_id ) { |
|
233 $new_id = ''; |
|
234 $new_domain = ''; |
|
235 $blogs = get_blogs_of_user($user_id); |
|
236 foreach ( (array) $blogs as $blog ) { |
|
237 if ( $blog->userblog_id == $blog_id ) |
|
238 continue; |
|
239 $new_id = $blog->userblog_id; |
|
240 $new_domain = $blog->domain; |
|
241 break; |
|
242 } |
|
243 |
|
244 update_user_meta($user_id, 'primary_blog', $new_id); |
|
245 update_user_meta($user_id, 'source_domain', $new_domain); |
|
246 } |
|
247 |
|
248 // wp_revoke_user($user_id); |
|
249 $user = new WP_User($user_id); |
|
250 if ( ! $user->exists() ) { |
|
251 restore_current_blog(); |
|
252 return new WP_Error('user_does_not_exist', __('That user does not exist.')); |
|
253 } |
|
254 |
|
255 $user->remove_all_caps(); |
|
256 |
|
257 $blogs = get_blogs_of_user($user_id); |
|
258 if ( count($blogs) == 0 ) { |
|
259 update_user_meta($user_id, 'primary_blog', ''); |
|
260 update_user_meta($user_id, 'source_domain', ''); |
|
261 } |
|
262 |
|
263 if ( $reassign != '' ) { |
|
264 $reassign = (int) $reassign; |
|
265 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d", $reassign, $user_id) ); |
|
266 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d", $reassign, $user_id) ); |
|
267 } |
|
268 |
|
269 restore_current_blog(); |
|
270 |
|
271 return true; |
|
272 } |
|
273 |
|
274 /** |
|
275 * Create an empty blog. |
|
276 * |
|
277 * @since MU 1.0 |
|
278 * @uses install_blog() |
|
279 * |
|
280 * @param string $domain The new blog's domain. |
|
281 * @param string $path The new blog's path. |
|
282 * @param string $weblog_title The new blog's title. |
|
283 * @param int $site_id Optional. Defaults to 1. |
|
284 * @return int The ID of the newly created blog |
|
285 */ |
|
286 function create_empty_blog( $domain, $path, $weblog_title, $site_id = 1 ) { |
|
287 $domain = addslashes( $domain ); |
|
288 $weblog_title = addslashes( $weblog_title ); |
|
289 |
|
290 if ( empty($path) ) |
|
291 $path = '/'; |
|
292 |
|
293 // Check if the domain has been used already. We should return an error message. |
|
294 if ( domain_exists($domain, $path, $site_id) ) |
|
295 return __( '<strong>ERROR</strong>: Site URL already taken.' ); |
|
296 |
|
297 // Need to back up wpdb table names, and create a new wp_blogs entry for new blog. |
|
298 // Need to get blog_id from wp_blogs, and create new table names. |
|
299 // Must restore table names at the end of function. |
|
300 |
|
301 if ( ! $blog_id = insert_blog($domain, $path, $site_id) ) |
|
302 return __( '<strong>ERROR</strong>: problem creating site entry.' ); |
|
303 |
|
304 switch_to_blog($blog_id); |
|
305 install_blog($blog_id); |
|
306 restore_current_blog(); |
|
307 |
|
308 return $blog_id; |
|
309 } |
|
310 |
|
311 /** |
|
312 * Get the permalink for a post on another blog. |
|
313 * |
|
314 * @since MU 1.0 |
|
315 * |
|
316 * @param int $_blog_id ID of the source blog. |
|
317 * @param int $post_id ID of the desired post. |
|
318 * @return string The post's permalink |
|
319 */ |
|
320 function get_blog_permalink( $_blog_id, $post_id ) { |
|
321 $key = "{$_blog_id}-{$post_id}-blog_permalink"; |
|
322 $link = wp_cache_get( $key, 'site-options' ); |
|
323 if ( $link == false ) { |
|
324 switch_to_blog( $_blog_id ); |
|
325 $link = get_permalink( $post_id ); |
|
326 restore_current_blog(); |
|
327 wp_cache_add( $key, $link, 'site-options', 360 ); |
|
328 } |
|
329 return $link; |
|
330 } |
|
331 |
|
332 /** |
|
333 * Get a blog's numeric ID from its URL. |
|
334 * |
|
335 * On a subdirectory installation like example.com/blog1/, |
|
336 * $domain will be the root 'example.com' and $path the |
|
337 * subdirectory '/blog1/'. With subdomains like blog1.example.com, |
|
338 * $domain is 'blog1.example.com' and $path is '/'. |
|
339 * |
|
340 * @since MU 2.6.5 |
|
341 * |
|
342 * @param string $domain |
|
343 * @param string $path Optional. Not required for subdomain installations. |
|
344 * @return int |
|
345 */ |
|
346 function get_blog_id_from_url( $domain, $path = '/' ) { |
|
347 global $wpdb; |
|
348 |
|
349 $domain = strtolower( $wpdb->escape( $domain ) ); |
|
350 $path = strtolower( $wpdb->escape( $path ) ); |
|
351 $id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' ); |
|
352 |
|
353 if ( $id == -1 ) { // blog does not exist |
|
354 return 0; |
|
355 } elseif ( $id ) { |
|
356 return (int)$id; |
|
357 } |
|
358 |
|
359 $id = $wpdb->get_var( "SELECT blog_id FROM $wpdb->blogs WHERE domain = '$domain' and path = '$path' /* get_blog_id_from_url */" ); |
|
360 |
|
361 if ( !$id ) { |
|
362 wp_cache_set( md5( $domain . $path ), -1, 'blog-id-cache' ); |
|
363 return false; |
|
364 } |
|
365 wp_cache_set( md5( $domain . $path ), $id, 'blog-id-cache' ); |
|
366 |
|
367 return $id; |
|
368 } |
|
369 |
|
370 // Admin functions |
|
371 |
|
372 /** |
|
373 * Checks an email address against a list of banned domains. |
|
374 * |
|
375 * This function checks against the Banned Email Domains list |
|
376 * at wp-admin/network/settings.php. The check is only run on |
|
377 * self-registrations; user creation at wp-admin/network/users.php |
|
378 * bypasses this check. |
|
379 * |
|
380 * @since MU |
|
381 * |
|
382 * @param string $user_email The email provided by the user at registration. |
|
383 * @return bool Returns true when the email address is banned. |
|
384 */ |
|
385 function is_email_address_unsafe( $user_email ) { |
|
386 $banned_names = get_site_option( 'banned_email_domains' ); |
|
387 if ($banned_names && !is_array( $banned_names )) |
|
388 $banned_names = explode( "\n", $banned_names); |
|
389 |
|
390 if ( is_array( $banned_names ) && empty( $banned_names ) == false ) { |
|
391 $email_domain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); |
|
392 foreach ( (array) $banned_names as $banned_domain ) { |
|
393 if ( $banned_domain == '' ) |
|
394 continue; |
|
395 if ( |
|
396 strstr( $email_domain, $banned_domain ) || |
|
397 ( |
|
398 strstr( $banned_domain, '/' ) && |
|
399 preg_match( $banned_domain, $email_domain ) |
|
400 ) |
|
401 ) |
|
402 return true; |
|
403 } |
|
404 } |
|
405 return false; |
|
406 } |
|
407 |
|
408 /** |
|
409 * Processes new user registrations. |
|
410 * |
|
411 * Checks the data provided by the user during signup. Verifies |
|
412 * the validity and uniqueness of user names and user email addresses, |
|
413 * and checks email addresses against admin-provided domain |
|
414 * whitelists and blacklists. |
|
415 * |
|
416 * The hook 'wpmu_validate_user_signup' provides an easy way |
|
417 * to modify the signup process. The value $result, which is passed |
|
418 * to the hook, contains both the user-provided info and the error |
|
419 * messages created by the function. 'wpmu_validate_user_signup' allows |
|
420 * you to process the data in any way you'd like, and unset the |
|
421 * relevant errors if necessary. |
|
422 * |
|
423 * @since MU |
|
424 * @uses is_email_address_unsafe() |
|
425 * @uses username_exists() |
|
426 * @uses email_exists() |
|
427 * |
|
428 * @param string $user_name The login name provided by the user. |
|
429 * @param string $user_email The email provided by the user. |
|
430 * @return array Contains username, email, and error messages. |
|
431 */ |
|
432 function wpmu_validate_user_signup($user_name, $user_email) { |
|
433 global $wpdb; |
|
434 |
|
435 $errors = new WP_Error(); |
|
436 |
|
437 $orig_username = $user_name; |
|
438 $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); |
|
439 |
|
440 if ( $user_name != $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) { |
|
441 $errors->add( 'user_name', __( 'Only lowercase letters (a-z) and numbers are allowed.' ) ); |
|
442 $user_name = $orig_username; |
|
443 } |
|
444 |
|
445 $user_email = sanitize_email( $user_email ); |
|
446 |
|
447 if ( empty( $user_name ) ) |
|
448 $errors->add('user_name', __( 'Please enter a username.' ) ); |
|
449 |
|
450 $illegal_names = get_site_option( 'illegal_names' ); |
|
451 if ( is_array( $illegal_names ) == false ) { |
|
452 $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); |
|
453 add_site_option( 'illegal_names', $illegal_names ); |
|
454 } |
|
455 if ( in_array( $user_name, $illegal_names ) == true ) |
|
456 $errors->add('user_name', __( 'That username is not allowed.' ) ); |
|
457 |
|
458 if ( is_email_address_unsafe( $user_email ) ) |
|
459 $errors->add('user_email', __('You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider.')); |
|
460 |
|
461 if ( strlen( $user_name ) < 4 ) |
|
462 $errors->add('user_name', __( 'Username must be at least 4 characters.' ) ); |
|
463 |
|
464 if ( strpos( ' ' . $user_name, '_' ) != false ) |
|
465 $errors->add( 'user_name', __( 'Sorry, usernames may not contain the character “_”!' ) ); |
|
466 |
|
467 // all numeric? |
|
468 $match = array(); |
|
469 preg_match( '/[0-9]*/', $user_name, $match ); |
|
470 if ( $match[0] == $user_name ) |
|
471 $errors->add('user_name', __('Sorry, usernames must have letters too!')); |
|
472 |
|
473 if ( !is_email( $user_email ) ) |
|
474 $errors->add('user_email', __( 'Please enter a correct email address.' ) ); |
|
475 |
|
476 $limited_email_domains = get_site_option( 'limited_email_domains' ); |
|
477 if ( is_array( $limited_email_domains ) && empty( $limited_email_domains ) == false ) { |
|
478 $emaildomain = substr( $user_email, 1 + strpos( $user_email, '@' ) ); |
|
479 if ( in_array( $emaildomain, $limited_email_domains ) == false ) |
|
480 $errors->add('user_email', __('Sorry, that email address is not allowed!')); |
|
481 } |
|
482 |
|
483 // Check if the username has been used already. |
|
484 if ( username_exists($user_name) ) |
|
485 $errors->add('user_name', __('Sorry, that username already exists!')); |
|
486 |
|
487 // Check if the email address has been used already. |
|
488 if ( email_exists($user_email) ) |
|
489 $errors->add('user_email', __('Sorry, that email address is already used!')); |
|
490 |
|
491 // Has someone already signed up for this username? |
|
492 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_name) ); |
|
493 if ( $signup != null ) { |
|
494 $registered_at = mysql2date('U', $signup->registered); |
|
495 $now = current_time( 'timestamp', true ); |
|
496 $diff = $now - $registered_at; |
|
497 // If registered more than two days ago, cancel registration and let this signup go through. |
|
498 if ( $diff > 172800 ) |
|
499 $wpdb->delete( $wpdb->signups, array( 'user_login' => $user_name ) ); |
|
500 else |
|
501 $errors->add('user_name', __('That username is currently reserved but may be available in a couple of days.')); |
|
502 |
|
503 if ( $signup->active == 0 && $signup->user_email == $user_email ) |
|
504 $errors->add('user_email_used', __('username and email used')); |
|
505 } |
|
506 |
|
507 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_email = %s", $user_email) ); |
|
508 if ( $signup != null ) { |
|
509 $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered); |
|
510 // If registered more than two days ago, cancel registration and let this signup go through. |
|
511 if ( $diff > 172800 ) |
|
512 $wpdb->delete( $wpdb->signups, array( 'user_email' => $user_email ) ); |
|
513 else |
|
514 $errors->add('user_email', __('That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.')); |
|
515 } |
|
516 |
|
517 $result = array('user_name' => $user_name, 'orig_username' => $orig_username, 'user_email' => $user_email, 'errors' => $errors); |
|
518 |
|
519 return apply_filters('wpmu_validate_user_signup', $result); |
|
520 } |
|
521 |
|
522 /** |
|
523 * Processes new site registrations. |
|
524 * |
|
525 * Checks the data provided by the user during blog signup. Verifies |
|
526 * the validity and uniqueness of blog paths and domains. |
|
527 * |
|
528 * This function prevents the current user from registering a new site |
|
529 * with a blogname equivalent to another user's login name. Passing the |
|
530 * $user parameter to the function, where $user is the other user, is |
|
531 * effectively an override of this limitation. |
|
532 * |
|
533 * Filter 'wpmu_validate_blog_signup' if you want to modify |
|
534 * the way that WordPress validates new site signups. |
|
535 * |
|
536 * @since MU |
|
537 * @uses domain_exists() |
|
538 * @uses username_exists() |
|
539 * |
|
540 * @param string $blogname The blog name provided by the user. Must be unique. |
|
541 * @param string $blog_title The blog title provided by the user. |
|
542 * @return array Contains the new site data and error messages. |
|
543 */ |
|
544 function wpmu_validate_blog_signup($blogname, $blog_title, $user = '') { |
|
545 global $wpdb, $domain, $base, $current_site; |
|
546 |
|
547 $blog_title = strip_tags( $blog_title ); |
|
548 $blog_title = substr( $blog_title, 0, 50 ); |
|
549 |
|
550 $errors = new WP_Error(); |
|
551 $illegal_names = get_site_option( 'illegal_names' ); |
|
552 if ( $illegal_names == false ) { |
|
553 $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); |
|
554 add_site_option( 'illegal_names', $illegal_names ); |
|
555 } |
|
556 |
|
557 // On sub dir installs, Some names are so illegal, only a filter can spring them from jail |
|
558 if (! is_subdomain_install() ) |
|
559 $illegal_names = array_merge($illegal_names, apply_filters( 'subdirectory_reserved_names', array( 'page', 'comments', 'blog', 'files', 'feed' ) ) ); |
|
560 |
|
561 if ( empty( $blogname ) ) |
|
562 $errors->add('blogname', __( 'Please enter a site name.' ) ); |
|
563 |
|
564 if ( preg_match( '/[^a-z0-9]+/', $blogname ) ) |
|
565 $errors->add('blogname', __( 'Only lowercase letters and numbers allowed.' ) ); |
|
566 |
|
567 if ( in_array( $blogname, $illegal_names ) == true ) |
|
568 $errors->add('blogname', __( 'That name is not allowed.' ) ); |
|
569 |
|
570 if ( strlen( $blogname ) < 4 && !is_super_admin() ) |
|
571 $errors->add('blogname', __( 'Site name must be at least 4 characters.' ) ); |
|
572 |
|
573 if ( strpos( ' ' . $blogname, '_' ) != false ) |
|
574 $errors->add( 'blogname', __( 'Sorry, site names may not contain the character “_”!' ) ); |
|
575 |
|
576 // do not allow users to create a blog that conflicts with a page on the main blog. |
|
577 if ( !is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( "SELECT post_name FROM " . $wpdb->get_blog_prefix( $current_site->blog_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) |
|
578 $errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) ); |
|
579 |
|
580 // all numeric? |
|
581 $match = array(); |
|
582 preg_match( '/[0-9]*/', $blogname, $match ); |
|
583 if ( $match[0] == $blogname ) |
|
584 $errors->add('blogname', __('Sorry, site names must have letters too!')); |
|
585 |
|
586 $blogname = apply_filters( 'newblogname', $blogname ); |
|
587 |
|
588 $blog_title = stripslashes( $blog_title ); |
|
589 |
|
590 if ( empty( $blog_title ) ) |
|
591 $errors->add('blog_title', __( 'Please enter a site title.' ) ); |
|
592 |
|
593 // Check if the domain/path has been used already. |
|
594 if ( is_subdomain_install() ) { |
|
595 $mydomain = $blogname . '.' . preg_replace( '|^www\.|', '', $domain ); |
|
596 $path = $base; |
|
597 } else { |
|
598 $mydomain = "$domain"; |
|
599 $path = $base.$blogname.'/'; |
|
600 } |
|
601 if ( domain_exists($mydomain, $path) ) |
|
602 $errors->add('blogname', __('Sorry, that site already exists!')); |
|
603 |
|
604 if ( username_exists( $blogname ) ) { |
|
605 if ( is_object( $user ) == false || ( is_object($user) && ( $user->user_login != $blogname ) ) ) |
|
606 $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); |
|
607 } |
|
608 |
|
609 // Has someone already signed up for this domain? |
|
610 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path) ); // TODO: Check email too? |
|
611 if ( ! empty($signup) ) { |
|
612 $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered); |
|
613 // If registered more than two days ago, cancel registration and let this signup go through. |
|
614 if ( $diff > 172800 ) |
|
615 $wpdb->delete( $wpdb->signups, array( 'domain' => $mydomain , 'path' => $path ) ); |
|
616 else |
|
617 $errors->add('blogname', __('That site is currently reserved but may be available in a couple days.')); |
|
618 } |
|
619 |
|
620 $result = array('domain' => $mydomain, 'path' => $path, 'blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors); |
|
621 return apply_filters('wpmu_validate_blog_signup', $result); |
|
622 } |
|
623 |
|
624 /** |
|
625 * Record site signup information for future activation. |
|
626 * |
|
627 * @since MU |
|
628 * @uses wpmu_signup_blog_notification() |
|
629 * |
|
630 * @param string $domain The requested domain. |
|
631 * @param string $path The requested path. |
|
632 * @param string $title The requested site title. |
|
633 * @param string $user The user's requested login name. |
|
634 * @param string $user_email The user's email address. |
|
635 * @param array $meta By default, contains the requested privacy setting and lang_id. |
|
636 */ |
|
637 function wpmu_signup_blog($domain, $path, $title, $user, $user_email, $meta = '') { |
|
638 global $wpdb; |
|
639 |
|
640 $key = substr( md5( time() . rand() . $domain ), 0, 16 ); |
|
641 $meta = serialize($meta); |
|
642 $domain = $wpdb->escape($domain); |
|
643 $path = $wpdb->escape($path); |
|
644 $title = $wpdb->escape($title); |
|
645 |
|
646 $wpdb->insert( $wpdb->signups, array( |
|
647 'domain' => $domain, |
|
648 'path' => $path, |
|
649 'title' => $title, |
|
650 'user_login' => $user, |
|
651 'user_email' => $user_email, |
|
652 'registered' => current_time('mysql', true), |
|
653 'activation_key' => $key, |
|
654 'meta' => $meta |
|
655 ) ); |
|
656 |
|
657 wpmu_signup_blog_notification($domain, $path, $title, $user, $user_email, $key, $meta); |
|
658 } |
|
659 |
|
660 /** |
|
661 * Record user signup information for future activation. |
|
662 * |
|
663 * This function is used when user registration is open but |
|
664 * new site registration is not. |
|
665 * |
|
666 * @since MU |
|
667 * @uses wpmu_signup_user_notification() |
|
668 * |
|
669 * @param string $user The user's requested login name. |
|
670 * @param string $user_email The user's email address. |
|
671 * @param array $meta By default, this is an empty array. |
|
672 */ |
|
673 function wpmu_signup_user($user, $user_email, $meta = '') { |
|
674 global $wpdb; |
|
675 |
|
676 // Format data |
|
677 $user = preg_replace( '/\s+/', '', sanitize_user( $user, true ) ); |
|
678 $user_email = sanitize_email( $user_email ); |
|
679 $key = substr( md5( time() . rand() . $user_email ), 0, 16 ); |
|
680 $meta = serialize($meta); |
|
681 |
|
682 $wpdb->insert( $wpdb->signups, array( |
|
683 'domain' => '', |
|
684 'path' => '', |
|
685 'title' => '', |
|
686 'user_login' => $user, |
|
687 'user_email' => $user_email, |
|
688 'registered' => current_time('mysql', true), |
|
689 'activation_key' => $key, |
|
690 'meta' => $meta |
|
691 ) ); |
|
692 |
|
693 wpmu_signup_user_notification($user, $user_email, $key, $meta); |
|
694 } |
|
695 |
|
696 /** |
|
697 * Notify user of signup success. |
|
698 * |
|
699 * This is the notification function used when site registration |
|
700 * is enabled. |
|
701 * |
|
702 * Filter 'wpmu_signup_blog_notification' to bypass this function or |
|
703 * replace it with your own notification behavior. |
|
704 * |
|
705 * Filter 'wpmu_signup_blog_notification_email' and |
|
706 * 'wpmu_signup_blog_notification_subject' to change the content |
|
707 * and subject line of the email sent to newly registered users. |
|
708 * |
|
709 * @since MU |
|
710 * |
|
711 * @param string $domain The new blog domain. |
|
712 * @param string $path The new blog path. |
|
713 * @param string $title The site title. |
|
714 * @param string $user The user's login name. |
|
715 * @param string $user_email The user's email address. |
|
716 * @param array $meta By default, contains the requested privacy setting and lang_id. |
|
717 * @param string $key The activation key created in wpmu_signup_blog() |
|
718 * @return bool |
|
719 */ |
|
720 function wpmu_signup_blog_notification($domain, $path, $title, $user, $user_email, $key, $meta = '') { |
|
721 global $current_site; |
|
722 |
|
723 if ( !apply_filters('wpmu_signup_blog_notification', $domain, $path, $title, $user, $user_email, $key, $meta) ) |
|
724 return false; |
|
725 |
|
726 // Send email with activation link. |
|
727 if ( !is_subdomain_install() || $current_site->id != 1 ) |
|
728 $activate_url = network_site_url("wp-activate.php?key=$key"); |
|
729 else |
|
730 $activate_url = "http://{$domain}{$path}wp-activate.php?key=$key"; // @todo use *_url() API |
|
731 |
|
732 $activate_url = esc_url($activate_url); |
|
733 $admin_email = get_site_option( 'admin_email' ); |
|
734 if ( $admin_email == '' ) |
|
735 $admin_email = 'support@' . $_SERVER['SERVER_NAME']; |
|
736 $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); |
|
737 $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; |
|
738 $message = sprintf( |
|
739 apply_filters( 'wpmu_signup_blog_notification_email', |
|
740 __( "To activate your blog, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\nAfter you activate, you can visit your site here:\n\n%s" ), |
|
741 $domain, $path, $title, $user, $user_email, $key, $meta |
|
742 ), |
|
743 $activate_url, |
|
744 esc_url( "http://{$domain}{$path}" ), |
|
745 $key |
|
746 ); |
|
747 // TODO: Don't hard code activation link. |
|
748 $subject = sprintf( |
|
749 apply_filters( 'wpmu_signup_blog_notification_subject', |
|
750 __( '[%1$s] Activate %2$s' ), |
|
751 $domain, $path, $title, $user, $user_email, $key, $meta |
|
752 ), |
|
753 $from_name, |
|
754 esc_url( 'http://' . $domain . $path ) |
|
755 ); |
|
756 wp_mail($user_email, $subject, $message, $message_headers); |
|
757 return true; |
|
758 } |
|
759 |
|
760 /** |
|
761 * Notify user of signup success. |
|
762 * |
|
763 * This is the notification function used when no new site has |
|
764 * been requested. |
|
765 * |
|
766 * Filter 'wpmu_signup_user_notification' to bypass this function or |
|
767 * replace it with your own notification behavior. |
|
768 * |
|
769 * Filter 'wpmu_signup_user_notification_email' and |
|
770 * 'wpmu_signup_user_notification_subject' to change the content |
|
771 * and subject line of the email sent to newly registered users. |
|
772 * |
|
773 * @since MU |
|
774 * |
|
775 * @param string $user The user's login name. |
|
776 * @param string $user_email The user's email address. |
|
777 * @param array $meta By default, an empty array. |
|
778 * @param string $key The activation key created in wpmu_signup_user() |
|
779 * @return bool |
|
780 */ |
|
781 function wpmu_signup_user_notification($user, $user_email, $key, $meta = '') { |
|
782 if ( !apply_filters('wpmu_signup_user_notification', $user, $user_email, $key, $meta) ) |
|
783 return false; |
|
784 |
|
785 // Send email with activation link. |
|
786 $admin_email = get_site_option( 'admin_email' ); |
|
787 if ( $admin_email == '' ) |
|
788 $admin_email = 'support@' . $_SERVER['SERVER_NAME']; |
|
789 $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); |
|
790 $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; |
|
791 $message = sprintf( |
|
792 apply_filters( 'wpmu_signup_user_notification_email', |
|
793 __( "To activate your user, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\n" ), |
|
794 $user, $user_email, $key, $meta |
|
795 ), |
|
796 site_url( "wp-activate.php?key=$key" ) |
|
797 ); |
|
798 // TODO: Don't hard code activation link. |
|
799 $subject = sprintf( |
|
800 apply_filters( 'wpmu_signup_user_notification_subject', |
|
801 __( '[%1$s] Activate %2$s' ), |
|
802 $user, $user_email, $key, $meta |
|
803 ), |
|
804 $from_name, |
|
805 $user |
|
806 ); |
|
807 wp_mail($user_email, $subject, $message, $message_headers); |
|
808 return true; |
|
809 } |
|
810 |
|
811 /** |
|
812 * Activate a signup. |
|
813 * |
|
814 * Hook to 'wpmu_activate_user' or 'wpmu_activate_blog' for events |
|
815 * that should happen only when users or sites are self-created (since |
|
816 * those actions are not called when users and sites are created |
|
817 * by a Super Admin). |
|
818 * |
|
819 * @since MU |
|
820 * @uses wp_generate_password() |
|
821 * @uses wpmu_welcome_user_notification() |
|
822 * @uses add_user_to_blog() |
|
823 * @uses add_new_user_to_blog() |
|
824 * @uses wpmu_create_user() |
|
825 * @uses wpmu_create_blog() |
|
826 * @uses wpmu_welcome_notification() |
|
827 * |
|
828 * @param string $key The activation key provided to the user. |
|
829 * @return array An array containing information about the activated user and/or blog |
|
830 */ |
|
831 function wpmu_activate_signup($key) { |
|
832 global $wpdb, $current_site; |
|
833 |
|
834 $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE activation_key = %s", $key) ); |
|
835 |
|
836 if ( empty( $signup ) ) |
|
837 return new WP_Error( 'invalid_key', __( 'Invalid activation key.' ) ); |
|
838 |
|
839 if ( $signup->active ) { |
|
840 if ( empty( $signup->domain ) ) |
|
841 return new WP_Error( 'already_active', __( 'The user is already active.' ), $signup ); |
|
842 else |
|
843 return new WP_Error( 'already_active', __( 'The site is already active.' ), $signup ); |
|
844 } |
|
845 |
|
846 $meta = maybe_unserialize($signup->meta); |
|
847 $user_login = $wpdb->escape($signup->user_login); |
|
848 $user_email = $wpdb->escape($signup->user_email); |
|
849 $password = wp_generate_password( 12, false ); |
|
850 |
|
851 $user_id = username_exists($user_login); |
|
852 |
|
853 if ( ! $user_id ) |
|
854 $user_id = wpmu_create_user($user_login, $password, $user_email); |
|
855 else |
|
856 $user_already_exists = true; |
|
857 |
|
858 if ( ! $user_id ) |
|
859 return new WP_Error('create_user', __('Could not create user'), $signup); |
|
860 |
|
861 $now = current_time('mysql', true); |
|
862 |
|
863 if ( empty($signup->domain) ) { |
|
864 $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) ); |
|
865 |
|
866 if ( isset( $user_already_exists ) ) |
|
867 return new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup); |
|
868 |
|
869 wpmu_welcome_user_notification($user_id, $password, $meta); |
|
870 |
|
871 add_new_user_to_blog( $user_id, $user_email, $meta ); |
|
872 do_action('wpmu_activate_user', $user_id, $password, $meta); |
|
873 return array('user_id' => $user_id, 'password' => $password, 'meta' => $meta); |
|
874 } |
|
875 |
|
876 $blog_id = wpmu_create_blog( $signup->domain, $signup->path, $signup->title, $user_id, $meta, $wpdb->siteid ); |
|
877 |
|
878 // TODO: What to do if we create a user but cannot create a blog? |
|
879 if ( is_wp_error($blog_id) ) { |
|
880 // If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and |
|
881 // setting the activation flag. Let's just set the active flag and instruct the user to reset their password. |
|
882 if ( 'blog_taken' == $blog_id->get_error_code() ) { |
|
883 $blog_id->add_data( $signup ); |
|
884 $wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now ), array( 'activation_key' => $key ) ); |
|
885 } |
|
886 return $blog_id; |
|
887 } |
|
888 |
|
889 $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) ); |
|
890 wpmu_welcome_notification($blog_id, $user_id, $password, $signup->title, $meta); |
|
891 do_action('wpmu_activate_blog', $blog_id, $user_id, $password, $signup->title, $meta); |
|
892 |
|
893 return array('blog_id' => $blog_id, 'user_id' => $user_id, 'password' => $password, 'title' => $signup->title, 'meta' => $meta); |
|
894 } |
|
895 |
|
896 /** |
|
897 * Create a user. |
|
898 * |
|
899 * This function runs when a user self-registers as well as when |
|
900 * a Super Admin creates a new user. Hook to 'wpmu_new_user' for events |
|
901 * that should affect all new users, but only on Multisite (otherwise |
|
902 * use 'user_register'). |
|
903 * |
|
904 * @since MU |
|
905 * @uses wp_create_user() |
|
906 * |
|
907 * @param string $user_name The new user's login name. |
|
908 * @param string $password The new user's password. |
|
909 * @param string $email The new user's email address. |
|
910 * @return mixed Returns false on failure, or int $user_id on success |
|
911 */ |
|
912 function wpmu_create_user( $user_name, $password, $email) { |
|
913 $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); |
|
914 |
|
915 $user_id = wp_create_user( $user_name, $password, $email ); |
|
916 if ( is_wp_error($user_id) ) |
|
917 return false; |
|
918 |
|
919 // Newly created users have no roles or caps until they are added to a blog. |
|
920 delete_user_option( $user_id, 'capabilities' ); |
|
921 delete_user_option( $user_id, 'user_level' ); |
|
922 |
|
923 do_action( 'wpmu_new_user', $user_id ); |
|
924 |
|
925 return $user_id; |
|
926 } |
|
927 |
|
928 /** |
|
929 * Create a site. |
|
930 * |
|
931 * This function runs when a user self-registers a new site as well |
|
932 * as when a Super Admin creates a new site. Hook to 'wpmu_new_blog' |
|
933 * for events that should affect all new sites. |
|
934 * |
|
935 * On subdirectory installs, $domain is the same as the main site's |
|
936 * domain, and the path is the subdirectory name (eg 'example.com' |
|
937 * and '/blog1/'). On subdomain installs, $domain is the new subdomain + |
|
938 * root domain (eg 'blog1.example.com'), and $path is '/'. |
|
939 * |
|
940 * @since MU |
|
941 * @uses domain_exists() |
|
942 * @uses insert_blog() |
|
943 * @uses wp_install_defaults() |
|
944 * @uses add_user_to_blog() |
|
945 * |
|
946 * @param string $domain The new site's domain. |
|
947 * @param string $path The new site's path. |
|
948 * @param string $title The new site's title. |
|
949 * @param int $user_id The user ID of the new site's admin. |
|
950 * @param array $meta Optional. Used to set initial site options. |
|
951 * @param int $site_id Optional. Only relevant on multi-network installs. |
|
952 * @return mixed Returns WP_Error object on failure, int $blog_id on success |
|
953 */ |
|
954 function wpmu_create_blog($domain, $path, $title, $user_id, $meta = '', $site_id = 1) { |
|
955 $domain = preg_replace( '/\s+/', '', sanitize_user( $domain, true ) ); |
|
956 |
|
957 if ( is_subdomain_install() ) |
|
958 $domain = str_replace( '@', '', $domain ); |
|
959 |
|
960 $title = strip_tags( $title ); |
|
961 $user_id = (int) $user_id; |
|
962 |
|
963 if ( empty($path) ) |
|
964 $path = '/'; |
|
965 |
|
966 // Check if the domain has been used already. We should return an error message. |
|
967 if ( domain_exists($domain, $path, $site_id) ) |
|
968 return new WP_Error('blog_taken', __('Site already exists.')); |
|
969 |
|
970 if ( !defined('WP_INSTALLING') ) |
|
971 define( 'WP_INSTALLING', true ); |
|
972 |
|
973 if ( ! $blog_id = insert_blog($domain, $path, $site_id) ) |
|
974 return new WP_Error('insert_blog', __('Could not create site.')); |
|
975 |
|
976 switch_to_blog($blog_id); |
|
977 install_blog($blog_id, $title); |
|
978 wp_install_defaults($user_id); |
|
979 |
|
980 add_user_to_blog($blog_id, $user_id, 'administrator'); |
|
981 |
|
982 if ( is_array($meta) ) foreach ($meta as $key => $value) { |
|
983 if ( $key == 'public' || $key == 'archived' || $key == 'mature' || $key == 'spam' || $key == 'deleted' || $key == 'lang_id' ) |
|
984 update_blog_status( $blog_id, $key, $value ); |
|
985 else |
|
986 update_option( $key, $value ); |
|
987 } |
|
988 |
|
989 add_option( 'WPLANG', get_site_option( 'WPLANG' ) ); |
|
990 update_option( 'blog_public', (int)$meta['public'] ); |
|
991 |
|
992 if ( ! is_super_admin( $user_id ) && ! get_user_meta( $user_id, 'primary_blog', true ) ) |
|
993 update_user_meta( $user_id, 'primary_blog', $blog_id ); |
|
994 |
|
995 restore_current_blog(); |
|
996 do_action( 'wpmu_new_blog', $blog_id, $user_id, $domain, $path, $site_id, $meta ); |
|
997 |
|
998 return $blog_id; |
|
999 } |
|
1000 |
|
1001 /** |
|
1002 * Notifies the network admin that a new site has been activated. |
|
1003 * |
|
1004 * Filter 'newblog_notify_siteadmin' to change the content of |
|
1005 * the notification email. |
|
1006 * |
|
1007 * @since MU |
|
1008 * |
|
1009 * @param int $blog_id The new site's ID. |
|
1010 * @return bool |
|
1011 */ |
|
1012 function newblog_notify_siteadmin( $blog_id, $deprecated = '' ) { |
|
1013 if ( get_site_option( 'registrationnotification' ) != 'yes' ) |
|
1014 return false; |
|
1015 |
|
1016 $email = get_site_option( 'admin_email' ); |
|
1017 if ( is_email($email) == false ) |
|
1018 return false; |
|
1019 |
|
1020 $options_site_url = esc_url(network_admin_url('settings.php')); |
|
1021 |
|
1022 switch_to_blog( $blog_id ); |
|
1023 $blogname = get_option( 'blogname' ); |
|
1024 $siteurl = site_url(); |
|
1025 restore_current_blog(); |
|
1026 |
|
1027 $msg = sprintf( __( 'New Site: %1s |
|
1028 URL: %2s |
|
1029 Remote IP: %3s |
|
1030 |
|
1031 Disable these notifications: %4s' ), $blogname, $siteurl, $_SERVER['REMOTE_ADDR'], $options_site_url); |
|
1032 $msg = apply_filters( 'newblog_notify_siteadmin', $msg ); |
|
1033 |
|
1034 wp_mail( $email, sprintf( __( 'New Site Registration: %s' ), $siteurl ), $msg ); |
|
1035 return true; |
|
1036 } |
|
1037 |
|
1038 /** |
|
1039 * Notifies the network admin that a new user has been activated. |
|
1040 * |
|
1041 * Filter 'newuser_notify_siteadmin' to change the content of |
|
1042 * the notification email. |
|
1043 * |
|
1044 * @since MU |
|
1045 * @uses apply_filters() Filter newuser_notify_siteadmin to change the content of the email message |
|
1046 * |
|
1047 * @param int $user_id The new user's ID. |
|
1048 * @return bool |
|
1049 */ |
|
1050 function newuser_notify_siteadmin( $user_id ) { |
|
1051 if ( get_site_option( 'registrationnotification' ) != 'yes' ) |
|
1052 return false; |
|
1053 |
|
1054 $email = get_site_option( 'admin_email' ); |
|
1055 |
|
1056 if ( is_email($email) == false ) |
|
1057 return false; |
|
1058 |
|
1059 $user = new WP_User($user_id); |
|
1060 |
|
1061 $options_site_url = esc_url(network_admin_url('settings.php')); |
|
1062 $msg = sprintf(__('New User: %1s |
|
1063 Remote IP: %2s |
|
1064 |
|
1065 Disable these notifications: %3s'), $user->user_login, $_SERVER['REMOTE_ADDR'], $options_site_url); |
|
1066 |
|
1067 $msg = apply_filters( 'newuser_notify_siteadmin', $msg, $user ); |
|
1068 wp_mail( $email, sprintf(__('New User Registration: %s'), $user->user_login), $msg ); |
|
1069 return true; |
|
1070 } |
|
1071 |
|
1072 /** |
|
1073 * Check whether a blogname is already taken. |
|
1074 * |
|
1075 * Used during the new site registration process to ensure |
|
1076 * that each blogname is unique. |
|
1077 * |
|
1078 * @since MU |
|
1079 * |
|
1080 * @param string $domain The domain to be checked. |
|
1081 * @param string $path The path to be checked. |
|
1082 * @param int $site_id Optional. Relevant only on multi-network installs. |
|
1083 * @return int |
|
1084 */ |
|
1085 function domain_exists($domain, $path, $site_id = 1) { |
|
1086 global $wpdb; |
|
1087 return $wpdb->get_var( $wpdb->prepare("SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s AND site_id = %d", $domain, $path, $site_id) ); |
|
1088 } |
|
1089 |
|
1090 /** |
|
1091 * Store basic site info in the blogs table. |
|
1092 * |
|
1093 * This function creates a row in the wp_blogs table and returns |
|
1094 * the new blog's ID. It is the first step in creating a new blog. |
|
1095 * |
|
1096 * @since MU |
|
1097 * |
|
1098 * @param string $domain The domain of the new site. |
|
1099 * @param string $path The path of the new site. |
|
1100 * @param int $site_id Unless you're running a multi-network install, be sure to set this value to 1. |
|
1101 * @return int The ID of the new row |
|
1102 */ |
|
1103 function insert_blog($domain, $path, $site_id) { |
|
1104 global $wpdb; |
|
1105 |
|
1106 $path = trailingslashit($path); |
|
1107 $site_id = (int) $site_id; |
|
1108 |
|
1109 $result = $wpdb->insert( $wpdb->blogs, array('site_id' => $site_id, 'domain' => $domain, 'path' => $path, 'registered' => current_time('mysql')) ); |
|
1110 if ( ! $result ) |
|
1111 return false; |
|
1112 |
|
1113 refresh_blog_details($wpdb->insert_id); |
|
1114 return $wpdb->insert_id; |
|
1115 } |
|
1116 |
|
1117 /** |
|
1118 * Install an empty blog. |
|
1119 * |
|
1120 * Creates the new blog tables and options. If calling this function |
|
1121 * directly, be sure to use switch_to_blog() first, so that $wpdb |
|
1122 * points to the new blog. |
|
1123 * |
|
1124 * @since MU |
|
1125 * @uses make_db_current_silent() |
|
1126 * @uses populate_roles() |
|
1127 * |
|
1128 * @param int $blog_id The value returned by insert_blog(). |
|
1129 * @param string $blog_title The title of the new site. |
|
1130 */ |
|
1131 function install_blog($blog_id, $blog_title = '') { |
|
1132 global $wpdb, $table_prefix, $wp_roles; |
|
1133 $wpdb->suppress_errors(); |
|
1134 |
|
1135 // Cast for security |
|
1136 $blog_id = (int) $blog_id; |
|
1137 |
|
1138 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); |
|
1139 |
|
1140 if ( $wpdb->get_results("SELECT ID FROM $wpdb->posts") ) |
|
1141 die(__('<h1>Already Installed</h1><p>You appear to have already installed WordPress. To reinstall please clear your old database tables first.</p>') . '</body></html>'); |
|
1142 |
|
1143 $wpdb->suppress_errors(false); |
|
1144 |
|
1145 $url = get_blogaddress_by_id($blog_id); |
|
1146 |
|
1147 // Set everything up |
|
1148 make_db_current_silent( 'blog' ); |
|
1149 populate_options(); |
|
1150 populate_roles(); |
|
1151 $wp_roles->_init(); |
|
1152 |
|
1153 // fix url. |
|
1154 update_option('siteurl', $url); |
|
1155 update_option('home', $url); |
|
1156 update_option('fileupload_url', $url . "files" ); |
|
1157 update_option('upload_path', UPLOADBLOGSDIR . "/$blog_id/files"); |
|
1158 update_option('blogname', stripslashes( $blog_title ) ); |
|
1159 update_option('admin_email', ''); |
|
1160 $wpdb->update( $wpdb->options, array('option_value' => ''), array('option_name' => 'admin_email') ); |
|
1161 |
|
1162 // remove all perms |
|
1163 $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => $table_prefix.'user_level' ) ); |
|
1164 |
|
1165 $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => $table_prefix.'capabilities' ) ); |
|
1166 |
|
1167 $wpdb->suppress_errors( false ); |
|
1168 } |
|
1169 |
|
1170 /** |
|
1171 * Set blog defaults. |
|
1172 * |
|
1173 * This function creates a row in the wp_blogs table. |
|
1174 * |
|
1175 * @since MU |
|
1176 * @deprecated MU |
|
1177 * @deprecated Use wp_install_defaults() |
|
1178 * @uses wp_install_defaults() |
|
1179 * |
|
1180 * @param int $blog_id Ignored in this function. |
|
1181 * @param int $user_id |
|
1182 */ |
|
1183 function install_blog_defaults($blog_id, $user_id) { |
|
1184 global $wpdb; |
|
1185 |
|
1186 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); |
|
1187 |
|
1188 $wpdb->suppress_errors(); |
|
1189 |
|
1190 wp_install_defaults($user_id); |
|
1191 |
|
1192 $wpdb->suppress_errors( false ); |
|
1193 } |
|
1194 |
|
1195 /** |
|
1196 * Notify a user that her blog activation has been successful. |
|
1197 * |
|
1198 * Filter 'wpmu_welcome_notification' to disable or bypass. |
|
1199 * |
|
1200 * Filter 'update_welcome_email' and 'update_welcome_subject' to |
|
1201 * modify the content and subject line of the notification email. |
|
1202 * |
|
1203 * @since MU |
|
1204 * |
|
1205 * @param int $blog_id |
|
1206 * @param int $user_id |
|
1207 * @param string $password |
|
1208 * @param string $title The new blog's title |
|
1209 * @param array $meta Optional. Not used in the default function, but is passed along to hooks for customization. |
|
1210 * @return bool |
|
1211 */ |
|
1212 function wpmu_welcome_notification($blog_id, $user_id, $password, $title, $meta = '') { |
|
1213 global $current_site; |
|
1214 |
|
1215 if ( !apply_filters('wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta) ) |
|
1216 return false; |
|
1217 |
|
1218 $welcome_email = stripslashes( get_site_option( 'welcome_email' ) ); |
|
1219 if ( $welcome_email == false ) |
|
1220 $welcome_email = stripslashes( __( 'Dear User, |
|
1221 |
|
1222 Your new SITE_NAME site has been successfully set up at: |
|
1223 BLOG_URL |
|
1224 |
|
1225 You can log in to the administrator account with the following information: |
|
1226 Username: USERNAME |
|
1227 Password: PASSWORD |
|
1228 Log in here: BLOG_URLwp-login.php |
|
1229 |
|
1230 We hope you enjoy your new site. Thanks! |
|
1231 |
|
1232 --The Team @ SITE_NAME' ) ); |
|
1233 |
|
1234 $url = get_blogaddress_by_id($blog_id); |
|
1235 $user = new WP_User($user_id); |
|
1236 |
|
1237 $welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email ); |
|
1238 $welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email ); |
|
1239 $welcome_email = str_replace( 'BLOG_URL', $url, $welcome_email ); |
|
1240 $welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email ); |
|
1241 $welcome_email = str_replace( 'PASSWORD', $password, $welcome_email ); |
|
1242 |
|
1243 $welcome_email = apply_filters( 'update_welcome_email', $welcome_email, $blog_id, $user_id, $password, $title, $meta); |
|
1244 $admin_email = get_site_option( 'admin_email' ); |
|
1245 |
|
1246 if ( $admin_email == '' ) |
|
1247 $admin_email = 'support@' . $_SERVER['SERVER_NAME']; |
|
1248 |
|
1249 $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); |
|
1250 $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; |
|
1251 $message = $welcome_email; |
|
1252 |
|
1253 if ( empty( $current_site->site_name ) ) |
|
1254 $current_site->site_name = 'WordPress'; |
|
1255 |
|
1256 $subject = apply_filters( 'update_welcome_subject', sprintf(__('New %1$s Site: %2$s'), $current_site->site_name, stripslashes( $title ) ) ); |
|
1257 wp_mail($user->user_email, $subject, $message, $message_headers); |
|
1258 return true; |
|
1259 } |
|
1260 |
|
1261 /** |
|
1262 * Notify a user that her account activation has been successful. |
|
1263 * |
|
1264 * Filter 'wpmu_welcome_user_notification' to disable or bypass. |
|
1265 * |
|
1266 * Filter 'update_welcome_user_email' and 'update_welcome_user_subject' to |
|
1267 * modify the content and subject line of the notification email. |
|
1268 * |
|
1269 * @since MU |
|
1270 * |
|
1271 * @param int $user_id |
|
1272 * @param string $password |
|
1273 * @param array $meta Optional. Not used in the default function, but is passed along to hooks for customization. |
|
1274 * @return bool |
|
1275 */ |
|
1276 function wpmu_welcome_user_notification($user_id, $password, $meta = '') { |
|
1277 global $current_site; |
|
1278 |
|
1279 if ( !apply_filters('wpmu_welcome_user_notification', $user_id, $password, $meta) ) |
|
1280 return false; |
|
1281 |
|
1282 $welcome_email = get_site_option( 'welcome_user_email' ); |
|
1283 |
|
1284 $user = new WP_User($user_id); |
|
1285 |
|
1286 $welcome_email = apply_filters( 'update_welcome_user_email', $welcome_email, $user_id, $password, $meta); |
|
1287 $welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email ); |
|
1288 $welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email ); |
|
1289 $welcome_email = str_replace( 'PASSWORD', $password, $welcome_email ); |
|
1290 $welcome_email = str_replace( 'LOGINLINK', wp_login_url(), $welcome_email ); |
|
1291 |
|
1292 $admin_email = get_site_option( 'admin_email' ); |
|
1293 |
|
1294 if ( $admin_email == '' ) |
|
1295 $admin_email = 'support@' . $_SERVER['SERVER_NAME']; |
|
1296 |
|
1297 $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); |
|
1298 $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; |
|
1299 $message = $welcome_email; |
|
1300 |
|
1301 if ( empty( $current_site->site_name ) ) |
|
1302 $current_site->site_name = 'WordPress'; |
|
1303 |
|
1304 $subject = apply_filters( 'update_welcome_user_subject', sprintf(__('New %1$s User: %2$s'), $current_site->site_name, $user->user_login) ); |
|
1305 wp_mail($user->user_email, $subject, $message, $message_headers); |
|
1306 return true; |
|
1307 } |
|
1308 |
|
1309 /** |
|
1310 * Get the current site info. |
|
1311 * |
|
1312 * Returns an object containing the ID, domain, path, and site_name |
|
1313 * of the site being viewed. |
|
1314 * |
|
1315 * @since MU |
|
1316 * |
|
1317 * @return object |
|
1318 */ |
|
1319 function get_current_site() { |
|
1320 global $current_site; |
|
1321 return $current_site; |
|
1322 } |
|
1323 |
|
1324 /** |
|
1325 * Get a numeric user ID from either an email address or a login. |
|
1326 * |
|
1327 * @since MU |
|
1328 * @uses is_email() |
|
1329 * |
|
1330 * @param string $string |
|
1331 * @return int |
|
1332 */ |
|
1333 function get_user_id_from_string( $string ) { |
|
1334 $user_id = 0; |
|
1335 if ( is_email( $string ) ) { |
|
1336 $user = get_user_by('email', $string); |
|
1337 if ( $user ) |
|
1338 $user_id = $user->ID; |
|
1339 } elseif ( is_numeric( $string ) ) { |
|
1340 $user_id = $string; |
|
1341 } else { |
|
1342 $user = get_user_by('login', $string); |
|
1343 if ( $user ) |
|
1344 $user_id = $user->ID; |
|
1345 } |
|
1346 |
|
1347 return $user_id; |
|
1348 } |
|
1349 |
|
1350 /** |
|
1351 * Get a user's most recent post. |
|
1352 * |
|
1353 * Walks through each of a user's blogs to find the post with |
|
1354 * the most recent post_date_gmt. |
|
1355 * |
|
1356 * @since MU |
|
1357 * @uses get_blogs_of_user() |
|
1358 * |
|
1359 * @param int $user_id |
|
1360 * @return array Contains the blog_id, post_id, post_date_gmt, and post_gmt_ts |
|
1361 */ |
|
1362 function get_most_recent_post_of_user( $user_id ) { |
|
1363 global $wpdb; |
|
1364 |
|
1365 $user_blogs = get_blogs_of_user( (int) $user_id ); |
|
1366 $most_recent_post = array(); |
|
1367 |
|
1368 // Walk through each blog and get the most recent post |
|
1369 // published by $user_id |
|
1370 foreach ( (array) $user_blogs as $blog ) { |
|
1371 $prefix = $wpdb->get_blog_prefix( $blog->userblog_id ); |
|
1372 $recent_post = $wpdb->get_row( $wpdb->prepare("SELECT ID, post_date_gmt FROM {$prefix}posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1", $user_id ), ARRAY_A); |
|
1373 |
|
1374 // Make sure we found a post |
|
1375 if ( isset($recent_post['ID']) ) { |
|
1376 $post_gmt_ts = strtotime($recent_post['post_date_gmt']); |
|
1377 |
|
1378 // If this is the first post checked or if this post is |
|
1379 // newer than the current recent post, make it the new |
|
1380 // most recent post. |
|
1381 if ( !isset($most_recent_post['post_gmt_ts']) || ( $post_gmt_ts > $most_recent_post['post_gmt_ts'] ) ) { |
|
1382 $most_recent_post = array( |
|
1383 'blog_id' => $blog->userblog_id, |
|
1384 'post_id' => $recent_post['ID'], |
|
1385 'post_date_gmt' => $recent_post['post_date_gmt'], |
|
1386 'post_gmt_ts' => $post_gmt_ts |
|
1387 ); |
|
1388 } |
|
1389 } |
|
1390 } |
|
1391 |
|
1392 return $most_recent_post; |
|
1393 } |
|
1394 |
|
1395 // Misc functions |
|
1396 |
|
1397 /** |
|
1398 * Get the size of a directory. |
|
1399 * |
|
1400 * A helper function that is used primarily to check whether |
|
1401 * a blog has exceeded its allowed upload space. |
|
1402 * |
|
1403 * @since MU |
|
1404 * @uses recurse_dirsize() |
|
1405 * |
|
1406 * @param string $directory |
|
1407 * @return int |
|
1408 */ |
|
1409 function get_dirsize( $directory ) { |
|
1410 $dirsize = get_transient( 'dirsize_cache' ); |
|
1411 if ( is_array( $dirsize ) && isset( $dirsize[ $directory ][ 'size' ] ) ) |
|
1412 return $dirsize[ $directory ][ 'size' ]; |
|
1413 |
|
1414 if ( false == is_array( $dirsize ) ) |
|
1415 $dirsize = array(); |
|
1416 |
|
1417 $dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory ); |
|
1418 |
|
1419 set_transient( 'dirsize_cache', $dirsize, 3600 ); |
|
1420 return $dirsize[ $directory ][ 'size' ]; |
|
1421 } |
|
1422 |
|
1423 /** |
|
1424 * Get the size of a directory recursively. |
|
1425 * |
|
1426 * Used by get_dirsize() to get a directory's size when it contains |
|
1427 * other directories. |
|
1428 * |
|
1429 * @since MU |
|
1430 * |
|
1431 * @param string $directory |
|
1432 * @return int |
|
1433 */ |
|
1434 function recurse_dirsize( $directory ) { |
|
1435 $size = 0; |
|
1436 |
|
1437 $directory = untrailingslashit( $directory ); |
|
1438 |
|
1439 if ( !file_exists($directory) || !is_dir( $directory ) || !is_readable( $directory ) ) |
|
1440 return false; |
|
1441 |
|
1442 if ($handle = opendir($directory)) { |
|
1443 while(($file = readdir($handle)) !== false) { |
|
1444 $path = $directory.'/'.$file; |
|
1445 if ($file != '.' && $file != '..') { |
|
1446 if (is_file($path)) { |
|
1447 $size += filesize($path); |
|
1448 } elseif (is_dir($path)) { |
|
1449 $handlesize = recurse_dirsize($path); |
|
1450 if ($handlesize > 0) |
|
1451 $size += $handlesize; |
|
1452 } |
|
1453 } |
|
1454 } |
|
1455 closedir($handle); |
|
1456 } |
|
1457 return $size; |
|
1458 } |
|
1459 |
|
1460 /** |
|
1461 * Check whether a blog has used its allotted upload space. |
|
1462 * |
|
1463 * @since MU |
|
1464 * @uses get_dirsize() |
|
1465 * |
|
1466 * @param bool $echo Optional. If $echo is set and the quota is exceeded, a warning message is echoed. Default is true. |
|
1467 * @return int |
|
1468 */ |
|
1469 function upload_is_user_over_quota( $echo = true ) { |
|
1470 if ( get_site_option( 'upload_space_check_disabled' ) ) |
|
1471 return false; |
|
1472 |
|
1473 $spaceAllowed = get_space_allowed(); |
|
1474 if ( empty( $spaceAllowed ) || !is_numeric( $spaceAllowed ) ) |
|
1475 $spaceAllowed = 10; // Default space allowed is 10 MB |
|
1476 |
|
1477 $size = get_dirsize( BLOGUPLOADDIR ) / 1024 / 1024; |
|
1478 |
|
1479 if ( ($spaceAllowed-$size) < 0 ) { |
|
1480 if ( $echo ) |
|
1481 _e( 'Sorry, you have used your space allocation. Please delete some files to upload more files.' ); // No space left |
|
1482 return true; |
|
1483 } else { |
|
1484 return false; |
|
1485 } |
|
1486 } |
|
1487 |
|
1488 /** |
|
1489 * Check an array of MIME types against a whitelist. |
|
1490 * |
|
1491 * WordPress ships with a set of allowed upload filetypes, |
|
1492 * which is defined in wp-includes/functions.php in |
|
1493 * get_allowed_mime_types(). This function is used to filter |
|
1494 * that list against the filetype whitelist provided by Multisite |
|
1495 * Super Admins at wp-admin/network/settings.php. |
|
1496 * |
|
1497 * @since MU |
|
1498 * |
|
1499 * @param array $mimes |
|
1500 * @return array |
|
1501 */ |
|
1502 function check_upload_mimes( $mimes ) { |
|
1503 $site_exts = explode( ' ', get_site_option( 'upload_filetypes' ) ); |
|
1504 foreach ( $site_exts as $ext ) { |
|
1505 foreach ( $mimes as $ext_pattern => $mime ) { |
|
1506 if ( $ext != '' && strpos( $ext_pattern, $ext ) !== false ) |
|
1507 $site_mimes[$ext_pattern] = $mime; |
|
1508 } |
|
1509 } |
|
1510 return $site_mimes; |
|
1511 } |
|
1512 |
|
1513 /** |
|
1514 * Update a blog's post count. |
|
1515 * |
|
1516 * WordPress MS stores a blog's post count as an option so as |
|
1517 * to avoid extraneous COUNTs when a blog's details are fetched |
|
1518 * with get_blog_details(). This function is called when posts |
|
1519 * are published to make sure the count stays current. |
|
1520 * |
|
1521 * @since MU |
|
1522 */ |
|
1523 function update_posts_count( $deprecated = '' ) { |
|
1524 global $wpdb; |
|
1525 update_option( 'post_count', (int) $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status = 'publish' and post_type = 'post'" ) ); |
|
1526 } |
|
1527 |
|
1528 /** |
|
1529 * Logs user registrations. |
|
1530 * |
|
1531 * @since MU |
|
1532 * |
|
1533 * @param int $blog_id |
|
1534 * @param int $user_id |
|
1535 */ |
|
1536 function wpmu_log_new_registrations( $blog_id, $user_id ) { |
|
1537 global $wpdb; |
|
1538 $user = new WP_User( (int) $user_id ); |
|
1539 $wpdb->insert( $wpdb->registration_log, array('email' => $user->user_email, 'IP' => preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] ), 'blog_id' => $blog_id, 'date_registered' => current_time('mysql')) ); |
|
1540 } |
|
1541 |
|
1542 /** |
|
1543 * Get the remaining upload space for this blog. |
|
1544 * |
|
1545 * @since MU |
|
1546 * @uses upload_is_user_over_quota() |
|
1547 * @uses get_space_allowed() |
|
1548 * @uses get_dirsize() |
|
1549 * |
|
1550 * @param int $size |
|
1551 * @return int |
|
1552 */ |
|
1553 function fix_import_form_size( $size ) { |
|
1554 if ( upload_is_user_over_quota( false ) == true ) |
|
1555 return 0; |
|
1556 |
|
1557 $spaceAllowed = 1024 * 1024 * get_space_allowed(); |
|
1558 $dirsize = get_dirsize( BLOGUPLOADDIR ); |
|
1559 if ( $size > $spaceAllowed - $dirsize ) |
|
1560 return $spaceAllowed - $dirsize; // remaining space |
|
1561 else |
|
1562 return $size; // default |
|
1563 } |
|
1564 |
|
1565 /** |
|
1566 * Maintains a canonical list of terms by syncing terms created for each blog with the global terms table. |
|
1567 * |
|
1568 * @since 3.0.0 |
|
1569 * |
|
1570 * @see term_id_filter |
|
1571 * |
|
1572 * @param int $term_id An ID for a term on the current blog. |
|
1573 * @return int An ID from the global terms table mapped from $term_id. |
|
1574 */ |
|
1575 function global_terms( $term_id, $deprecated = '' ) { |
|
1576 global $wpdb; |
|
1577 static $global_terms_recurse = null; |
|
1578 |
|
1579 if ( !global_terms_enabled() ) |
|
1580 return $term_id; |
|
1581 |
|
1582 // prevent a race condition |
|
1583 $recurse_start = false; |
|
1584 if ( $global_terms_recurse === null ) { |
|
1585 $recurse_start = true; |
|
1586 $global_terms_recurse = 1; |
|
1587 } elseif ( 10 < $global_terms_recurse++ ) { |
|
1588 return $term_id; |
|
1589 } |
|
1590 |
|
1591 $term_id = intval( $term_id ); |
|
1592 $c = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->terms WHERE term_id = %d", $term_id ) ); |
|
1593 |
|
1594 $global_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s", $c->slug ) ); |
|
1595 if ( $global_id == null ) { |
|
1596 $used_global_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM $wpdb->sitecategories WHERE cat_ID = %d", $c->term_id ) ); |
|
1597 if ( null == $used_global_id ) { |
|
1598 $wpdb->insert( $wpdb->sitecategories, array( 'cat_ID' => $term_id, 'cat_name' => $c->name, 'category_nicename' => $c->slug ) ); |
|
1599 $global_id = $wpdb->insert_id; |
|
1600 if ( empty( $global_id ) ) |
|
1601 return $term_id; |
|
1602 } else { |
|
1603 $max_global_id = $wpdb->get_var( "SELECT MAX(cat_ID) FROM $wpdb->sitecategories" ); |
|
1604 $max_local_id = $wpdb->get_var( "SELECT MAX(term_id) FROM $wpdb->terms" ); |
|
1605 $new_global_id = max( $max_global_id, $max_local_id ) + mt_rand( 100, 400 ); |
|
1606 $wpdb->insert( $wpdb->sitecategories, array( 'cat_ID' => $new_global_id, 'cat_name' => $c->name, 'category_nicename' => $c->slug ) ); |
|
1607 $global_id = $wpdb->insert_id; |
|
1608 } |
|
1609 } elseif ( $global_id != $term_id ) { |
|
1610 $local_id = $wpdb->get_row( $wpdb->prepare( "SELECT term_id FROM $wpdb->terms WHERE term_id = %d", $global_id ) ); |
|
1611 if ( null != $local_id ) |
|
1612 $local_id = global_terms( $local_id ); |
|
1613 if ( 10 < $global_terms_recurse ) |
|
1614 $global_id = $term_id; |
|
1615 } |
|
1616 |
|
1617 if ( $global_id != $term_id ) { |
|
1618 if ( get_option( 'default_category' ) == $term_id ) |
|
1619 update_option( 'default_category', $global_id ); |
|
1620 |
|
1621 $wpdb->update( $wpdb->terms, array('term_id' => $global_id), array('term_id' => $term_id) ); |
|
1622 $wpdb->update( $wpdb->term_taxonomy, array('term_id' => $global_id), array('term_id' => $term_id) ); |
|
1623 $wpdb->update( $wpdb->term_taxonomy, array('parent' => $global_id), array('parent' => $term_id) ); |
|
1624 |
|
1625 clean_term_cache($term_id); |
|
1626 } |
|
1627 if( $recurse_start ) |
|
1628 $global_terms_recurse = null; |
|
1629 |
|
1630 return $global_id; |
|
1631 } |
|
1632 |
|
1633 /** |
|
1634 * Ensure that the current site's domain is listed in the allowed redirect host list. |
|
1635 * |
|
1636 * @see wp_validate_redirect() |
|
1637 * @since MU |
|
1638 * |
|
1639 * @return array The current site's domain |
|
1640 */ |
|
1641 function redirect_this_site( $deprecated = '' ) { |
|
1642 global $current_site; |
|
1643 return array( $current_site->domain ); |
|
1644 } |
|
1645 |
|
1646 /** |
|
1647 * Check whether an upload is too big. |
|
1648 * |
|
1649 * @since MU |
|
1650 * |
|
1651 * @param array $upload |
|
1652 * @return mixed If the upload is under the size limit, $upload is returned. Otherwise returns an error message. |
|
1653 */ |
|
1654 function upload_is_file_too_big( $upload ) { |
|
1655 if ( is_array( $upload ) == false || defined( 'WP_IMPORTING' ) ) |
|
1656 return $upload; |
|
1657 |
|
1658 if ( strlen( $upload['bits'] ) > ( 1024 * get_site_option( 'fileupload_maxk', 1500 ) ) ) |
|
1659 return sprintf( __( 'This file is too big. Files must be less than %d KB in size.' ) . '<br />', get_site_option( 'fileupload_maxk', 1500 )); |
|
1660 |
|
1661 return $upload; |
|
1662 } |
|
1663 |
|
1664 /** |
|
1665 * Add a nonce field to the signup page. |
|
1666 * |
|
1667 * @since MU |
|
1668 * @uses wp_nonce_field() |
|
1669 */ |
|
1670 function signup_nonce_fields() { |
|
1671 $id = mt_rand(); |
|
1672 echo "<input type='hidden' name='signup_form_id' value='{$id}' />"; |
|
1673 wp_nonce_field('signup_form_' . $id, '_signup_form', false); |
|
1674 } |
|
1675 |
|
1676 /** |
|
1677 * Process the signup nonce created in signup_nonce_fields(). |
|
1678 * |
|
1679 * @since MU |
|
1680 * @uses wp_create_nonce() |
|
1681 * |
|
1682 * @param array $result |
|
1683 * @return array |
|
1684 */ |
|
1685 function signup_nonce_check( $result ) { |
|
1686 if ( !strpos( $_SERVER[ 'PHP_SELF' ], 'wp-signup.php' ) ) |
|
1687 return $result; |
|
1688 |
|
1689 if ( wp_create_nonce('signup_form_' . $_POST[ 'signup_form_id' ]) != $_POST['_signup_form'] ) |
|
1690 wp_die( __('Please try again!') ); |
|
1691 |
|
1692 return $result; |
|
1693 } |
|
1694 |
|
1695 /** |
|
1696 * Correct 404 redirects when NOBLOGREDIRECT is defined. |
|
1697 * |
|
1698 * @since MU |
|
1699 */ |
|
1700 function maybe_redirect_404() { |
|
1701 global $current_site; |
|
1702 if ( is_main_site() && is_404() && defined( 'NOBLOGREDIRECT' ) && ( $destination = apply_filters( 'blog_redirect_404', NOBLOGREDIRECT ) ) ) { |
|
1703 if ( $destination == '%siteurl%' ) |
|
1704 $destination = network_home_url(); |
|
1705 wp_redirect( $destination ); |
|
1706 exit(); |
|
1707 } |
|
1708 } |
|
1709 |
|
1710 /** |
|
1711 * Add a new user to a blog by visiting /newbloguser/username/. |
|
1712 * |
|
1713 * This will only work when the user's details are saved as an option |
|
1714 * keyed as 'new_user_x', where 'x' is the username of the user to be |
|
1715 * added, as when a user is invited through the regular WP Add User interface. |
|
1716 * |
|
1717 * @since MU |
|
1718 * @uses add_existing_user_to_blog() |
|
1719 */ |
|
1720 function maybe_add_existing_user_to_blog() { |
|
1721 if ( false === strpos( $_SERVER[ 'REQUEST_URI' ], '/newbloguser/' ) ) |
|
1722 return false; |
|
1723 |
|
1724 $parts = explode( '/', $_SERVER[ 'REQUEST_URI' ] ); |
|
1725 $key = array_pop( $parts ); |
|
1726 |
|
1727 if ( $key == '' ) |
|
1728 $key = array_pop( $parts ); |
|
1729 |
|
1730 $details = get_option( 'new_user_' . $key ); |
|
1731 if ( !empty( $details ) ) |
|
1732 delete_option( 'new_user_' . $key ); |
|
1733 |
|
1734 if ( empty( $details ) || is_wp_error( add_existing_user_to_blog( $details ) ) ) |
|
1735 wp_die( sprintf(__('An error occurred adding you to this site. Back to the <a href="%s">homepage</a>.'), home_url() ) ); |
|
1736 |
|
1737 wp_die( sprintf(__('You have been added to this site. Please visit the <a href="%s">homepage</a> or <a href="%s">log in</a> using your username and password.'), home_url(), admin_url() ), __('Success') ); |
|
1738 } |
|
1739 |
|
1740 /** |
|
1741 * Add a user to a blog based on details from maybe_add_existing_user_to_blog(). |
|
1742 * |
|
1743 * @since MU |
|
1744 * @uses add_user_to_blog() |
|
1745 * |
|
1746 * @param array $details |
|
1747 */ |
|
1748 function add_existing_user_to_blog( $details = false ) { |
|
1749 global $blog_id; |
|
1750 |
|
1751 if ( is_array( $details ) ) { |
|
1752 $result = add_user_to_blog( $blog_id, $details[ 'user_id' ], $details[ 'role' ] ); |
|
1753 do_action( 'added_existing_user', $details[ 'user_id' ], $result ); |
|
1754 } |
|
1755 return $result; |
|
1756 } |
|
1757 |
|
1758 /** |
|
1759 * Add a newly created user to the appropriate blog |
|
1760 * |
|
1761 * @since MU |
|
1762 * |
|
1763 * @param int $user_id |
|
1764 * @param string $email |
|
1765 * @param array $meta |
|
1766 */ |
|
1767 function add_new_user_to_blog( $user_id, $email, $meta ) { |
|
1768 global $current_site; |
|
1769 if ( !empty( $meta[ 'add_to_blog' ] ) ) { |
|
1770 $blog_id = $meta[ 'add_to_blog' ]; |
|
1771 $role = $meta[ 'new_role' ]; |
|
1772 remove_user_from_blog($user_id, $current_site->blog_id); // remove user from main blog. |
|
1773 add_user_to_blog( $blog_id, $user_id, $role ); |
|
1774 update_user_meta( $user_id, 'primary_blog', $blog_id ); |
|
1775 } |
|
1776 } |
|
1777 |
|
1778 /** |
|
1779 * Correct From host on outgoing mail to match the site domain |
|
1780 * |
|
1781 * @since MU |
|
1782 */ |
|
1783 function fix_phpmailer_messageid( $phpmailer ) { |
|
1784 global $current_site; |
|
1785 $phpmailer->Hostname = $current_site->domain; |
|
1786 } |
|
1787 |
|
1788 /** |
|
1789 * Check to see whether a user is marked as a spammer, based on username |
|
1790 * |
|
1791 * @since MU |
|
1792 * @uses get_current_user_id() |
|
1793 * @uses get_user_id_from_string() |
|
1794 * |
|
1795 * @param string $username |
|
1796 * @return bool |
|
1797 */ |
|
1798 function is_user_spammy( $username = 0 ) { |
|
1799 if ( $username == 0 ) { |
|
1800 $user_id = get_current_user_id(); |
|
1801 } else { |
|
1802 $user_id = get_user_id_from_string( $username ); |
|
1803 } |
|
1804 $u = new WP_User( $user_id ); |
|
1805 |
|
1806 return ( isset( $u->spam ) && $u->spam == 1 ); |
|
1807 } |
|
1808 |
|
1809 /** |
|
1810 * Update this blog's 'public' setting in the global blogs table. |
|
1811 * |
|
1812 * Public blogs have a setting of 1, private blogs are 0. |
|
1813 * |
|
1814 * @since MU |
|
1815 * @uses update_blog_status() |
|
1816 * |
|
1817 * @param int $old_value |
|
1818 * @param int $value The new public value |
|
1819 * @return bool |
|
1820 */ |
|
1821 function update_blog_public( $old_value, $value ) { |
|
1822 global $wpdb; |
|
1823 do_action('update_blog_public'); |
|
1824 update_blog_status( $wpdb->blogid, 'public', (int) $value ); |
|
1825 } |
|
1826 add_action('update_option_blog_public', 'update_blog_public', 10, 2); |
|
1827 |
|
1828 /** |
|
1829 * Get the "dashboard blog", the blog where users without a blog edit their profile data. |
|
1830 * |
|
1831 * @since MU |
|
1832 * @uses get_blog_details() |
|
1833 * |
|
1834 * @return int |
|
1835 */ |
|
1836 function get_dashboard_blog() { |
|
1837 if ( $blog = get_site_option( 'dashboard_blog' ) ) |
|
1838 return get_blog_details( $blog ); |
|
1839 |
|
1840 return get_blog_details( $GLOBALS['current_site']->blog_id ); |
|
1841 } |
|
1842 |
|
1843 /** |
|
1844 * Check whether a usermeta key has to do with the current blog. |
|
1845 * |
|
1846 * @since MU |
|
1847 * @uses wp_get_current_user() |
|
1848 * |
|
1849 * @param string $key |
|
1850 * @param int $user_id Optional. Defaults to current user. |
|
1851 * @param int $blog_id Optional. Defaults to current blog. |
|
1852 * @return bool |
|
1853 */ |
|
1854 function is_user_option_local( $key, $user_id = 0, $blog_id = 0 ) { |
|
1855 global $wpdb; |
|
1856 |
|
1857 $current_user = wp_get_current_user(); |
|
1858 if ( $user_id == 0 ) |
|
1859 $user_id = $current_user->ID; |
|
1860 if ( $blog_id == 0 ) |
|
1861 $blog_id = $wpdb->blogid; |
|
1862 |
|
1863 $local_key = $wpdb->get_blog_prefix( $blog_id ) . $key; |
|
1864 |
|
1865 if ( isset( $current_user->$local_key ) ) |
|
1866 return true; |
|
1867 |
|
1868 return false; |
|
1869 } |
|
1870 |
|
1871 /** |
|
1872 * Check whether users can self-register, based on Network settings. |
|
1873 * |
|
1874 * @since MU |
|
1875 * |
|
1876 * @return bool |
|
1877 */ |
|
1878 function users_can_register_signup_filter() { |
|
1879 $registration = get_site_option('registration'); |
|
1880 if ( $registration == 'all' || $registration == 'user' ) |
|
1881 return true; |
|
1882 |
|
1883 return false; |
|
1884 } |
|
1885 add_filter('option_users_can_register', 'users_can_register_signup_filter'); |
|
1886 |
|
1887 /** |
|
1888 * Ensure that the welcome message is not empty. Currently unused. |
|
1889 * |
|
1890 * @since MU |
|
1891 * |
|
1892 * @param string $text |
|
1893 * @return string |
|
1894 */ |
|
1895 function welcome_user_msg_filter( $text ) { |
|
1896 if ( !$text ) { |
|
1897 remove_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' ); |
|
1898 $text = __( 'Dear User, |
|
1899 |
|
1900 Your new account is set up. |
|
1901 |
|
1902 You can log in with the following information: |
|
1903 Username: USERNAME |
|
1904 Password: PASSWORD |
|
1905 LOGINLINK |
|
1906 |
|
1907 Thanks! |
|
1908 |
|
1909 --The Team @ SITE_NAME' ); |
|
1910 update_site_option( 'welcome_user_email', $text ); |
|
1911 } |
|
1912 return $text; |
|
1913 } |
|
1914 add_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' ); |
|
1915 |
|
1916 /** |
|
1917 * Whether to force SSL on content. |
|
1918 * |
|
1919 * @since 2.8.5 |
|
1920 * |
|
1921 * @param string|bool $force |
|
1922 * @return bool True if forced, false if not forced. |
|
1923 */ |
|
1924 function force_ssl_content( $force = '' ) { |
|
1925 static $forced_content; |
|
1926 |
|
1927 if ( '' != $force ) { |
|
1928 $old_forced = $forced_content; |
|
1929 $forced_content = $force; |
|
1930 return $old_forced; |
|
1931 } |
|
1932 |
|
1933 return $forced_content; |
|
1934 } |
|
1935 |
|
1936 /** |
|
1937 * Formats an String URL to use HTTPS if HTTP is found. |
|
1938 * Useful as a filter. |
|
1939 * |
|
1940 * @since 2.8.5 |
|
1941 **/ |
|
1942 function filter_SSL( $url ) { |
|
1943 if ( !is_string( $url ) ) |
|
1944 return get_bloginfo( 'url' ); //return home blog url with proper scheme |
|
1945 |
|
1946 $arrURL = parse_url( $url ); |
|
1947 |
|
1948 if ( force_ssl_content() && is_ssl() ) { |
|
1949 if ( 'http' === $arrURL['scheme'] ) |
|
1950 $url = str_replace( $arrURL['scheme'], 'https', $url ); |
|
1951 } |
|
1952 |
|
1953 return $url; |
|
1954 } |
|
1955 |
|
1956 /** |
|
1957 * Schedule update of the network-wide counts for the current network. |
|
1958 * |
|
1959 * @since 3.1.0 |
|
1960 */ |
|
1961 function wp_schedule_update_network_counts() { |
|
1962 if ( !is_main_site() ) |
|
1963 return; |
|
1964 |
|
1965 if ( !wp_next_scheduled('update_network_counts') && !defined('WP_INSTALLING') ) |
|
1966 wp_schedule_event(time(), 'twicedaily', 'update_network_counts'); |
|
1967 } |
|
1968 |
|
1969 /** |
|
1970 * Update the network-wide counts for the current network. |
|
1971 * |
|
1972 * @since 3.1.0 |
|
1973 */ |
|
1974 function wp_update_network_counts() { |
|
1975 global $wpdb; |
|
1976 |
|
1977 $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0'", $wpdb->siteid) ); |
|
1978 update_site_option( 'blog_count', $count ); |
|
1979 |
|
1980 $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'") ); |
|
1981 update_site_option( 'user_count', $count ); |
|
1982 } |