WP_Query::generate_cache_key()protectedWP 6.1.0

Generates cache key.

Method of the class: WP_Query{}

No Hooks.

Return

String. Cache key.

Usage

// protected - for code of main (parent) or child class
$result = $this->generate_cache_key( $args, $sql );
$args(array) (required)
Query arguments.
$sql(string) (required)
SQL statement.

Notes

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

Changelog

Since 6.1.0 Introduced.

WP_Query::generate_cache_key() code WP 6.5.2

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']
	);

	$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 );
			}
		}
	);

	// 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";
}