Загрузка скрипта только для произвольного типа записей в админке
Я создал произвольный тип записей "portfolio" примерно таким образом:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
//'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => 4,
'taxonomies' => array('post_tag','category'),
'supports' => array('title','editor','comments','trackbacks','revisions','custom-fields','page-attributes','thumbnail', 'excerpt', 'tags')
);
register_post_type( 'portfolio' , $args );
И у меня есть другие произвольные поля с действием:
add_action("admin_init", "admin_init");
function admin_init(){ // add_meta_box( $id, $заголовок, $функция_обратного_вызова, $страница, $контекст, $приоритет );
add_meta_box("media", "Тип медиа", "media", "portfolio", "side", "high");
add_meta_box("map_meta", "Информация о карте", "map_meta", "portfolio", "normal", "high");
}
Хотя раньше это работало, я не могу понять, как загрузить скрипты только для этой страницы. Сейчас они просто находятся вместе с остальными wp_enqueue_script
таким образом:
function my_init() {
if (!is_admin()) {
....
}
if (is_admin()) {
wp_register_script('Gmaps', 'http://maps.google.com/maps/api/js?sensor=false', false, '3.0', false);
wp_enqueue_script('Gmaps');
wp_register_style('admin_js', get_bloginfo('template_directory') . '/admin.js');
wp_enqueue_script('admin_js');
wp_register_script('Zmaps', get_bloginfo('template_directory') .'/scripts/maps.js', array('Gmaps'), '1.0', true);
wp_enqueue_script('Zmaps');
}
}
add_action('wp_enqueue_scripts', 'my_init');
Но ничего из этого не загружается. Как я могу загрузить эти скрипты на страницах админки? Или еще лучше, как загрузить их конкретно для страниц редактирования произвольного типа записей portfolio?
Попробуйте этот код для добавления скриптов на страницы редактирования вашего пользовательского типа записи "Портфолио".
add_action( 'admin_print_scripts-post-new.php', 'portfolio_admin_script', 11 );
add_action( 'admin_print_scripts-post.php', 'portfolio_admin_script', 11 );
function portfolio_admin_script() {
global $post_type;
if( 'portfolio' == $post_type )
wp_enqueue_script( 'portfolio-admin-script', get_stylesheet_directory_uri() . '/admin.js' );
}

Я предложу лучшее решение, потому что принятый ответ устарел и использует неправильные хуки.
Во-первых: Для подключения скриптов и стилей в админ-панели WordPress должен использоваться хук admin_enqueue_scripts
и никакой другой.
Во-вторых: Забудьте про глобальные переменные. Используйте объект текущего экрана для выполнения различных проверок.
Вот готовый код для копирования:
<?php
function wpse_cpt_enqueue( $hook_suffix ){
$cpt = 'portfolio';
if( in_array($hook_suffix, array('post.php', 'post-new.php') ) ){
$screen = get_current_screen();
if( is_object( $screen ) && $cpt == $screen->post_type ){
// Регистрируем, подключаем скрипты и стили здесь
}
}
}
add_action( 'admin_enqueue_scripts', 'wpse_cpt_enqueue');
Примечание: Замените 'portfolio'
на нужный слаг типа записи.

// Добавление пользовательского JS в админку
add_action( 'admin_print_scripts-post-new.php', 'banner_admin_script', 11 );
add_action( 'admin_print_scripts-post.php', 'banner_admin_script', 11 );
function banner_admin_script() {
global $post_type;
if ( $post_type == 'banner' )
wp_enqueue_script( 'portfolio-admin-script', plugins_url( '/js/admin.js',
__FILE__), '', '', true ); // "TRUE" - добавляет JS в подвал
}
Я внес некоторые изменения в этот код, чтобы он работал для меня:
Заменил
get_stylesheet_directory_uri() . '/admin.js'
наplugins_url( '/js/admin.js', __FILE__),
- это было необходимо, потому что я разработал плагин для баннера, что является лучшим решением, чем создание CPT вfunctions.php
Добавил "
true
", чтобы отправлять код в подвал (footer) вместо head - это улучшает время загрузки
