Wordpress:wp_enqueue_media导致来自/wp-admin/upload.php?mode=list页面的javascript错误

mat*_*ani 0 wordpress

我正在使用Wordpress 4.0,我正在wp_enqueue_media从不同的wp-admin页面调用,因为我正在编写的插件使得不仅可以从wp-adminWordpress核心已经允许的页面上传图像.

我是这样打电话的wp_enqueue_media:

function my_admin_load_styles_and_scripts() {
    wp_enqueue_media();
}
add_action( 'admin_enqueue_scripts', 'my_admin_load_styles_and_scripts' );
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,当从/wp-admin/upload.php?mode=list页面调用时,此enqueue会导致以下javascript异常:

TypeError: wp.media(...) is undefined

所有其他页面工作得很好,甚至 /wp-admin/upload.php?mode=grid

有任何想法吗?谢谢你的帮助

Dan*_*l C 7

我遇到了同样的问题......我所做的就是确保我没有在upload.php页面上包含wp_enqueue_media()!在这个if语句中包装你的函数

if( is_admin() && ! empty ( $_SERVER['PHP_SELF'] ) && 'upload.php' !== basename( $_SERVER['PHP_SELF'] ) ) {
    function my_admin_load_styles_and_scripts() {
        wp_enqueue_media();
    }
    add_action( 'admin_enqueue_scripts', 'my_admin_load_styles_and_scripts' );
}
Run Code Online (Sandbox Code Playgroud)

"is_admin()"部分还确保仅在管理区域中运行,而不是在前端运行.在我看来,让事情变得更加清晰.

更新:1

这是我通过一些研究发现的.当您查看wp-admin/upload.php时,网格布局有一个新的部分.在该部分中,您将获得以下调用(第24-26行):

wp_enqueue_media();
wp_enqueue_script( 'media-grid' );
wp_enqueue_script( 'media' );
Run Code Online (Sandbox Code Playgroud)

你可能在这里没有得到任何错误,因为它wp_enqueue_media()有一个内置的检查,以确保每页只调用一次(wp-includes/media.php中的第2785行).

在upload.php页面的下方,在网格代码之后,您只能看到以下调用(第192行):

wp_enqueue_script( 'media' );
Run Code Online (Sandbox Code Playgroud)

没有调用wp_enqueue_media()(WordPress中的错误?我不知道),但是这一行导致了这个问题.您可以将代码更新为:

if( is_admin() ) {
    function my_admin_load_styles_and_scripts() {
        $mode = get_user_option( 'media_library_mode', get_current_user_id() ) ? get_user_option( 'media_library_mode', get_current_user_id() ) : 'grid';
        $modes = array( 'grid', 'list' );
        if ( isset( $_GET['mode'] ) && in_array( $_GET['mode'], $modes ) ) {
            $mode = $_GET['mode'];
            update_user_option( get_current_user_id(), 'media_library_mode', $mode );
        }
        if( ! empty ( $_SERVER['PHP_SELF'] ) && 'upload.php' === basename( $_SERVER['PHP_SELF'] ) && 'grid' !== $mode ) {
            wp_dequeue_script( 'media' );
        }
        wp_enqueue_media();
    }
    add_action( 'admin_enqueue_scripts', 'my_admin_load_styles_and_scripts' );
}
Run Code Online (Sandbox Code Playgroud)

它会阻止错误......

说明:第3-8行直接取自wp-admin/upload.php(第15-21行).当您在upload.php上显示时,他们只会告诉您是否正在查看网格模式或列表模式.这很重要,因为无论您选择哪种模式,它都会作为选项保存在数据库中.下次返回上载页面时,不使用URL中的查询字符串,但选项为.因此,仅定位URL中的查询字符串是不可靠的.在第9行,我们已经移动了检查,因为我们只想在upload.php页面上发生这种有效的代码,并且只在我们处于列表模式时删除脚本.第10行取消注册页面的脚本.

但是我不知道删除媒体脚本还会在upload.php列表视图中"中断".而且我不知道是否通过使用wp_enqueue_media()将其添加到了某个地方,因为我没有时间完全查看该功能.我在调用wp_enqueue_media()之后尝试将其添加回来,但是出现了同样的错误.但希望这会让你朝着正确的方向前进.