WPSEO_Post_Type_Sitemap_Provider::get_all_dates_using_with_clause()privateYoast 1.0

Get all dates for a post type by using the WITH clause for performance.

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

Хуков нет.

Возвращает

Массив. Array of dates.

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

// private - только в коде основоного (родительского) класса
$result = $this->get_all_dates_using_with_clause( $post_type, $max_entries );
$post_type(строка) (обязательный)
Post type to retrieve dates for.
$max_entries(int) (обязательный)
Maximum number of entries to retrieve.

Код WPSEO_Post_Type_Sitemap_Provider::get_all_dates_using_with_clause() Yoast 24.9

private function get_all_dates_using_with_clause( $post_type, $max_entries ) {
	global $wpdb;

	$post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) );

	$replacements = array_merge(
		[
			'ordering',
			'post_modified_gmt',
			$wpdb->posts,
			'type_status_date',
			'post_status',
		],
		$post_statuses,
		[
			'post_type',
			$post_type,
			'post_modified_gmt',
			'post_modified_gmt',
			'ordering',
			$max_entries,
		]
	);

	//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
	//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
	return $wpdb->get_col(
		//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
		$wpdb->prepare(
			'
		WITH %i AS (SELECT ROW_NUMBER() OVER (ORDER BY %i) AS n, post_modified_gmt
						  FROM %i USE INDEX ( %i )
						  WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ')
							 AND %i = %s
						  ORDER BY %i)
		SELECT %i
		FROM %i
		WHERE MOD(n, %d) = 0;
		',
			$replacements
		)
	);
}