WP_Site_Query::get_site_ids()protectedWP 4.6.0

Used internally to get a list of site IDs matching the query vars.

Метод класса: WP_Site_Query{}

Хуки из метода

Возвращает

int|Массив. A single count of site IDs if a count query. An array of site IDs if a full query.

Использование

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->get_site_ids();

Заметки

  • Global. wpdb. $wpdb WordPress database abstraction object.

Список изменений

С версии 4.6.0 Введена.

Код WP_Site_Query::get_site_ids() WP 6.4.3

protected function get_site_ids() {
	global $wpdb;

	$order = $this->parse_order( $this->query_vars['order'] );

	// Disable ORDER BY with 'none', an empty array, or boolean false.
	if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) {
		$orderby = '';
	} elseif ( ! empty( $this->query_vars['orderby'] ) ) {
		$ordersby = is_array( $this->query_vars['orderby'] ) ?
			$this->query_vars['orderby'] :
			preg_split( '/[,\s]/', $this->query_vars['orderby'] );

		$orderby_array = array();
		foreach ( $ordersby as $_key => $_value ) {
			if ( ! $_value ) {
				continue;
			}

			if ( is_int( $_key ) ) {
				$_orderby = $_value;
				$_order   = $order;
			} else {
				$_orderby = $_key;
				$_order   = $_value;
			}

			$parsed = $this->parse_orderby( $_orderby );

			if ( ! $parsed ) {
				continue;
			}

			if ( 'site__in' === $_orderby || 'network__in' === $_orderby ) {
				$orderby_array[] = $parsed;
				continue;
			}

			$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );
		}

		$orderby = implode( ', ', $orderby_array );
	} else {
		$orderby = "{$wpdb->blogs}.blog_id $order";
	}

	$number = absint( $this->query_vars['number'] );
	$offset = absint( $this->query_vars['offset'] );
	$limits = '';

	if ( ! empty( $number ) ) {
		if ( $offset ) {
			$limits = 'LIMIT ' . $offset . ',' . $number;
		} else {
			$limits = 'LIMIT ' . $number;
		}
	}

	if ( $this->query_vars['count'] ) {
		$fields = 'COUNT(*)';
	} else {
		$fields = "{$wpdb->blogs}.blog_id";
	}

	// Parse site IDs for an IN clause.
	$site_id = absint( $this->query_vars['ID'] );
	if ( ! empty( $site_id ) ) {
		$this->sql_clauses['where']['ID'] = $wpdb->prepare( "{$wpdb->blogs}.blog_id = %d", $site_id );
	}

	// Parse site IDs for an IN clause.
	if ( ! empty( $this->query_vars['site__in'] ) ) {
		$this->sql_clauses['where']['site__in'] = "{$wpdb->blogs}.blog_id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__in'] ) ) . ' )';
	}

	// Parse site IDs for a NOT IN clause.
	if ( ! empty( $this->query_vars['site__not_in'] ) ) {
		$this->sql_clauses['where']['site__not_in'] = "{$wpdb->blogs}.blog_id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__not_in'] ) ) . ' )';
	}

	$network_id = absint( $this->query_vars['network_id'] );

	if ( ! empty( $network_id ) ) {
		$this->sql_clauses['where']['network_id'] = $wpdb->prepare( 'site_id = %d', $network_id );
	}

	// Parse site network IDs for an IN clause.
	if ( ! empty( $this->query_vars['network__in'] ) ) {
		$this->sql_clauses['where']['network__in'] = 'site_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )';
	}

	// Parse site network IDs for a NOT IN clause.
	if ( ! empty( $this->query_vars['network__not_in'] ) ) {
		$this->sql_clauses['where']['network__not_in'] = 'site_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )';
	}

	if ( ! empty( $this->query_vars['domain'] ) ) {
		$this->sql_clauses['where']['domain'] = $wpdb->prepare( 'domain = %s', $this->query_vars['domain'] );
	}

	// Parse site domain for an IN clause.
	if ( is_array( $this->query_vars['domain__in'] ) ) {
		$this->sql_clauses['where']['domain__in'] = "domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )";
	}

	// Parse site domain for a NOT IN clause.
	if ( is_array( $this->query_vars['domain__not_in'] ) ) {
		$this->sql_clauses['where']['domain__not_in'] = "domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )";
	}

	if ( ! empty( $this->query_vars['path'] ) ) {
		$this->sql_clauses['where']['path'] = $wpdb->prepare( 'path = %s', $this->query_vars['path'] );
	}

	// Parse site path for an IN clause.
	if ( is_array( $this->query_vars['path__in'] ) ) {
		$this->sql_clauses['where']['path__in'] = "path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )";
	}

	// Parse site path for a NOT IN clause.
	if ( is_array( $this->query_vars['path__not_in'] ) ) {
		$this->sql_clauses['where']['path__not_in'] = "path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )";
	}

	if ( is_numeric( $this->query_vars['archived'] ) ) {
		$archived                               = absint( $this->query_vars['archived'] );
		$this->sql_clauses['where']['archived'] = $wpdb->prepare( 'archived = %s ', absint( $archived ) );
	}

	if ( is_numeric( $this->query_vars['mature'] ) ) {
		$mature                               = absint( $this->query_vars['mature'] );
		$this->sql_clauses['where']['mature'] = $wpdb->prepare( 'mature = %d ', $mature );
	}

	if ( is_numeric( $this->query_vars['spam'] ) ) {
		$spam                               = absint( $this->query_vars['spam'] );
		$this->sql_clauses['where']['spam'] = $wpdb->prepare( 'spam = %d ', $spam );
	}

	if ( is_numeric( $this->query_vars['deleted'] ) ) {
		$deleted                               = absint( $this->query_vars['deleted'] );
		$this->sql_clauses['where']['deleted'] = $wpdb->prepare( 'deleted = %d ', $deleted );
	}

	if ( is_numeric( $this->query_vars['public'] ) ) {
		$public                               = absint( $this->query_vars['public'] );
		$this->sql_clauses['where']['public'] = $wpdb->prepare( 'public = %d ', $public );
	}

	if ( is_numeric( $this->query_vars['lang_id'] ) ) {
		$lang_id                               = absint( $this->query_vars['lang_id'] );
		$this->sql_clauses['where']['lang_id'] = $wpdb->prepare( 'lang_id = %d ', $lang_id );
	}

	// Parse site language IDs for an IN clause.
	if ( ! empty( $this->query_vars['lang__in'] ) ) {
		$this->sql_clauses['where']['lang__in'] = 'lang_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__in'] ) ) . ' )';
	}

	// Parse site language IDs for a NOT IN clause.
	if ( ! empty( $this->query_vars['lang__not_in'] ) ) {
		$this->sql_clauses['where']['lang__not_in'] = 'lang_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__not_in'] ) ) . ' )';
	}

	// Falsey search strings are ignored.
	if ( strlen( $this->query_vars['search'] ) ) {
		$search_columns = array();

		if ( $this->query_vars['search_columns'] ) {
			$search_columns = array_intersect( $this->query_vars['search_columns'], array( 'domain', 'path' ) );
		}

		if ( ! $search_columns ) {
			$search_columns = array( 'domain', 'path' );
		}

		/**
		 * Filters the columns to search in a WP_Site_Query search.
		 *
		 * The default columns include 'domain' and 'path.
		 *
		 * @since 4.6.0
		 *
		 * @param string[]      $search_columns Array of column names to be searched.
		 * @param string        $search         Text being searched.
		 * @param WP_Site_Query $query          The current WP_Site_Query instance.
		 */
		$search_columns = apply_filters( 'site_search_columns', $search_columns, $this->query_vars['search'], $this );

		$this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], $search_columns );
	}

	$date_query = $this->query_vars['date_query'];
	if ( ! empty( $date_query ) && is_array( $date_query ) ) {
		$this->date_query = new WP_Date_Query( $date_query, 'registered' );

		// Strip leading 'AND'.
		$this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() );
	}

	$join    = '';
	$groupby = '';

	if ( ! empty( $this->meta_query_clauses ) ) {
		$join .= $this->meta_query_clauses['join'];

		// Strip leading 'AND'.
		$this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] );

		if ( ! $this->query_vars['count'] ) {
			$groupby = "{$wpdb->blogs}.blog_id";
		}
	}

	$where = implode( ' AND ', $this->sql_clauses['where'] );

	$pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' );

	/**
	 * Filters the site query clauses.
	 *
	 * @since 4.6.0
	 *
	 * @param string[]      $clauses An associative array of site query clauses.
	 * @param WP_Site_Query $query   Current instance of WP_Site_Query (passed by reference).
	 */
	$clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $pieces ), &$this ) );

	$fields  = isset( $clauses['fields'] ) ? $clauses['fields'] : '';
	$join    = isset( $clauses['join'] ) ? $clauses['join'] : '';
	$where   = isset( $clauses['where'] ) ? $clauses['where'] : '';
	$orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : '';
	$limits  = isset( $clauses['limits'] ) ? $clauses['limits'] : '';
	$groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : '';

	if ( $where ) {
		$where = 'WHERE ' . $where;
	}

	if ( $groupby ) {
		$groupby = 'GROUP BY ' . $groupby;
	}

	if ( $orderby ) {
		$orderby = "ORDER BY $orderby";
	}

	$found_rows = '';
	if ( ! $this->query_vars['no_found_rows'] ) {
		$found_rows = 'SQL_CALC_FOUND_ROWS';
	}

	$this->sql_clauses['select']  = "SELECT $found_rows $fields";
	$this->sql_clauses['from']    = "FROM $wpdb->blogs $join";
	$this->sql_clauses['groupby'] = $groupby;
	$this->sql_clauses['orderby'] = $orderby;
	$this->sql_clauses['limits']  = $limits;

	$this->request = "
		{$this->sql_clauses['select']}
		{$this->sql_clauses['from']}
		{$where}
		{$this->sql_clauses['groupby']}
		{$this->sql_clauses['orderby']}
		{$this->sql_clauses['limits']}
	";

	if ( $this->query_vars['count'] ) {
		return (int) $wpdb->get_var( $this->request );
	}

	$site_ids = $wpdb->get_col( $this->request );

	return array_map( 'intval', $site_ids );
}