netconstructorcom
  • 0
Мастер

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

  • 0

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

Я начал использовать настраиваемые типы сообщений во многих различных проектах и ​​расширил их с помощью настраиваемых метабоксов, которые затем расширил, добавив настраиваемые сценарии, такие как селекторы календаря событий 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

Я изменил свой файл 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");
    }
   }
?> 
Share
  1. @NetConstuctor.com: Не удивляйтесь, многие люди, пишущие плагины, научились программировать, чтобы они могли писать плагины, и, таким образом, у них очень мало знаний в области программирования. Они чешут зуд, не следуя передовым методам.

    • 0
    • привет майк… см. мой комментарий ниже… извините, я написал не в тот ящик

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

      • 0
    • Привет, Майк… ваш код работает отлично, за исключением одной проблемы… Когда вы находитесь на странице администратора, где вы можете добавить новый пост или новую страницу (я говорю о посте / странице по умолчанию), код javascript, который должен только быть загруженным для пользовательского типа сообщения загружается. Помимо этой проблемы, кажется, что он работает отлично и загружает javascript только для указанных типов сообщений. У вас есть какие-либо модификации, которые вы можете предложить?

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

      • 0
    • ОК… Итак, изучив это еще глубже, я обнаружил, что код Майка действительно работает правильно везде, кроме случаев, когда вы создаете «НОВЫЙ» пост. Из того, что я вижу здесь, javascript неправильно включается, когда вы создаете НОВУЮ СТРАНИЦУ, НОВУЮ СТАТЬЮ для страниц/сообщений WordPress по умолчанию, а также любого пользовательского типа сообщения, который у вас может быть. Код работает (это означает, что javascript не включен), когда вы РЕДАКТИРУЕТЕ существующий пост или страницу, которая является либо постом или страницей wordpress по умолчанию, либо настраиваемым типом поста. Может ли кто-нибудь предоставить предлагаемую модификацию для решения этой проблемы?

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

      • 0
  2. Во- первых, я предполагаю, что вы используете 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 Answers ) об одолжении в обмен на то, что вы потратите время на ответы на ваши вопросы, потому что я и другие модераторы хотим сделать WordPress Answers огромным ресурсом для сообщества, а не еще один небрежный форум, который трудно читать и трудно найти ответы, как и многие другие сайты в Интернете.

    ОБНОВЛЕНИЕ №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'));
        }
      }
    }
    
    • 0
  3. Я подумал, что добавлю сюда код, который решит мою связанную проблему. В моем случае я пытаюсь заставить JavaScript и CSS загружаться только на страницах и сообщениях и (редактировать и создавать) и нигде больше.

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

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

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

    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' );
    
     }
    
    • 0
  4. Согласно Джастину Тэдлоку, вы должны подключиться к admin_enqueue_scripts, а не к wp_enqueue_scripts для плагинов или скриптов только для администратора:

    http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin

    add_action('admin_enqueue_scripts','load_admin_datapicker_script');
    
    • 0
  5. Я знаю, что на вопрос ответили. Я думаю, что это более простое решение.

    <?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");
        }
    
    }
    ?> 
    
    • 0
  6. Я создал версию, которая не использует переменную $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;
    }
    
    • 0
  7. Что о:

    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
  8. Этот

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

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

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

    • 0

Оставить ответ

You must login to add an answer.