I’m building a plugin and I want to add bits of javascript in the admin head but only for certain admin pages. I don’t mean pages as in a WordPress page that you create yourself but rather existing admin section pages like ‘Your Profile’, ‘Users’, etc. Is there a wp function specifically for this task? I’ve been looking and I can only find the boolean function is_admin and action hooks but not a boolean function that just checks.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The way to do this is to use the ‘admin_enqueue_scripts’ hook to en-queue the files you need. This hook will get passed a $hook_suffix that relates to the current page that is loaded:
function my_admin_enqueue($hook_suffix) {
if($hook_suffix == 'appearance_page_theme-options') {
wp_enqueue_script('my-theme-settings', get_template_directory_uri() . '/js/theme-settings.js', array('jquery'));
wp_enqueue_style('my-theme-settings', get_template_directory_uri() . '/styles/theme-settings.css');
?>
<script type="text/javascript">
//<![CDATA[
var template_directory = '<?php echo get_template_directory_uri() ?>';
//]]>
</script>
<?php
}
}
add_action('admin_enqueue_scripts', 'my_admin_enqueue');
Method 2
There is a global variable in wp-admin called $pagenow which holds name of the current page, ie edit.php, post.php, etc.
You can also check the $_GET request to narrow your location down further, for example:
global $pagenow;
if (( $pagenow == 'post.php' ) && ($_GET['post_type'] == 'page')) {
// editing a page
}
if ($pagenow == 'users.php') {
// user listing page
}
if ($pagenow == 'profile.php') {
// editing user profile page
}
Method 3
The most comprehensive method is get_current_screen added in WordPress 3.1
$screen = get_current_screen();
returns
WP_Screen Object (
[action] =>
[base] => post
[id] => post
[is_network] =>
[is_user] =>
[parent_base] => edit
[parent_file] => edit.php
[post_type] => post
[taxonomy] =>
)
Method 4
To offer an alternative method/approach to the above question.
// When you are viewing the users list or your editing another user's profile
add_action( 'admin_print_scripts-users.php', 'your_enqueue_callback' );
// When you are editing your own profile
add_action( 'admin_print_scripts-profile.php', 'your_enqueue_callback' );
function your_enqueue_callback() {
wp_enqueue_script( .. YOUR ENQUEUE ARGS .. );
}
This method targets the specific pages more directly and avoids needing conditional logic inside your callback(because you’ve already made that distinction in the selected hook).
Method 5
I find it weird that no one has mentioned the fact that the add_menu_page function returns an action hook which you can use to do certain actions only on those pages
$hook = add_menu_page($menu_title, $page_title, $capability, $slug, $function, $icon_url, $position);
add_action( 'load-' . $hook, 'my_admin_enqueue_scripts' );
function my_admin_enqueue_scripts() {
wp_enqueue_script(/*...*/);
wp_enqueue_style(/*...*/);
}
If you need the $hook and you didn’t add the menu page yourself the doc is here
For instance the hook for a top level menu page is
load-toplevel_page_$MenuSlug
The hook for a submenu page is
load-$MenuSlug_page_$SubMenuSlug
Following that logic, the hook for the user’s profile page is
load-users_page_profile
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0