summaryrefslogtreecommitdiffstats
path: root/wp-includes/class-wp-site.php
diff options
context:
space:
mode:
Diffstat (limited to 'wp-includes/class-wp-site.php')
-rw-r--r--wp-includes/class-wp-site.php353
1 files changed, 353 insertions, 0 deletions
diff --git a/wp-includes/class-wp-site.php b/wp-includes/class-wp-site.php
new file mode 100644
index 0000000..fcd07cd
--- /dev/null
+++ b/wp-includes/class-wp-site.php
@@ -0,0 +1,353 @@
+<?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
+ */
+#[AllowDynamicProperties]
+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;
+ }
+}