Завантаження зовнішніх скриптів в адміністраторі, але ТІЛЬКИ для певного типу публікації?


16

Тож я продовжую стикатися з цим питанням, і я просто шукаю найкраще і найпростіше рішення для вирішення цієї проблеми.

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

Я по суті просто шукаю спосіб просто завантажити ці власні поля jquery, коли я перебуваю на сторінці "редагувати публікацію" для СПЕЦИФІЧНОГО типу публікації.

Яке найкраще рішення тут?


ОНОВЛЕННЯ 1

Перш за все, дуже дякую.

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

У мене є ще деякі проблеми, хоча з цим. Наприклад...

Я змінив сценарій, щоб викликати оператор if таким чином:

if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='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

Я змінив свій файл function.php з кодом, наданим Майком (нижче), але, здається, застосований JavaScript все ще включається під час створення НОВОЇ дописи чи сторінки. Це означає, що при спробі створити НОВУ публікацію чи сторінку або створити нову публікацію / сторінку WordPress за замовчуванням, або коли ви створили НОВУ публікацію / сторінку, засновану на одному зі своїх спеціальних типів публікацій. Код, запропонований Майком IS, працює на всіх інших сторінках адміністратора, і він працює, коли ви «редагуєте» існуючий пост / сторінку або тип користувальницької пошти. Будь-які запропоновані зміни, щоб зробити цю роботу правильною?

Ось мій поточний код:

<?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

Вибачте Майк - Моє початкове припущення було насправді неправильним. Здається, що код, який ви надали IS, містив 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 = topicoptions, і я не хочу, щоб сценарії кожного адміністратора .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, є 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.