wp/wp-includes/class-wp-site.php
changeset 7 cf61fcea0001
child 9 177826044cd9
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 <?php
       
     2 /**
       
     3  * Site API: WP_Site class
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Multisite
       
     7  * @since 4.5.0
       
     8  */
       
     9 
       
    10 /**
       
    11  * Core class used for interacting with a multisite site.
       
    12  *
       
    13  * This class is used during load to populate the `$current_blog` global and
       
    14  * setup the current site.
       
    15  *
       
    16  * @since 4.5.0
       
    17  *
       
    18  * @property int    $id
       
    19  * @property int    $network_id
       
    20  * @property string $blogname
       
    21  * @property string $siteurl
       
    22  * @property int    $post_count
       
    23  * @property string $home
       
    24  */
       
    25 final class WP_Site {
       
    26 
       
    27 	/**
       
    28 	 * Site ID.
       
    29 	 *
       
    30 	 * A numeric string, for compatibility reasons.
       
    31 	 *
       
    32 	 * @since 4.5.0
       
    33 	 * @var string
       
    34 	 */
       
    35 	public $blog_id;
       
    36 
       
    37 	/**
       
    38 	 * Domain of the site.
       
    39 	 *
       
    40 	 * @since 4.5.0
       
    41 	 * @var string
       
    42 	 */
       
    43 	public $domain = '';
       
    44 
       
    45 	/**
       
    46 	 * Path of the site.
       
    47 	 *
       
    48 	 * @since 4.5.0
       
    49 	 * @var string
       
    50 	 */
       
    51 	public $path = '';
       
    52 
       
    53 	/**
       
    54 	 * The ID of the site's parent network.
       
    55 	 *
       
    56 	 * Named "site" vs. "network" for legacy reasons. An individual site's "site" is
       
    57 	 * its network.
       
    58 	 *
       
    59 	 * A numeric string, for compatibility reasons.
       
    60 	 *
       
    61 	 * @since 4.5.0
       
    62 	 * @var string
       
    63 	 */
       
    64 	public $site_id = '0';
       
    65 
       
    66 	/**
       
    67 	 * The date on which the site was created or registered.
       
    68 	 *
       
    69 	 * @since 4.5.0
       
    70 	 * @var string Date in MySQL's datetime format.
       
    71 	 */
       
    72 	public $registered = '0000-00-00 00:00:00';
       
    73 
       
    74 	/**
       
    75 	 * The date and time on which site settings were last updated.
       
    76 	 *
       
    77 	 * @since 4.5.0
       
    78 	 * @var string Date in MySQL's datetime format.
       
    79 	 */
       
    80 	public $last_updated = '0000-00-00 00:00:00';
       
    81 
       
    82 	/**
       
    83 	 * Whether the site should be treated as public.
       
    84 	 *
       
    85 	 * A numeric string, for compatibility reasons.
       
    86 	 *
       
    87 	 * @since 4.5.0
       
    88 	 * @var string
       
    89 	 */
       
    90 	public $public = '1';
       
    91 
       
    92 	/**
       
    93 	 * Whether the site should be treated as archived.
       
    94 	 *
       
    95 	 * A numeric string, for compatibility reasons.
       
    96 	 *
       
    97 	 * @since 4.5.0
       
    98 	 * @var string
       
    99 	 */
       
   100 	public $archived = '0';
       
   101 
       
   102 	/**
       
   103 	 * Whether the site should be treated as mature.
       
   104 	 *
       
   105 	 * Handling for this does not exist throughout WordPress core, but custom
       
   106 	 * implementations exist that require the property to be present.
       
   107 	 *
       
   108 	 * A numeric string, for compatibility reasons.
       
   109 	 *
       
   110 	 * @since 4.5.0
       
   111 	 * @var string
       
   112 	 */
       
   113 	public $mature = '0';
       
   114 
       
   115 	/**
       
   116 	 * Whether the site should be treated as spam.
       
   117 	 *
       
   118 	 * A numeric string, for compatibility reasons.
       
   119 	 *
       
   120 	 * @since 4.5.0
       
   121 	 * @var string
       
   122 	 */
       
   123 	public $spam = '0';
       
   124 
       
   125 	/**
       
   126 	 * Whether the site should be treated as deleted.
       
   127 	 *
       
   128 	 * A numeric string, for compatibility reasons.
       
   129 	 *
       
   130 	 * @since 4.5.0
       
   131 	 * @var string
       
   132 	 */
       
   133 	public $deleted = '0';
       
   134 
       
   135 	/**
       
   136 	 * The language pack associated with this site.
       
   137 	 *
       
   138 	 * A numeric string, for compatibility reasons.
       
   139 	 *
       
   140 	 * @since 4.5.0
       
   141 	 * @var string
       
   142 	 */
       
   143 	public $lang_id = '0';
       
   144 
       
   145 	/**
       
   146 	 * Retrieves a site from the database by its ID.
       
   147 	 *
       
   148 	 * @static
       
   149 	 * @since 4.5.0
       
   150 	 *
       
   151 	 * @global wpdb $wpdb WordPress database abstraction object.
       
   152 	 *
       
   153 	 * @param int $site_id The ID of the site to retrieve.
       
   154 	 * @return WP_Site|false The site's object if found. False if not.
       
   155 	 */
       
   156 	public static function get_instance( $site_id ) {
       
   157 		global $wpdb;
       
   158 
       
   159 		$site_id = (int) $site_id;
       
   160 		if ( ! $site_id ) {
       
   161 			return false;
       
   162 		}
       
   163 
       
   164 		$_site = wp_cache_get( $site_id, 'sites' );
       
   165 
       
   166 		if ( ! $_site ) {
       
   167 			$_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d LIMIT 1", $site_id ) );
       
   168 
       
   169 			if ( empty( $_site ) || is_wp_error( $_site ) ) {
       
   170 				return false;
       
   171 			}
       
   172 
       
   173 			wp_cache_add( $site_id, $_site, 'sites' );
       
   174 		}
       
   175 
       
   176 		return new WP_Site( $_site );
       
   177 	}
       
   178 
       
   179 	/**
       
   180 	 * Creates a new WP_Site object.
       
   181 	 *
       
   182 	 * Will populate object properties from the object provided and assign other
       
   183 	 * default properties based on that information.
       
   184 	 *
       
   185 	 * @since 4.5.0
       
   186 	 *
       
   187 	 * @param WP_Site|object $site A site object.
       
   188 	 */
       
   189 	public function __construct( $site ) {
       
   190 		foreach( get_object_vars( $site ) as $key => $value ) {
       
   191 			$this->$key = $value;
       
   192 		}
       
   193 	}
       
   194 
       
   195 	/**
       
   196 	 * Converts an object to array.
       
   197 	 *
       
   198 	 * @since 4.6.0
       
   199 	 *
       
   200 	 * @return array Object as array.
       
   201 	 */
       
   202 	public function to_array() {
       
   203 		return get_object_vars( $this );
       
   204 	}
       
   205 
       
   206 	/**
       
   207 	 * Getter.
       
   208 	 *
       
   209 	 * Allows current multisite naming conventions when getting properties.
       
   210 	 * Allows access to extended site properties.
       
   211 	 *
       
   212 	 * @since 4.6.0
       
   213 	 *
       
   214 	 * @param string $key Property to get.
       
   215 	 * @return mixed Value of the property. Null if not available.
       
   216 	 */
       
   217 	public function __get( $key ) {
       
   218 		switch ( $key ) {
       
   219 			case 'id':
       
   220 				return (int) $this->blog_id;
       
   221 			case 'network_id':
       
   222 				return (int) $this->site_id;
       
   223 			case 'blogname':
       
   224 			case 'siteurl':
       
   225 			case 'post_count':
       
   226 			case 'home':
       
   227 			default: // Custom properties added by 'site_details' filter.
       
   228 				if ( ! did_action( 'ms_loaded' ) ) {
       
   229 					return null;
       
   230 				}
       
   231 
       
   232 				$details = $this->get_details();
       
   233 				if ( isset( $details->$key ) ) {
       
   234 					return $details->$key;
       
   235 				}
       
   236 		}
       
   237 
       
   238 		return null;
       
   239 	}
       
   240 
       
   241 	/**
       
   242 	 * Isset-er.
       
   243 	 *
       
   244 	 * Allows current multisite naming conventions when checking for properties.
       
   245 	 * Checks for extended site properties.
       
   246 	 *
       
   247 	 * @since 4.6.0
       
   248 	 *
       
   249 	 * @param string $key Property to check if set.
       
   250 	 * @return bool Whether the property is set.
       
   251 	 */
       
   252 	public function __isset( $key ) {
       
   253 		switch ( $key ) {
       
   254 			case 'id':
       
   255 			case 'network_id':
       
   256 				return true;
       
   257 			case 'blogname':
       
   258 			case 'siteurl':
       
   259 			case 'post_count':
       
   260 			case 'home':
       
   261 				if ( ! did_action( 'ms_loaded' ) ) {
       
   262 					return false;
       
   263 				}
       
   264 				return true;
       
   265 			default: // Custom properties added by 'site_details' filter.
       
   266 				if ( ! did_action( 'ms_loaded' ) ) {
       
   267 					return false;
       
   268 				}
       
   269 
       
   270 				$details = $this->get_details();
       
   271 				if ( isset( $details->$key ) ) {
       
   272 					return true;
       
   273 				}
       
   274 		}
       
   275 
       
   276 		return false;
       
   277 	}
       
   278 
       
   279 	/**
       
   280 	 * Setter.
       
   281 	 *
       
   282 	 * Allows current multisite naming conventions while setting properties.
       
   283 	 *
       
   284 	 * @since 4.6.0
       
   285 	 *
       
   286 	 * @param string $key   Property to set.
       
   287 	 * @param mixed  $value Value to assign to the property.
       
   288 	 */
       
   289 	public function __set( $key, $value ) {
       
   290 		switch ( $key ) {
       
   291 			case 'id':
       
   292 				$this->blog_id = (string) $value;
       
   293 				break;
       
   294 			case 'network_id':
       
   295 				$this->site_id = (string) $value;
       
   296 				break;
       
   297 			default:
       
   298 				$this->$key = $value;
       
   299 		}
       
   300 	}
       
   301 
       
   302 	/**
       
   303 	 * Retrieves the details for this site.
       
   304 	 *
       
   305 	 * This method is used internally to lazy-load the extended properties of a site.
       
   306 	 *
       
   307 	 * @since 4.6.0
       
   308 	 *
       
   309 	 * @see WP_Site::__get()
       
   310 	 *
       
   311 	 * @return stdClass A raw site object with all details included.
       
   312 	 */
       
   313 	private function get_details() {
       
   314 		$details = wp_cache_get( $this->blog_id, 'site-details' );
       
   315 
       
   316 		if ( false === $details ) {
       
   317 
       
   318 			switch_to_blog( $this->blog_id );
       
   319 			// Create a raw copy of the object for backwards compatibility with the filter below.
       
   320 			$details = new stdClass();
       
   321 			foreach ( get_object_vars( $this ) as $key => $value ) {
       
   322 				$details->$key = $value;
       
   323 			}
       
   324 			$details->blogname   = get_option( 'blogname' );
       
   325 			$details->siteurl    = get_option( 'siteurl' );
       
   326 			$details->post_count = get_option( 'post_count' );
       
   327 			$details->home       = get_option( 'home' );
       
   328 			restore_current_blog();
       
   329 
       
   330 			wp_cache_set( $this->blog_id, $details, 'site-details' );
       
   331 		}
       
   332 
       
   333 		/** This filter is documented in wp-includes/ms-blogs.php */
       
   334 		$details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' );
       
   335 
       
   336 		/**
       
   337 		 * Filters a site's extended properties.
       
   338 		 *
       
   339 		 * @since 4.6.0
       
   340 		 *
       
   341 		 * @param stdClass $details The site details.
       
   342 		 */
       
   343 		$details = apply_filters( 'site_details', $details );
       
   344 
       
   345 		return $details;
       
   346 	}
       
   347 }