Media: Add filters to allow overriding slow media queries.

There are a couple of queries that do a full table scan of attachment posts to support features of the media library.  Pending a more complete solution, allow overriding these queries via filters.

Props sboisvert, jnylen0.
See #31071.

Built from https://develop.svn.wordpress.org/trunk@40382


git-svn-id: http://core.svn.wordpress.org/trunk@40289 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
James Nylen 2017-04-06 03:57:45 +00:00
parent 19d960e257
commit 5584f22d53
2 changed files with 76 additions and 21 deletions

View File

@ -3321,26 +3321,81 @@ function wp_enqueue_media( $args = array() ) {
}
}
$has_audio = $wpdb->get_var( "
SELECT ID
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_mime_type LIKE 'audio%'
LIMIT 1
" );
$has_video = $wpdb->get_var( "
SELECT ID
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_mime_type LIKE 'video%'
LIMIT 1
" );
$months = $wpdb->get_results( $wpdb->prepare( "
SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
FROM $wpdb->posts
WHERE post_type = %s
ORDER BY post_date DESC
", 'attachment' ) );
/**
* Allows showing or hiding the "Create Audio Playlist" button in the media library.
*
* By default (if this filter returns `null`), a query will be run to
* determine whether the media library contains any audio items. This
* query is expensive for large media libraries, so it may be desirable for
* sites to override this behavior.
*
* @since 4.7.4
*
* @link https://core.trac.wordpress.org/ticket/31071
*
* @return bool|null Whether to show the button, or `null` for default behavior.
*/
$has_audio = apply_filters( 'media_has_audio', null );
if ( is_null( $has_audio ) ) {
$has_audio = $wpdb->get_var( "
SELECT ID
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_mime_type LIKE 'audio%'
LIMIT 1
" );
}
/**
* Allows showing or hiding the "Create Video Playlist" button in the media library.
*
* By default (if this filter returns `null`), a query will be run to
* determine whether the media library contains any video items. This
* query is expensive for large media libraries, so it may be desirable for
* sites to override this behavior.
*
* @since 4.7.4
*
* @link https://core.trac.wordpress.org/ticket/31071
*
* @return bool|null Whether to show the button, or `null` for default behavior.
*/
$has_video = apply_filters( 'media_has_video', null );
if ( is_null( $has_video ) ) {
$has_video = $wpdb->get_var( "
SELECT ID
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_mime_type LIKE 'video%'
LIMIT 1
" );
}
/**
* Allows overriding the list of months displayed in the media library.
*
* By default (if this filter does not return an array), a query will be
* run to determine the months that have media items. This query can be
* expensive for large media libraries, so it may be desirable for sites to
* override this behavior.
*
* @since 4.7.4
*
* @link https://core.trac.wordpress.org/ticket/31071
*
* @return array|null An array of objects with `month` and `year`
* properties, or `null` (or any other non-array value)
* for default behavior.
*/
$months = apply_filters( 'media_months', null );
if ( ! is_array( $months ) ) {
$months = $wpdb->get_results( $wpdb->prepare( "
SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
FROM $wpdb->posts
WHERE post_type = %s
ORDER BY post_date DESC
", 'attachment' ) );
}
foreach ( $months as $month_year ) {
$month_year->text = sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month_year->month ), $month_year->year );
}

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.8-alpha-40381';
$wp_version = '4.8-alpha-40382';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.