Загрузка внешних скриптов в Admin, но ТОЛЬКО для определенного типа поста?


16

Поэтому я продолжаю сталкиваться с этой проблемой, и я просто ищу лучшее и простое решение для решения этой проблемы.

Я пришел, чтобы использовать пользовательские типы записей во многих различных проектах и ​​расширил их с помощью пользовательских метабоксов, которые я затем расширил, добавив пользовательские сценарии, такие как селекторы календаря событий jQuery ... Все это прекрасно работает, за исключением одной ключевой проблемы ... Я не хочу, чтобы эти пользовательские скрипты jQuery загружались на каждой странице администратора.

По сути, я просто ищу способ загрузить эти пользовательские поля jquery, когда я нахожусь на странице «Редактировать сообщение» для КОНКРЕТНОГО типа сообщения.

Какое лучшее решение здесь?


ОБНОВЛЕНИЕ 1

Прежде всего, большое спасибо.

Я на самом деле шокирован тем, что разработчики плагинов не уверены в таких вещах, потому что, как я выяснил, это одна из ключевых причин, по которой существуют проблемы с различными плагинами.

У меня есть некоторые дополнительные проблемы, хотя с этим. Например...

Я изменил скрипт для вызова оператора if следующим образом:

if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events')

Как вы можете видеть, я пытаюсь настроить все так, чтобы мои сценарии вызывались ТОЛЬКО при добавлении или редактировании сообщения в типе сообщения «события».

Я не хочу, чтобы скрипт загружался на любую другую страницу, а также не хочу, чтобы он запускался в списке страниц в типе записи "events", поэтому я думаю, что оператор if правильный.

Проблема, однако, заключается в том, что скрипт загружается только при создании нового поста в этом типе поста, но он не работает при редактировании существующего поста.

Не могли бы вы проверить это и, возможно, дать мне знать, что я могу делать неправильно?

Вот точный код, который я использую ... может быть, есть лучший или простой способ сделать это?

<?php
// INCLUDE METABOX CUSTOM JQUERY DATEPICKER 2
add_action('admin_init','load_admin_datapicker_script');
function load_admin_datapicker_script() {
  global $pagenow, $typenow;
  if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
    wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
    wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
    wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
    wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
  }
}

Кроме того ... если бы я хотел добавить три типа записей и загрузить разные сценарии JS для каждого типа записей, то я бы просто продублировал код, приведенный выше, три раза или это не очень хороший способ сделать это? Например ... было бы лучше просто позвонить: global $ pagenow, $ typenow; Вверху моего файла функций или это имеет значение или усложняет ситуацию, когда я дублирую его более одного раза?

По другой проблеме, связанной с тем же ... Я, например, использую плагин "гравитационные формы", но я заметил, что их скрипты запускаются на каждой странице администратора, что вызывает проблемы с другими плагинами. Как мне изменить их скрипт, чтобы скрипты загружались только тогда, когда они мне нужны.


ОБНОВЛЕНИЕ 2

Я изменил свой файл functions.php с помощью кода, предоставленного Майком (ниже), однако кажется, что применимый javascript все еще включен, когда вы создаете НОВЫЙ пост или страницу. Это означает, что при попытке создать НОВУЮ публикацию или страницу либо путем создания новой записи / страницы WordPress по умолчанию, либо при создании НОВОЙ записи / страницы на основе одного из ваших пользовательских типов записей. Код, предложенный Майком, работает на всех других страницах администратора и работает, когда вы «РЕДАКТИРУЕТЕ» существующую запись / страницу или пользовательский тип записи. Любые предложенные изменения, чтобы сделать эту работу правильной?

Вот мой текущий код:

<?php
   add_action('admin_init','load_admin_datapicker_script');
   function load_admin_datapicker_script() {
    global $pagenow, $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
        $post = get_post($_GET['post']);
        $typenow = $post->post_type;
    }
    if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }
   }
?> 

2
@ NetConstuctor.com: Не удивляйтесь , многие люди, пишущие плагины, научились программировать, чтобы они могли писать плагины и, таким образом, имели очень мало опыта программирования. Они чешутся, не следуя лучшим практикам.
MikeSchinkel

Ответы:


14

Во-первых, я предполагаю, что вы используете wp_enqueue_script()для загрузки своих скриптов , верно?

Тем не менее, если я понимаю ваш вопрос, то вам нужно что-то вроде следующего . Конечно, вам придется отредактировать его под свои данные, но это даст вам общую основу.

Мы подключаем admin_initфункцию load_my_script()для проверки глобального $pagenowна соответствие со страницей администратора edit.phpи глобального, $typenowчтобы увидеть, является ли тип сообщения тем, который вам нужен.

Остальные подробности, о которых вы можете прочитать здесь, если вам нужно узнать больше:

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if ($pagenow=='edit.php' && $typenow=='my-custom-type') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
  }
}

ОБНОВИТЬ

Я отвечаю на ваше обновление. К сожалению ( по какой-либо причине ) $typenowне имеет значения во время, admin_initпоэтому вам нужно получить его post_type, загрузив сообщение на основе параметра URL, 'post'как вы видите в следующем примере (я скопировал строку выше и строку ниже из вашего примера так что видно где его разместить)

<?php
global $pagenow, $typenow;
if (empty($typenow) && !empty($_GET['post'])) {
  $post = get_post($_GET['post']);
  $typenow = $post->post_type;
}
if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {

PS Что касается других ваших вопросов, пожалуйста, опубликуйте их как новый вопрос на сайте, чтобы я или другие могли ответить. Так как мы прилагаем все усилия, чтобы помочь вам, пожалуйста, будьте очень внимательны, чтобы дать вашему названию лучшее название, какое только возможно, а также, пожалуйста, напишите ваши вопросы максимально четко и кратко, с хорошим форматированием и надлежащим английским языком. Если вы сделаете это, это поможет с теми же проблемами признать ваш вопрос как схожий с тем, что им нужно, и облегчит нам, отвечающим на ваши вопросы.

Я прошу вас об этом ( и всех тех, кто задает вопросы об Ответах WordPress ) в качестве одолжения в обмен на то, что вы потратили время на ответы на ваши вопросы, потому что я и другие модераторы хотим сделать WordPress Ответы огромным ресурсом для сообщества вместо еще один небрежный форум, который трудно читать и найти ответы, как и многие другие сайты в Интернете.

ОБНОВЛЕНИЕ № 2

Я подумал, что у вас могли быть проблемы с приоритетом операторов в вашем операторе if, но когда я тестировал его раньше, я не сталкивался с ним. Если он ведет себя так, как вы говорите, то вы почти наверняка так и сделаете, вместо этого попробуйте это (извините, у меня нет времени, чтобы проверить это прямо сейчас, чтобы убедиться, что это работает):

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if (empty($typenow) && !empty($_GET['post'])) {
    $post = get_post($_GET['post']);
    $typenow = $post->post_type;
  }
  if (is_admin() && $typenow=='events') {
    if ($pagenow=='post-new.php' OR $pagenow=='post.php') { 
      $ss_url = get_bloginfo('stylesheet_directory');
      wp_enqueue_script('jquery');
      wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
    }
  }
}

привет Майк ... см. мой комментарий ниже ... извините, я отправил не в ту коробку
NetConstructor.com

@ NetConstuctor.com : Просьба не давать разъяснений по вашему вопросу в месте, предназначенном для ответов . Я переместил содержание, которое вы вставили в ответ, в свой вопрос и голосую, чтобы закрыть этот ответ.
MikeSchinkel

Привет, Майк ... твой код работает отлично, за исключением одной проблемы ... Когда вы находитесь на странице администратора, где вы можете добавить новый пост или новую страницу (я говорю о посте / странице по умолчанию) код javascript, который должен только быть загруженным для пользовательского типа сообщения ДОЛЖЕН быть загружен. Помимо этой проблемы, он, кажется, работает отлично и загружает только javascript для указанных типов записей. Есть ли у вас какие-либо модификации, которые вы можете предложить?
NetConstructor.com

Извините, Майк - мое первоначальное предположение было неверным. Кажется, что код, который вы предоставили, включал javascript для других типов постов, которые у меня есть. Я пошел и включил сценарий в точности, как вы предложили. Не могли бы вы повторить это еще раз?
NetConstructor.com

1
ОК ... Итак, после еще более подробного рассмотрения я обнаружил, что код Майка действительно работает везде, кроме случаев, когда вы создаете "НОВЫЙ" пост. Из того, что я вижу здесь, неправильно включается JavaScript при создании НОВОЙ СТРАНИЦЫ, НОВОГО ПОСТА для страниц / постов WordPress по умолчанию, а также для любого пользовательского типа поста, который у вас может быть. Код работает (т.е. JavaScript не включен), когда вы РЕДАКТИРУЕТЕ существующий пост или страницу, которая является постом или страницей WordPress по умолчанию или пользовательским типом поста. Может ли кто-нибудь предоставить предлагаемую модификацию, чтобы исправить эту проблему?
NetConstructor.com

3

Я подумал, что добавлю сюда код, который решил мою проблему. В моем случае я пытаюсь заставить JavaScript и CSS загружаться только на страницах и сообщениях и (редактировать и создавать), а не где-либо еще.

Я нашел работоспособное решение, basename( $_SERVER[ 'SCRIPT_FILENAME' ] )чтобы определить, где на сервере я находился. Я был обеспокоен тем, что доступность $_SERVER[ 'SCRIPT_FILENAME' ]сервера может различаться (кто-нибудь знает, насколько вероятно, что он $_SERVER[ 'SCRIPT_FILENAME' ]не будет доступен на сервере?)

Тогда я наткнулся на этот вопрос и MikeSchinkel ответ. С небольшой модификацией я заставил это работать для меня кроме одной вещи. Кажется, что по любой причине, когда новый пост создается с помощью «Добавить новый», он не работает.

Со следующими изменениями я действительно заставил это работать, и я делюсь этим здесь в надежде помочь другим и улучшить это.

add_action( 'admin_init','imp_add_admin_scripts' );

function imp_add_admin_scripts() {

 $urljs = get_bloginfo( 'template_directory' ).IMP_JS;
 $urlcss =get_bloginfo( 'template_directory' ).IMP_STYLES;

 // Register our scripts
 wp_register_script('imp_jquerytools', $urljs.'jquery/imp_tabs_jquery.tools.min.js' );
 wp_register_style( 'rpanel-css', $urlcss.'impoweradmin.css' );


 global $pagenow, $typenow;
 if ( empty( $typenow ) && !empty( $_GET['post'] ) ) {
  $post = get_post( $_GET['post'] );
  $typenow = $post->post_type;
 } elseif ( empty( $typenow ) && ( $pagenow == 'post-new.php' ) ){ 
  $typenow = 'post';
 }

 if ( is_admin() && ( ( $typenow == 'page') || ( $typenow == 'post') ) ){

  if ( $pagenow == 'post-new.php' OR $pagenow == 'post.php' ) {

   wp_enqueue_script( 'imp_jquerytools' );
   wp_enqueue_style( 'rpanel-css' );

  }
 }
}

Затем я пытаюсь ограничить некоторые скрипты на странице параметров темы, что невозможно сделать на основе $ pagenow, поскольку URL-адрес, который появляется, - admin.php? Page = themeoptions, и я не хочу, чтобы скрипты были у каждого администратора Страница .php, только на этой конкретной странице (страница настроек моей темы)

Кто-нибудь знает, как это лучше всего сделать?

И чтобы ответить на мой собственный вопрос:

if( is_admin() && ( $_GET['page'] == 'themeoptions' ) ){
  wp_enqueue_script( 'my-script' );

 }


2

Я знаю, что на вопрос был дан ответ. Я думаю, что это более простое решение.

<?php
add_action( 'admin_enqueue_scripts', 'load_admin_datapicker_script' );

function load_admin_datapicker_script() {

    $current_screen = get_current_screen();

    if ( $current_screen->post_type === 'events' )  {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }

}
?> 

1

Я создал версию, в которой не используется переменная $ typenow:

function isPostEditPage($strCheckType="")
{
    //This function will test for a post type and return true if it is the edit page for this type
    //an empty value means checking for native (original, not custom) post type
    $strCheckType=$strCheckType==""?"post":$strCheckType;
    $blnReturn=false;
    if(is_Admin())  
    {
        $strPage=basename($_SERVER['SCRIPT_FILENAME']);
        switch($strPage)
        {
            case "post.php":
                if(isset($_GET["post"]))
                {
                    $intPostID=$_GET["post"];
                    $strThisPostType=get_post_type($intPostID);
                    if($strCheckType==$strThisPostType)
                    {
                        $blnReturn=true;
                    }
                }
            break;
            case "post-new.php":
                $strThisPostType="post";
                if(isset($_GET["post_type"]))
                {
                    $strThisPostType=$_GET["post_type"];
                }
                if($strCheckType==$strThisPostType)
                {
                    $blnReturn=true;
                }

            break;
        }
    }
    return $blnReturn;
}

Глобалы не изменятся, поэтому они безопасны в использовании. Кроме того, есть хуки, специфичные для этих страниц, поэтому вам не нужны эти функции и эти усилия. И последнее, но не менее важное: вы проверяете строки не строго, а также не в стиле йода, поэтому они могут потерпеть неудачу. Кроме того, опираясь на $_GETтолько может потерпеть неудачу. В любом случае: добро пожаловать в WPSE.
Кайзер

1

Как насчет:

add_action( 'admin_init', 'scripts_admin' );

function scripts_admin($hook){

    global $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
         $post = get_post($_GET['post']);
             $typenow = $post->post_type;
     }
     if( 'post.php' != $hook && 'CUSTOMPOSTTYPE' != $typenow)
        return;

        wp_enqueue_script( 'google-api','http://maps.googleapis.com/maps/api/js?key=AIzaSyCD5TwT3vXLfYEv9WD-kOcEg7YQLcncsls&sensor=true', array( 'jquery' ) );


}

0

Эта

$ typenow не имеет значения во время admin_init

не совсем правильно. У него есть значение, установленное в admin_init на большинстве экранов типов записей, таких как «Добавить новый», «Список таксономий», «Редактирование таксономии» и «Список записей», но его нет на экране «Редактировать свой тип сообщения».

Кроме того , как другие указали, правильный крюк , чтобы использовать для добавления стилей и сценариев для WP - администратора admin_enqueue_scripts. Если вы используете этот хук, вам не нужно проверять, is_admin()так как он запускается только в WP Admin, и вы получаете в качестве параметра текущий экран. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.