| [ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Fri May 25 03:56:23 2012 | Hosted by follow the white rabbit. |