Загрузка скрипта только для произвольного типа записей в админке

28 нояб. 2011 г., 05:56:48
Просмотры: 38.3K
Голосов: 24

Я создал произвольный тип записей "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?

1
Комментарии

К вашему сведению: подключение скриптов (enqueues) не должно происходить на хуке init.. (многие так делают, но это неправильное место для enqueue)..

t31os t31os
29 нояб. 2011 г. 17:40:59
Все ответы на вопрос 3
1
37

Попробуйте этот код для добавления скриптов на страницы редактирования вашего пользовательского типа записи "Портфолио".

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' );
}
28 нояб. 2011 г. 06:25:29
Комментарии

больше не актуально. Ответ @Smartik теперь является правильным подходом.

Yaron Yaron
24 февр. 2017 г. 00:11:52
0
36

Я предложу лучшее решение, потому что принятый ответ устарел и использует неправильные хуки.

Во-первых: Для подключения скриптов и стилей в админ-панели 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' на нужный слаг типа записи.

24 окт. 2016 г. 14:57:45
0
// Добавление пользовательского 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 в подвал
}

Я внес некоторые изменения в этот код, чтобы он работал для меня:

  1. Заменил get_stylesheet_directory_uri() . '/admin.js' на plugins_url( '/js/admin.js', __FILE__), - это было необходимо, потому что я разработал плагин для баннера, что является лучшим решением, чем создание CPT в functions.php

  2. Добавил "true", чтобы отправлять код в подвал (footer) вместо head - это улучшает время загрузки

18 дек. 2013 г. 19:39:19