From 59e00d43a5353d5a59f94911dd8bfeb79d066470 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Fri, 14 Apr 2017 08:39:46 +0000 Subject: [PATCH] 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. Merges [40382] and [40421] to the 4.7 branch. git-svn-id: https://develop.svn.wordpress.org/branches/4.7@40425 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/media.php | 101 +++++++++++++++++++++++++++++--------- 1 file changed, 78 insertions(+), 23 deletions(-) diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 3411b84c80..3d2f850df9 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -3319,26 +3319,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 + * + * @param bool|null Whether to show the button, or `null` for default behavior. + */ + $show_audio_playlist = apply_filters( 'media_library_show_audio_playlist', null ); + if ( null === $show_audio_playlist ) { + $show_audio_playlist = $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 + * + * @param bool|null Whether to show the button, or `null` for default behavior. + */ + $show_video_playlist = apply_filters( 'media_library_show_video_playlist', null ); + if ( null === $show_video_playlist ) { + $show_video_playlist = $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 + * + * @param 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_library_months_with_files', 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 ); } @@ -3357,14 +3412,14 @@ function wp_enqueue_media( $args = array() ) { ), 'defaultProps' => $props, 'attachmentCounts' => array( - 'audio' => ( $has_audio ) ? 1 : 0, - 'video' => ( $has_video ) ? 1 : 0 + 'audio' => ( $show_audio_playlist ) ? 1 : 0, + 'video' => ( $show_video_playlist ) ? 1 : 0, ), 'embedExts' => $exts, 'embedMimes' => $ext_mimes, 'contentWidth' => $content_width, 'months' => $months, - 'mediaTrash' => MEDIA_TRASH ? 1 : 0 + 'mediaTrash' => MEDIA_TRASH ? 1 : 0, ); $post = null;