Make WordPress Core

Changeset 40425 for branches/4.7


Ignore:
Timestamp:
04/14/2017 08:39:46 AM (9 years ago)
Author:
swissspidy
Message:

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.

Location:
branches/4.7
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/4.7

  • branches/4.7/src/wp-includes/media.php

    r40071 r40425  
    33203320        }
    33213321
    3322         $has_audio = $wpdb->get_var( "
    3323                 SELECT ID
    3324                 FROM $wpdb->posts
    3325                 WHERE post_type = 'attachment'
    3326                 AND post_mime_type LIKE 'audio%'
    3327                 LIMIT 1
    3328         " );
    3329         $has_video = $wpdb->get_var( "
    3330                 SELECT ID
    3331                 FROM $wpdb->posts
    3332                 WHERE post_type = 'attachment'
    3333                 AND post_mime_type LIKE 'video%'
    3334                 LIMIT 1
    3335         " );
    3336         $months = $wpdb->get_results( $wpdb->prepare( "
    3337                 SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
    3338                 FROM $wpdb->posts
    3339                 WHERE post_type = %s
    3340                 ORDER BY post_date DESC
    3341         ", 'attachment' ) );
     3322        /**
     3323         * Allows showing or hiding the "Create Audio Playlist" button in the media library.
     3324         *
     3325         * By default (if this filter returns `null`), a query will be run to
     3326         * determine whether the media library contains any audio items.  This
     3327         * query is expensive for large media libraries, so it may be desirable for
     3328         * sites to override this behavior.
     3329         *
     3330         * @since 4.7.4
     3331         *
     3332         * @link https://core.trac.wordpress.org/ticket/31071
     3333         *
     3334         * @param bool|null Whether to show the button, or `null` for default behavior.
     3335         */
     3336        $show_audio_playlist = apply_filters( 'media_library_show_audio_playlist', null );
     3337        if ( null === $show_audio_playlist ) {
     3338                $show_audio_playlist = $wpdb->get_var( "
     3339                        SELECT ID
     3340                        FROM $wpdb->posts
     3341                        WHERE post_type = 'attachment'
     3342                        AND post_mime_type LIKE 'audio%'
     3343                        LIMIT 1
     3344                " );
     3345        }
     3346
     3347        /**
     3348         * Allows showing or hiding the "Create Video Playlist" button in the media library.
     3349         *
     3350         * By default (if this filter returns `null`), a query will be run to
     3351         * determine whether the media library contains any video items.  This
     3352         * query is expensive for large media libraries, so it may be desirable for
     3353         * sites to override this behavior.
     3354         *
     3355         * @since 4.7.4
     3356         *
     3357         * @link https://core.trac.wordpress.org/ticket/31071
     3358         *
     3359         * @param bool|null Whether to show the button, or `null` for default behavior.
     3360         */
     3361        $show_video_playlist = apply_filters( 'media_library_show_video_playlist', null );
     3362        if ( null === $show_video_playlist ) {
     3363                $show_video_playlist = $wpdb->get_var( "
     3364                        SELECT ID
     3365                        FROM $wpdb->posts
     3366                        WHERE post_type = 'attachment'
     3367                        AND post_mime_type LIKE 'video%'
     3368                        LIMIT 1
     3369                " );
     3370        }
     3371
     3372        /**
     3373         * Allows overriding the list of months displayed in the media library.
     3374         *
     3375         * By default (if this filter does not return an array), a query will be
     3376         * run to determine the months that have media items.  This query can be
     3377         * expensive for large media libraries, so it may be desirable for sites to
     3378         * override this behavior.
     3379         *
     3380         * @since 4.7.4
     3381         *
     3382         * @link https://core.trac.wordpress.org/ticket/31071
     3383         *
     3384         * @param array|null An array of objects with `month` and `year`
     3385         *                   properties, or `null` (or any other non-array value)
     3386         *                   for default behavior.
     3387         */
     3388        $months = apply_filters( 'media_library_months_with_files', null );
     3389        if ( ! is_array( $months ) ) {
     3390                $months = $wpdb->get_results( $wpdb->prepare( "
     3391                        SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
     3392                        FROM $wpdb->posts
     3393                        WHERE post_type = %s
     3394                        ORDER BY post_date DESC
     3395                ", 'attachment' ) );
     3396        }
    33423397        foreach ( $months as $month_year ) {
    33433398                $month_year->text = sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month_year->month ), $month_year->year );
     
    33583413                'defaultProps' => $props,
    33593414                'attachmentCounts' => array(
    3360                         'audio' => ( $has_audio ) ? 1 : 0,
    3361                         'video' => ( $has_video ) ? 1 : 0
     3415                        'audio' => ( $show_audio_playlist ) ? 1 : 0,
     3416                        'video' => ( $show_video_playlist ) ? 1 : 0,
    33623417                ),
    33633418                'embedExts'    => $exts,
     
    33653420                'contentWidth' => $content_width,
    33663421                'months'       => $months,
    3367                 'mediaTrash'   => MEDIA_TRASH ? 1 : 0
     3422                'mediaTrash'   => MEDIA_TRASH ? 1 : 0,
    33683423        );
    33693424
Note: See TracChangeset for help on using the changeset viewer.