it-swarm.xyz

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

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

Я пришел, чтобы использовать пользовательские типы записей во многих различных проектах и ​​расширил их с помощью пользовательских метабоксов, которые я затем расширил, добавив пользовательские сценарии, такие как селекторы календаря событий 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 все еще включается при создании NEW Post или Page. Это означает, что при попытке создать НОВУЮ публикацию или страницу либо путем создания новой записи/страницы 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");
    }
   }
?> 
16
NetConstructor.com

Во-первых, я предполагаю, что вы используете 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') {

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

Я прошу вас об этом (и всех тех, кто задает вопросы о Ответах 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'));
    }
  }
}
14
MikeSchinkel

Согласно Джастину Тэдлоку, вы должны подключиться к 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');
3
Nathaniel Schweinberg

Я подумал, что добавлю сюда код, который решил мою проблему. В моем случае я пытаюсь заставить 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' );

 }
3
Ashley G

Как насчет:

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' ) );


}
1
chifliiiii

Я создал версию, в которой не используется переменная $ 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;
}
1
Mark

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

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

Это

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

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

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

0
Elliot