Wordpress:wp\u enqueue\u媒体导致/wp admin/upload.php?mode=列表页的javascript错误

Wordpress:wp\u enqueue\u媒体导致/wp admin/upload.php?mode=列表页的javascript错误,wordpress,Wordpress,我正在使用Wordpress 4.0,我正在从不同的wp管理页面调用wp_enqueue_media,因为我正在编写的插件不仅可以从Wordpress core已经允许的wp管理页面上传图像 我用这种方式给wp_enqueue_media打电话: function my_admin_load_styles_and_scripts() { wp_enqueue_media(); } add_action( 'admin_enqueue_scripts', 'my_admin_load_st

我正在使用Wordpress 4.0,我正在从不同的wp管理页面调用wp_enqueue_media,因为我正在编写的插件不仅可以从Wordpress core已经允许的wp管理页面上传图像

我用这种方式给wp_enqueue_media打电话:

function my_admin_load_styles_and_scripts() {
    wp_enqueue_media();
}
add_action( 'admin_enqueue_scripts', 'my_admin_load_styles_and_scripts' );
我面临的问题是,当从/wp admin/upload.php?mode=list页面调用此队列时,会导致以下javascript异常:

类型错误:wp.media。。。是未定义的

所有其他页面都工作正常,甚至/wp admin/upload.php?mode=grid


有什么想法吗?谢谢你的帮助

我也遇到了同样的问题。。。我所做的修复是确保我没有在upload.php页面上包含wp_enqueue_媒体!在这个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' );
}
is_管理部分还确保这只在管理区域运行,而不是在前端运行。在我看来,这只会让事情变得更干净一点

更新:1

这是我通过一些研究发现的。当您签出wp admin/upload.php时,网格布局有一个新的部分。在该部分中,您将看到以下称为第24-26行的内容:

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

在upload.php页面的下一步,在网格代码之后,您只会看到以下调用行:

wp_enqueue_script( 'media' );
WordPress中没有wp_enqueue_媒体错误?我不知道,但正是这条线引起了问题。您可以将代码更新为:

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' );
}
它停止了错误

说明:第3-8行直接取自wp admin/upload.php第15-21行。当您显示在upload.php上时,他们只会告诉您是查看网格模式还是列表模式。这很重要,因为无论选择哪种模式,它都会作为选项保存在数据库中。下次返回上载页面时,不会使用URL中的查询字符串,但会使用选项。因此,仅针对URL中的查询字符串是不可靠的。在第9行,我们移动了检查,因为我们只希望在upload.php页面上出现这段可减轻处罚的代码,并且只在列表模式下删除脚本。第10行取消注册页面的脚本


但是,我不知道删除媒体脚本会破坏upload.php列表视图中的其他内容。我不知道它是否是通过使用wp_enqueue_媒体添加回来的,因为我还没来得及仔细查看这个函数。在我呼叫wp_enqueue_media后,我尝试将其添加回,但出现了相同的错误。但希望这能让你走上正确的方向。

I丹尼尔,谢谢你的反馈。这与我目前使用的修复程序相同,但我的问题是,我实际上也需要该页面中的wp_enqueue_媒体…我必须问,您如何需要该功能在该页面上运行?您是否有为该页面编写的特殊功能?是的,我正在从该页面调用媒体上载/选择灯箱,它在网格视图模式下工作正常,不幸的是在列表模式下失败,出现js错误谢谢Daniel,您是对的!可能是wp错误或向后不兼容:wp_dequeue_脚本'media';而在列表视图中完成了这个任务!