wp_enqueue_style()
と wp_enqueue_script()
を使ってものをロードする単純な関数が2つあります。
function admin_custom_css()
{ wp_enqueue_style( 'stylesheet_name', 'stylesheet.css') };
function admin_custom_js
{ wp_enqueue_script( 'javascript_file', 'script.js') };
...と add_menu_page()
と add_submenu_page()
で作成されたいくつかの管理ページ
function my_menu() {
add_menu_page('Page 1', 'bar', 'something', 'else', 'foo');
add_submenu_page( 'theme_menu', 'Subpage 1', 'Subpage', 'something', 'else', 'foo');
}
add_action('admin_menu', 'my_menu');
これらのページにのみ2つの関数を読み込むにはどうすればいいですか?
今使っている:
add_action('admin_init', 'admin_custom_css' );
add_action('admin_init', 'admin_custom_js' );
しかし、それはすべての管理者ページに私のファイルをロードします。これはまったくいいことではありません。
これをfunctions.php
の簡単な一行で行うことも、私のページ内で別々にエンキューしなければならないこともできます(最初のオプションを強くお勧めします。多くのadmin-page-creating-functionsを編集する必要があります)。
ありがとうございます。
add_menu_page
とadd_submenu_page
はどちらもページの「フックサフィックス」を返します。これは特定のフックでページを識別するために使用できます。そのため、これらのページを明確にターゲットとするために、その接尾辞を変数フックadmin_print_styles-{$hook_suffix}
およびadmin_print_scripts-{$hook_suffix}
と組み合わせて使用することができます。
function my_menu() {
$menu = add_menu_page( 'Page 1', 'bar', 'something', 'else', 'foo' );
$submenu = add_submenu_page( 'theme_menu', 'Subpage 1', 'Subpage', 'something', 'else', 'foo' );
add_action( 'admin_print_styles-' . $menu, 'admin_custom_css' );
add_action( 'admin_print_styles-' . $submenu, 'admin_custom_css' );
add_action( 'admin_print_scripts-' . $menu, 'admin_custom_js' );
add_action( 'admin_print_scripts-' . $submenu, 'admin_custom_js' );
}
これはすべて1つの関数内で処理されるため、これをすべて追加するためのクリーンな方法であると思います。この機能を削除することにした場合は、単に1つの関数への呼び出しを削除してください。
@tollmanz答えの問題点は、-print-stylesフックと-print-scriptsフックからフックしているので、手動でスクリプトをロードするためにHTMLを生成しなければならないことです。 wp_enqueue_script()
とwp_enqueue_style()
に付属するNiceの依存関係とバージョン管理が得られないので、これは最適ではありません。それが彼らにとってより良い場所であるならば、それはあなたがフッターに物事を置くこともできません。
それでは、OPの質問に戻ります。特定の管理ページにのみJS/CSSをエンキューできるようにするための最善の方法は何ですか?
「load - {$ my_admin_page}」アクションをフックして、自分の特定のプラグインの管理ページがロードされたときにのみ処理を行います。
wp_enqueue_script
呼び出しを正しく追加するには、「admin_enqueue_scripts」アクションをフックします。
ちょっとした痛みのように思えますが、実際には非常に実装が簡単です。上から:
add_action( 'admin_menu', 'add_my_admin_menus' ); // hook so we can add menus to our admin left-hand menu
/**
* Create the administration menus in the left-hand nav and load the JavaScript conditionally only on that page
*/
function add_my_admin_menus(){
$my_page = add_menu_page( 'Page Title', 'Menu Title', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content' );
// Load the JS conditionally
add_action( 'load-' . $my_page, 'load_admin_js' );
}
// This function is only called when our plugin's page loads!
function load_admin_js(){
// Unfortunately we can't just enqueue our scripts here - it's too early. So register against the proper action hook to do it
add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' );
}
function enqueue_admin_js(){
// Isn't it Nice to use dependencies and the already registered core js files?
wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
}
}
get_current_screen()
を使用すると、現在表示しているページが何であるかを検出できます。私がリンクしたコーデックスの記事にget_current_screen()
をadd_options_page()
と一緒に使う方法を示す例があります。このメソッドはどの管理ページにも使えます。
あなたは @tollmanz
answer を取ることができ、そしてそれをわずかに拡張して、同様に条件付き使用を可能にすることができます...
例:
/* Add admin pages */
function my_admin_pages(){
$menu = array();
$menu['main_page'] = add_menu_page('Page 1', 'bar', 'something', 'else', 'foo');
$menu['sub_page'] = add_submenu_page('theme_menu', 'Subpage 1', 'Subpage', 'something', 'else', 'foo');
foreach($menu as $key => $value){
if($key == 'main_page'){
/* Print styles on only the main page. */
add_action('admin_print_styles-'.$value, 'print_styles');
}
/* Print scripts on all of our admin pages. */
add_action('admin_print_scripts-'.$value, 'print_scripts');
}
}
add_action('admin_menu', 'my_admin_pages');
私は同じことを思っていました。 admin_enqueue_scripts
を使用する最新バージョンがあります。
add_action('admin_menu', function () {
$settingsPage = add_options_page('Settings', 'Mortgage Calculator', 'manage_options', 'mortgagecalculator', function () {
echo "<div id='app'></div>";
});
/**
* Include the ember admin scripts only on pages where it's needed.
*/
add_action("admin_enqueue_scripts", function ($hook) use ($settingsPage){
if($hook !== $settingsPage){
return;
}
// Remove default jQuery since Ember provides its own.
wp_dequeue_script('jquery');
wp_enqueue_script('ember-vendor', plugins_url("admin/assets/vendor.js", __FILE__));
wp_enqueue_script('ember-project', plugins_url("admin/assets/mortgage-plugin-ember-admin.js", __FILE__), ['ember-vendor']);
wp_enqueue_script('ember-live-reload', "http://localhost:4200/ember-cli-live-reload.js");
});
});
@ mor7iferが上述したように、ネイティブのWordPress関数 get_current_screen() を使うことができます。この関数の出力をループすると、例えば:
$current_screen = get_current_screen();
foreach($current_screen as $key => $value) {
error_log(print_r($key,1));
}
... base というキーがあります。私はこれを使用して、自分が現在どのページにアクセスしているかを検出し、エンキューします。
add_action('admin_enqueue_scripts', 'some_hook_function')* ):
public function some_hook_function(){
// # only register and queue scripts & styles on POST edit screen of admin
$current_page = get_current_screen()->base;
if($current_page == 'post' || $current_page == 'page') {
wp_enqueue_script('datetimepicker', plugins_url('assets/jquery-ui-timepicker-addon.min.js', __FILE__), array('jquery', 'jquery-ui-datepicker', 'jquery-ui-slider'), '1.9.1', true);
wp_enqueue_style( 'jquery-ui-datepicker', plugins_url('assets/jquery-ui.min.css', __FILE__), array(), '1.11.2', 'all');
} else { // # if not on post page, deregister and dequeue styles & scripts
wp_dequeue_script('datetimepicker');
wp_dequeue_style('jquery-ui-datepicker');
}
}
それをするために、あなたは最初に管理者ページ名を見つけなければなりません。 wp_die($hook)
と一緒にadmin_enqueue_scripts
を追加して、あなたの特定のプラグインページに行ってください、あなたはページ名を見るでしょう。
function my_plugin_scripts($hook) {
wp_die($hook);
}
add_action( 'admin_enqueue_scripts', 'my_plugin_scripts' );
settings_page_plugging_info
ページ名をコピーして、特定のページにスクリプトをロードするための条件として使用します。
function my_plugin_scripts($hook) {
if ( 'settings_page_plugging_info' != $hook ) {
return;
}
wp_enqueue_script( 'my_custom_script', plugins_url('js/file.js', __FILE__));
}
add_action( 'admin_enqueue_scripts', 'my_plugin_scripts' );
add_action( 'admin_menu', 'add_my_admin_menus' );
function add_my_admin_menus() {
$GLOBALS['my_page'] = add_menu_page( 'Page Title', 'Menu Title', MY_ADMIN_CAPABILITY, 'menu-slug', 'show_page_content');
add_action( 'admin_enqueue_scripts', 'enqueue_admin_js');
}
function enqueue_admin_js($hook) {
if($GLOBALS['my_page'] === $hook) {
wp_enqueue_script( 'jquery-ui-core' );
wp_enqueue_script( 'jquery-ui-tabs' );
// Isn't it Nice to use dependencies and the already registered core js files?
wp_enqueue_script( 'my-script', INCLUDES_URI . '/js/my_script.js', array( 'jquery-ui-core', 'jquery-ui-tabs' ) );
}
}
admin_print_scripts
は主にインラインJavaScriptをエコーするために使用されます。管理ページのスタイルやスクリプトをエンキューするためにadmin_print_scripts
を使用しないでください。代わりにadmin_enqueue_scripts
を使用してください。 "
admin_print_styles
と同じです。