WP_Query::generate_cache_key( array $args, string $sql ): string

In this article

Generates cache key.

Parameters

$argsarrayrequired
Query arguments.
$sqlstringrequired
SQL statement.

Return

string Cache key.

Source

protected function generate_cache_key( array $args, $sql ) {
	global $wpdb;

	unset(
		$args['cache_results'],
		$args['fields'],
		$args['lazy_load_term_meta'],
		$args['update_post_meta_cache'],
		$args['update_post_term_cache'],
		$args['update_menu_item_cache'],
		$args['suppress_filters']
	);

	if ( empty( $args['post_type'] ) ) {
		if ( $this->is_attachment ) {
			$args['post_type'] = 'attachment';
		} elseif ( $this->is_page ) {
			$args['post_type'] = 'page';
		} else {
			$args['post_type'] = 'post';
		}
	} elseif ( 'any' === $args['post_type'] ) {
		$args['post_type'] = array_values( get_post_types( array( 'exclude_from_search' => false ) ) );
	}
	$args['post_type'] = (array) $args['post_type'];
	// Sort post types to ensure same cache key generation.
	sort( $args['post_type'] );

	if ( isset( $args['post_status'] ) ) {
		$args['post_status'] = (array) $args['post_status'];
		// Sort post status to ensure same cache key generation.
		sort( $args['post_status'] );
	}

	// Add a default orderby value of date to ensure same cache key generation.
	if ( ! isset( $q['orderby'] ) ) {
		$args['orderby'] = 'date';
	}

	$placeholder = $wpdb->placeholder_escape();
	array_walk_recursive(
		$args,
		/*
		 * Replace wpdb placeholders with the string used in the database
		 * query to avoid unreachable cache keys. This is necessary because
		 * the placeholder is randomly generated in each request.
		 *
		 * $value is passed by reference to allow it to be modified.
		 * array_walk_recursive() does not return an array.
		 */
		static function ( &$value ) use ( $wpdb, $placeholder ) {
			if ( is_string( $value ) && str_contains( $value, $placeholder ) ) {
				$value = $wpdb->remove_placeholder_escape( $value );
			}
		}
	);

	ksort( $args );

	// Replace wpdb placeholder in the SQL statement used by the cache key.
	$sql = $wpdb->remove_placeholder_escape( $sql );
	$key = md5( serialize( $args ) . $sql );

	$last_changed = wp_cache_get_last_changed( 'posts' );
	if ( ! empty( $this->tax_query->queries ) ) {
		$last_changed .= wp_cache_get_last_changed( 'terms' );
	}

	return "wp_query:$key:$last_changed";
}

Changelog

VersionDescription
6.1.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.