396 lines
15 KiB
PHP
396 lines
15 KiB
PHP
<?php
|
|
/*
|
|
Plugin Name: wp_enqueue_media Override
|
|
Plugin URI: https://github.com/alleyinteractive/wp_enqueue_media_override
|
|
Description: A temporary and hacky solution to work around performance issues in wp_enqueue_media
|
|
Version: 1.0.0
|
|
Author: Alley Interactive
|
|
Author URI: http://www.alleyinteractive.com/
|
|
*/
|
|
/*
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
/**
|
|
* Beat WordPress to the punch in enqueueing media, and do so more performantly.
|
|
*
|
|
* This function is ripped from core, with a couple of major differences in how
|
|
* it queries for "has_audio", "has_video", and media months. These queries are
|
|
* extremely slow on sites with as much media as this site has, and this is a
|
|
* band-aid to speed things up. WordPress doesn't currently offer a way to
|
|
* intercept these queries or override this function, but the function does
|
|
* check if `did_action( 'wp_enqueue_media' )` and returns if true. Therefore,
|
|
* if we were to fire that action before WordPress does, we can safely override
|
|
* the functionality.
|
|
*
|
|
* This plugin is a stopgap and can be deprecated once Trac tickets 32264
|
|
* ({@see https://core.trac.wordpress.org/ticket/32264}) and 31071
|
|
* ({@see https://core.trac.wordpress.org/ticket/31071}) are closed.
|
|
*
|
|
* Most of this code is copied from WordPress, with the performance updates
|
|
* mainly coming from @philipjohn, as posted on
|
|
* https://core.trac.wordpress.org/ticket/32264.
|
|
*/
|
|
|
|
|
|
/**
|
|
* Enqueues all scripts, styles, settings, and templates necessary to use
|
|
* all media JS APIs.
|
|
*
|
|
* @global int $content_width
|
|
* @global wpdb $wpdb
|
|
* @global WP_Locale $wp_locale
|
|
*
|
|
* @param array $args {
|
|
* Arguments for enqueuing media scripts.
|
|
*
|
|
* @type int|WP_Post A post object or ID.
|
|
* }
|
|
*/
|
|
function burst_wp_enqueue_media( $args = array() ) {
|
|
// Enqueue me just once per page, please.
|
|
if ( did_action( 'wp_enqueue_media' ) ) {
|
|
return;
|
|
}
|
|
|
|
global $content_width, $wpdb, $wp_locale;
|
|
|
|
$defaults = array(
|
|
'post' => null,
|
|
);
|
|
$args = wp_parse_args( $args, $defaults );
|
|
|
|
// We're going to pass the old thickbox media tabs to `media_upload_tabs`
|
|
// to ensure plugins will work. We will then unset those tabs.
|
|
$tabs = array(
|
|
// handler action suffix => tab label
|
|
'type' => '',
|
|
'type_url' => '',
|
|
'gallery' => '',
|
|
'library' => '',
|
|
);
|
|
|
|
/** This filter is documented in wp-admin/includes/media.php */
|
|
$tabs = apply_filters( 'media_upload_tabs', $tabs );
|
|
unset( $tabs['type'], $tabs['type_url'], $tabs['gallery'], $tabs['library'] );
|
|
|
|
$props = array(
|
|
'link' => get_option( 'image_default_link_type' ), // db default is 'file'
|
|
'align' => get_option( 'image_default_align' ), // empty default
|
|
'size' => get_option( 'image_default_size' ), // empty default
|
|
);
|
|
|
|
$exts = array_merge( wp_get_audio_extensions(), wp_get_video_extensions() );
|
|
$mimes = get_allowed_mime_types();
|
|
$ext_mimes = array();
|
|
foreach ( $exts as $ext ) {
|
|
foreach ( $mimes as $ext_preg => $mime_match ) {
|
|
if ( preg_match( '#' . $ext . '#i', $ext_preg ) ) {
|
|
$ext_mimes[ $ext ] = $mime_match;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Cache these expensive queries
|
|
$has_audio = false;
|
|
$has_video = false;
|
|
|
|
$settings = array(
|
|
'tabs' => $tabs,
|
|
'tabUrl' => add_query_arg( array( 'chromeless' => true ), admin_url( 'media-upload.php' ) ),
|
|
'mimeTypes' => wp_list_pluck( get_post_mime_types(), 0 ),
|
|
/** This filter is documented in wp-admin/includes/media.php */
|
|
'captions' => ! apply_filters( 'disable_captions', '' ),
|
|
'nonce' => array(
|
|
'sendToEditor' => wp_create_nonce( 'media-send-to-editor' ),
|
|
),
|
|
'post' => array(
|
|
'id' => 0,
|
|
),
|
|
'defaultProps' => $props,
|
|
'attachmentCounts' => array(
|
|
'audio' => intval( $has_audio ),
|
|
'video' => intval( $has_video ),
|
|
),
|
|
'embedExts' => $exts,
|
|
'embedMimes' => $ext_mimes,
|
|
'contentWidth' => $content_width,
|
|
'months' => burst_get_media_months(),
|
|
'mediaTrash' => MEDIA_TRASH ? 1 : 0,
|
|
);
|
|
|
|
$post = null;
|
|
if ( isset( $args['post'] ) ) {
|
|
$post = get_post( $args['post'] );
|
|
$settings['post'] = array(
|
|
'id' => $post->ID,
|
|
'nonce' => wp_create_nonce( 'update-post_' . $post->ID ),
|
|
);
|
|
|
|
$thumbnail_support = current_theme_supports( 'post-thumbnails', $post->post_type ) && post_type_supports( $post->post_type, 'thumbnail' );
|
|
if ( ! $thumbnail_support && 'attachment' === $post->post_type && $post->post_mime_type ) {
|
|
if ( wp_attachment_is( 'audio', $post ) ) {
|
|
$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );
|
|
} elseif ( wp_attachment_is( 'video', $post ) ) {
|
|
$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );
|
|
}
|
|
}
|
|
|
|
if ( $thumbnail_support ) {
|
|
$featured_image_id = get_post_meta( $post->ID, '_thumbnail_id', true );
|
|
$settings['post']['featuredImageId'] = $featured_image_id ? $featured_image_id : -1;
|
|
}
|
|
}
|
|
|
|
$hier = $post && is_post_type_hierarchical( $post->post_type );
|
|
|
|
$strings = array(
|
|
// Generic
|
|
'url' => __( 'URL' ),
|
|
'addMedia' => __( 'Add Media' ),
|
|
'search' => __( 'Search' ),
|
|
'select' => __( 'Select' ),
|
|
'cancel' => __( 'Cancel' ),
|
|
'update' => __( 'Update' ),
|
|
'replace' => __( 'Replace' ),
|
|
'remove' => __( 'Remove' ),
|
|
'back' => __( 'Back' ),
|
|
/*
|
|
translators: This is a would-be plural string used in the media manager.
|
|
If there is not a word you can use in your language to avoid issues with the
|
|
lack of plural support here, turn it into "selected: %d" then translate it.
|
|
*/
|
|
'selected' => __( '%d selected' ),
|
|
'dragInfo' => __( 'Drag and drop to reorder media files.' ),
|
|
|
|
// Upload
|
|
'uploadFilesTitle' => __( 'Upload Files' ),
|
|
'uploadImagesTitle' => __( 'Upload Images' ),
|
|
|
|
// Library
|
|
'mediaLibraryTitle' => __( 'Media Library' ),
|
|
'insertMediaTitle' => __( 'Insert Media' ),
|
|
'createNewGallery' => __( 'Create a new gallery' ),
|
|
'createNewPlaylist' => __( 'Create a new playlist' ),
|
|
'createNewVideoPlaylist' => __( 'Create a new video playlist' ),
|
|
'returnToLibrary' => __( '← Return to library' ),
|
|
'allMediaItems' => __( 'All media items' ),
|
|
'allDates' => __( 'All dates' ),
|
|
'noItemsFound' => __( 'No items found.' ),
|
|
'insertIntoPost' => $hier ? __( 'Insert into page' ) : __( 'Insert into post' ),
|
|
'unattached' => __( 'Unattached' ),
|
|
'trash' => _x( 'Trash', 'noun' ),
|
|
'uploadedToThisPost' => $hier ? __( 'Uploaded to this page' ) : __( 'Uploaded to this post' ),
|
|
'warnDelete' => __( "You are about to permanently delete this item.\n 'Cancel' to stop, 'OK' to delete." ),
|
|
'warnBulkDelete' => __( "You are about to permanently delete these items.\n 'Cancel' to stop, 'OK' to delete." ),
|
|
'warnBulkTrash' => __( "You are about to trash these items.\n 'Cancel' to stop, 'OK' to delete." ),
|
|
'bulkSelect' => __( 'Bulk Select' ),
|
|
'cancelSelection' => __( 'Cancel Selection' ),
|
|
'trashSelected' => __( 'Trash Selected' ),
|
|
'untrashSelected' => __( 'Untrash Selected' ),
|
|
'deleteSelected' => __( 'Delete Selected' ),
|
|
'deletePermanently' => __( 'Delete Permanently' ),
|
|
'apply' => __( 'Apply' ),
|
|
'filterByDate' => __( 'Filter by date' ),
|
|
'filterByType' => __( 'Filter by type' ),
|
|
'searchMediaLabel' => __( 'Search Media' ),
|
|
'noMedia' => __( 'No media attachments found.' ),
|
|
|
|
// Library Details
|
|
'attachmentDetails' => __( 'Attachment Details' ),
|
|
|
|
// From URL
|
|
'insertFromUrlTitle' => __( 'Insert from URL' ),
|
|
|
|
// Featured Images
|
|
'setFeaturedImageTitle' => __( 'Set Featured Image' ),
|
|
'setFeaturedImage' => __( 'Set featured image' ),
|
|
|
|
// Gallery
|
|
'createGalleryTitle' => __( 'Create Gallery' ),
|
|
'editGalleryTitle' => __( 'Edit Gallery' ),
|
|
'cancelGalleryTitle' => __( '← Cancel Gallery' ),
|
|
'insertGallery' => __( 'Insert gallery' ),
|
|
'updateGallery' => __( 'Update gallery' ),
|
|
'addToGallery' => __( 'Add to gallery' ),
|
|
'addToGalleryTitle' => __( 'Add to Gallery' ),
|
|
'reverseOrder' => __( 'Reverse order' ),
|
|
|
|
// Edit Image
|
|
'imageDetailsTitle' => __( 'Image Details' ),
|
|
'imageReplaceTitle' => __( 'Replace Image' ),
|
|
'imageDetailsCancel' => __( 'Cancel Edit' ),
|
|
'editImage' => __( 'Edit Image' ),
|
|
|
|
// Crop Image
|
|
'chooseImage' => __( 'Choose Image' ),
|
|
'selectAndCrop' => __( 'Select and Crop' ),
|
|
'skipCropping' => __( 'Skip Cropping' ),
|
|
'cropImage' => __( 'Crop Image' ),
|
|
'cropYourImage' => __( 'Crop your image' ),
|
|
'cropping' => __( 'Cropping…' ),
|
|
'suggestedDimensions' => __( 'Suggested image dimensions:' ),
|
|
'cropError' => __( 'There has been an error cropping your image.' ),
|
|
|
|
// Edit Audio
|
|
'audioDetailsTitle' => __( 'Audio Details' ),
|
|
'audioReplaceTitle' => __( 'Replace Audio' ),
|
|
'audioAddSourceTitle' => __( 'Add Audio Source' ),
|
|
'audioDetailsCancel' => __( 'Cancel Edit' ),
|
|
|
|
// Edit Video
|
|
'videoDetailsTitle' => __( 'Video Details' ),
|
|
'videoReplaceTitle' => __( 'Replace Video' ),
|
|
'videoAddSourceTitle' => __( 'Add Video Source' ),
|
|
'videoDetailsCancel' => __( 'Cancel Edit' ),
|
|
'videoSelectPosterImageTitle' => __( 'Select Poster Image' ),
|
|
'videoAddTrackTitle' => __( 'Add Subtitles' ),
|
|
|
|
// Playlist
|
|
'playlistDragInfo' => __( 'Drag and drop to reorder tracks.' ),
|
|
'createPlaylistTitle' => __( 'Create Audio Playlist' ),
|
|
'editPlaylistTitle' => __( 'Edit Audio Playlist' ),
|
|
'cancelPlaylistTitle' => __( '← Cancel Audio Playlist' ),
|
|
'insertPlaylist' => __( 'Insert audio playlist' ),
|
|
'updatePlaylist' => __( 'Update audio playlist' ),
|
|
'addToPlaylist' => __( 'Add to audio playlist' ),
|
|
'addToPlaylistTitle' => __( 'Add to Audio Playlist' ),
|
|
|
|
// Video Playlist
|
|
'videoPlaylistDragInfo' => __( 'Drag and drop to reorder videos.' ),
|
|
'createVideoPlaylistTitle' => __( 'Create Video Playlist' ),
|
|
'editVideoPlaylistTitle' => __( 'Edit Video Playlist' ),
|
|
'cancelVideoPlaylistTitle' => __( '← Cancel Video Playlist' ),
|
|
'insertVideoPlaylist' => __( 'Insert video playlist' ),
|
|
'updateVideoPlaylist' => __( 'Update video playlist' ),
|
|
'addToVideoPlaylist' => __( 'Add to video playlist' ),
|
|
'addToVideoPlaylistTitle' => __( 'Add to Video Playlist' ),
|
|
);
|
|
|
|
/**
|
|
* Filter the media view settings.
|
|
*
|
|
* @since 3.5.0
|
|
*
|
|
* @param array $settings List of media view settings.
|
|
* @param WP_Post $post Post object.
|
|
*/
|
|
$settings = apply_filters( 'media_view_settings', $settings, $post );
|
|
|
|
/**
|
|
* Filter the media view strings.
|
|
*
|
|
* @since 3.5.0
|
|
*
|
|
* @param array $strings List of media view strings.
|
|
* @param WP_Post $post Post object.
|
|
*/
|
|
$strings = apply_filters( 'media_view_strings', $strings, $post );
|
|
|
|
$strings['settings'] = $settings;
|
|
|
|
// Ensure we enqueue media-editor first, that way media-views is
|
|
// registered internally before we try to localize it. see #24724.
|
|
wp_enqueue_script( 'media-editor' );
|
|
wp_localize_script( 'media-views', '_wpMediaViewsL10n', $strings );
|
|
|
|
wp_enqueue_script( 'media-audiovideo' );
|
|
wp_enqueue_style( 'media-views' );
|
|
if ( is_admin() ) {
|
|
wp_enqueue_script( 'mce-view' );
|
|
wp_enqueue_script( 'image-edit' );
|
|
}
|
|
wp_enqueue_style( 'imgareaselect' );
|
|
wp_plupload_default_settings();
|
|
|
|
require_once ABSPATH . WPINC . '/media-template.php';
|
|
add_action( 'admin_footer', 'wp_print_media_templates' );
|
|
add_action( 'wp_footer', 'wp_print_media_templates' );
|
|
add_action( 'customize_controls_print_footer_scripts', 'wp_print_media_templates' );
|
|
|
|
/**
|
|
* Fires at the conclusion of wp_enqueue_media().
|
|
*
|
|
* @since 3.5.0
|
|
*/
|
|
do_action( 'wp_enqueue_media' );
|
|
}
|
|
|
|
/**
|
|
* Gets a list of months in which media has been uploaded
|
|
*
|
|
* Queries the DB to check in which months media items have been uploaded, then
|
|
* caches that query which can be expensive on larger sites
|
|
*
|
|
* @return array An array of objects representing rows from the DB query
|
|
*/
|
|
function burst_get_media_months() {
|
|
$media_months = apply_filters( 'burst_get_media_months', null );
|
|
if ( null === $media_months ) {
|
|
$months = get_transient( 'media_months' );
|
|
if ( false === $months ) {
|
|
global $wpdb;
|
|
$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'
|
|
)
|
|
);
|
|
set_transient( 'media_months', $months );
|
|
}
|
|
}
|
|
|
|
return $media_months;
|
|
}
|
|
|
|
function burst_check_media_months( $post_id ) {
|
|
|
|
// What month/year is the most recent attachment?
|
|
global $wpdb;
|
|
$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
|
|
LIMIT 1
|
|
",
|
|
'attachment'
|
|
)
|
|
);
|
|
|
|
// Simplify by assigning the object to $months
|
|
$month_values = array_values( $months );
|
|
$months = array_shift( $month_values );
|
|
|
|
// Compare the dates of the new, and most recent, attachment
|
|
if (
|
|
! $months->year == get_the_time( 'Y', $post_id ) &&
|
|
! $months->month == get_the_time( 'm', $post_id )
|
|
) {
|
|
// the new attachment is not in the same month/year as the
|
|
// most recent attachment, so we need to refresh the transient
|
|
delete_transient( 'media_months' );
|
|
}
|
|
}
|
|
add_action( 'add_attachment', 'burst_check_media_months' );
|