在开发 WordPress 主题或插件时,后台页面的 CSS 和 JS 你正确加载了吗?最近看了很多主题和插件,竟然大部分都是直接使用 wp_enqueue_style、wp_enqueue_script ,是不是感觉就应该是这样?你在后台打开另外一个页面查看一下源代码,是不是发现你的 CSS 也加载了?后台每个页面都加载了,不仅降低了性能,更有可能造成冲突。
如何解决这个问题呢,下面是比较常用的几种方法:
一、使用 admin_enqueue_scripts 传递过来的$hook_suffix 参数判断。
二、使用 admin_print_scripts-(page_hook)、admin_print_styles-(page_hook)。
三、使用全局变量$pangenow 判断当前页面。
四、使用 get_current_screen()的 id 判断。
第一种方法:
第一步:添加自定义菜单时赋值到一个参数:
$page_hook = add_menu_page( …… );
第二部:加载时判断页面:
if ( $page_hook === $hook ) { wp_enqueue_style( …… ); wp_enqueue_script( …… ); }
现在有两个问题,如果写在两个函数中$page_hook 是独立的,$hook 是哪里来的?
1、将$page_hook 声明为全局变量。
2、$hook 由 admin_enqueue_scripts 传递过来。
看完完整代码就明白了:
/** * 添加动作 */ add_action( 'admin_menu', 'pageMenu' ); add_action( 'admin_enqueue_scripts', 'loadStatic' ); /** * 页面菜单 */ function pageMenu() { global $page_hook; $page_hook = add_menu_page( …… ); } /** * 加载静态文件 */ function loadStatic( $hook ) { global $page_hook; if ( $page_hook === $hook ) { wp_enqueue_style( …… ); wp_enqueue_script( …… ); } }
如果是添加 METABOX 等无法获取 PAGE_HOOK 的,直接对比 HOOK 的值:
/** * 添加动作 */ add_action( 'admin_enqueue_scripts', 'loadStatic' ); /** * 加载静态文件 */ function loadStatic( $hook ) { if ( $hook === 'post-new.php' || $hook === 'post.php' ) { wp_enqueue_style( …… ); wp_enqueue_script( …… ); } }
第二种方法:
第二种方法是使用动作钩子,很简单不多解释,直接上代码:
global $page_hook; /** * 添加动作 */ add_action( 'admin_menu', 'pageMenu' ); add_action( 'admin_print_scripts-' . $page_hook, 'loadStatic' ); /** * 页面菜单 */ function pageMenu() { global $page_hook; $page_hook = add_menu_page( …… ); } /** * 加载静态文件 */ function loadStatic( ) { wp_enqueue_style( …… ); wp_enqueue_script( …… ); }
第三种方法:
直接在加载 CSS 和 JS 和函数里调用全局变量$pagenow 做判断:
//* 全局变量 global $pagenow //* 判断 PAGENOW if ( $pagenow === 'post-new.php' || $pagenow === 'post.php' ) { wp_enqueue_style(...); wp_enqueue_script(...); }
第四种方法:
直接在加载 CSS 和 JS 的函数里判断 screen id:
//* 获取对象 $screen = get_current_screen(); //* 判断页面 ID if ( $screen->id === 'post' ) { wp_enqueue_style(...); wp_enqueue_script(...); }
上面 post 就是发表、编辑文章页面,如何知道自己的页面 ID 呢,页面中插入下列代码:
<?php echo '<pre>' . print_r(get_current_screen(), true) . '</pre>'; ?>
看一下显示的 ID 内容就行了,这种方法也可以用在自己添加的页面里,你看过几个页面之后就会发现规律的。
总结一下:
1、一般情况推荐使用第一种方法。
2、第三、四种方法比较灵活,可根据自己的实际情况选择使用。
添加 METABOX 等无法获取 PAGE_HOOK 的说一下区别:
$hook === ‘post-new.php’ || $hook === ‘post.php’
$pagenow === ‘post-new.php’ || $pagenow === ‘post.php’
上面两种方式在文章和页面的添加编辑时生效。
$screen->id === ‘post’
只在文章的添加和编辑时生效。
$screen->id === ‘page’
只在页面的添加和编辑时生效。
还没有任何评论!