Seditio Source
Root |
./othercms/wordpress-6.0/wp-includes/class-wp-site.php
<?php
/**
 * Site API: WP_Site class
 *
 * @package WordPress
 * @subpackage Multisite
 * @since 4.5.0
 */

/**
 * Core class used for interacting with a multisite site.
 *
 * This class is used during load to populate the `$current_blog` global and
 * setup the current site.
 *
 * @since 4.5.0
 *
 * @property int    $id
 * @property int    $network_id
 * @property string $blogname
 * @property string $siteurl
 * @property int    $post_count
 * @property string $home
 */
final class WP_Site {

   
/**
     * Site ID.
     *
     * Named "blog" vs. "site" for legacy reasons.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $blog_id;

   
/**
     * Domain of the site.
     *
     * @since 4.5.0
     * @var string
     */
   
public $domain = '';

   
/**
     * Path of the site.
     *
     * @since 4.5.0
     * @var string
     */
   
public $path = '';

   
/**
     * The ID of the site's parent network.
     *
     * Named "site" vs. "network" for legacy reasons. An individual site's "site" is
     * its network.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $site_id = '0';

   
/**
     * The date and time on which the site was created or registered.
     *
     * @since 4.5.0
     * @var string Date in MySQL's datetime format.
     */
   
public $registered = '0000-00-00 00:00:00';

   
/**
     * The date and time on which site settings were last updated.
     *
     * @since 4.5.0
     * @var string Date in MySQL's datetime format.
     */
   
public $last_updated = '0000-00-00 00:00:00';

   
/**
     * Whether the site should be treated as public.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $public = '1';

   
/**
     * Whether the site should be treated as archived.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $archived = '0';

   
/**
     * Whether the site should be treated as mature.
     *
     * Handling for this does not exist throughout WordPress core, but custom
     * implementations exist that require the property to be present.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $mature = '0';

   
/**
     * Whether the site should be treated as spam.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $spam = '0';

   
/**
     * Whether the site should be treated as deleted.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $deleted = '0';

   
/**
     * The language pack associated with this site.
     *
     * A numeric string, for compatibility reasons.
     *
     * @since 4.5.0
     * @var string
     */
   
public $lang_id = '0';

   
/**
     * Retrieves a site from the database by its ID.
     *
     * @since 4.5.0
     *
     * @global wpdb $wpdb WordPress database abstraction object.
     *
     * @param int $site_id The ID of the site to retrieve.
     * @return WP_Site|false The site's object if found. False if not.
     */
   
public static function get_instance( $site_id ) {
        global
$wpdb;

       
$site_id = (int) $site_id;
        if ( !
$site_id ) {
            return
false;
        }

       
$_site = wp_cache_get( $site_id, 'sites' );

        if (
false === $_site ) {
           
$_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d LIMIT 1", $site_id ) );

            if ( empty(
$_site ) || is_wp_error( $_site ) ) {
               
$_site = -1;
            }

           
wp_cache_add( $site_id, $_site, 'sites' );
        }

        if (
is_numeric( $_site ) ) {
            return
false;
        }

        return new
WP_Site( $_site );
    }

   
/**
     * Creates a new WP_Site object.
     *
     * Will populate object properties from the object provided and assign other
     * default properties based on that information.
     *
     * @since 4.5.0
     *
     * @param WP_Site|object $site A site object.
     */
   
public function __construct( $site ) {
        foreach (
get_object_vars( $site ) as $key => $value ) {
           
$this->$key = $value;
        }
    }

   
/**
     * Converts an object to array.
     *
     * @since 4.6.0
     *
     * @return array Object as array.
     */
   
public function to_array() {
        return
get_object_vars( $this );
    }

   
/**
     * Getter.
     *
     * Allows current multisite naming conventions when getting properties.
     * Allows access to extended site properties.
     *
     * @since 4.6.0
     *
     * @param string $key Property to get.
     * @return mixed Value of the property. Null if not available.
     */
   
public function __get( $key ) {
        switch (
$key ) {
            case
'id':
                return (int)
$this->blog_id;
            case
'network_id':
                return (int)
$this->site_id;
            case
'blogname':
            case
'siteurl':
            case
'post_count':
            case
'home':
            default:
// Custom properties added by 'site_details' filter.
               
if ( ! did_action( 'ms_loaded' ) ) {
                    return
null;
                }

               
$details = $this->get_details();
                if ( isset(
$details->$key ) ) {
                    return
$details->$key;
                }
        }

        return
null;
    }

   
/**
     * Isset-er.
     *
     * Allows current multisite naming conventions when checking for properties.
     * Checks for extended site properties.
     *
     * @since 4.6.0
     *
     * @param string $key Property to check if set.
     * @return bool Whether the property is set.
     */
   
public function __isset( $key ) {
        switch (
$key ) {
            case
'id':
            case
'network_id':
                return
true;
            case
'blogname':
            case
'siteurl':
            case
'post_count':
            case
'home':
                if ( !
did_action( 'ms_loaded' ) ) {
                    return
false;
                }
                return
true;
            default:
// Custom properties added by 'site_details' filter.
               
if ( ! did_action( 'ms_loaded' ) ) {
                    return
false;
                }

               
$details = $this->get_details();
                if ( isset(
$details->$key ) ) {
                    return
true;
                }
        }

        return
false;
    }

   
/**
     * Setter.
     *
     * Allows current multisite naming conventions while setting properties.
     *
     * @since 4.6.0
     *
     * @param string $key   Property to set.
     * @param mixed  $value Value to assign to the property.
     */
   
public function __set( $key, $value ) {
        switch (
$key ) {
            case
'id':
               
$this->blog_id = (string) $value;
                break;
            case
'network_id':
               
$this->site_id = (string) $value;
                break;
            default:
               
$this->$key = $value;
        }
    }

   
/**
     * Retrieves the details for this site.
     *
     * This method is used internally to lazy-load the extended properties of a site.
     *
     * @since 4.6.0
     *
     * @see WP_Site::__get()
     *
     * @return stdClass A raw site object with all details included.
     */
   
private function get_details() {
       
$details = wp_cache_get( $this->blog_id, 'site-details' );

        if (
false === $details ) {

           
switch_to_blog( $this->blog_id );
           
// Create a raw copy of the object for backward compatibility with the filter below.
           
$details = new stdClass();
            foreach (
get_object_vars( $this ) as $key => $value ) {
               
$details->$key = $value;
            }
           
$details->blogname   = get_option( 'blogname' );
           
$details->siteurl    = get_option( 'siteurl' );
           
$details->post_count = get_option( 'post_count' );
           
$details->home       = get_option( 'home' );
           
restore_current_blog();

           
wp_cache_set( $this->blog_id, $details, 'site-details' );
        }

       
/** This filter is documented in wp-includes/ms-blogs.php */
       
$details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' );

       
/**
         * Filters a site's extended properties.
         *
         * @since 4.6.0
         *
         * @param stdClass $details The site details.
         */
       
$details = apply_filters( 'site_details', $details );

        return
$details;
    }
}