Como carregar scripts externos no Admin, mas SOMENTE para um tipo de postagem específico?

15

Portanto, continuo a me debruçar sobre essa questão e só estou procurando a melhor e mais simples solução para resolver esse problema.

Eu vim para fazer uso de tipos de post personalizado em muitos projetos diferentes e estendi-los com metaboxes personalizados que eu estendi ainda mais adicionando scripts personalizados, como seletores de calendário de eventos jQuery ... Tudo isso funciona muito bem, exceto para um problema chave ... Eu não quero que esses scripts jQuery personalizados sejam carregados em todas as páginas do admin.

Eu estou essencialmente procurando apenas uma maneira de ter esses campos jquery personalizados carregados quando eu estou na página "editar postagem" para um tipo de postagem ESPECÍFICO.

Qual é a melhor solução aqui?

UPDATE 1

Primeiro de tudo, muito obrigado.

Estou realmente chocado que os desenvolvedores de plugins não se certifiquem de coisas assim porque, como estou descobrindo, essa é uma das principais razões que existem problemas com plugins diferentes.

Estou tendo mais alguns problemas com isso. Por exemplo ...

Eu modifiquei o script para chamar a declaração if assim:

  

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

Como você pode ver, estou tentando configurar coisas para que meus scripts SOMENTE sejam chamados quando estou adicionando ou editando uma postagem no tipo de postagem de "eventos".

Eu não quero que o script carregue em qualquer outra página e também não quero que ele seja executado na lista de páginas dentro do tipo de post de "eventos", então eu acho que a declaração if está correta.

O problema, no entanto, parece ser que o script só é carregado quando eu crio uma nova postagem dentro desse tipo de postagem, mas parece que não funciona quando estou editando uma postagem existente.

Você poderia testar isso e talvez me dizer o que eu poderia estar fazendo de errado?

Aqui está o código exato que estou usando ... talvez haja uma maneira melhor ou mais simples de fazer isso?

<?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");
  }
}

Além disso ... se eu quisesse adicionar três tipos de postagens e carregar diferentes scripts JS para cada tipo de post, eu duplicaria o código acima três vezes separadas ou isso não seria uma boa maneira de fazer isso? Por exemplo ... seria melhor apenas ligar: global $ pagenow, $ typenow; No topo do meu arquivo de funções ou importa ou complica as coisas quando eu duplico mais de uma vez?

Em um problema diferente relacionado ao mesmo ... Eu, por exemplo, estou utilizando o plugin "gravity forms", mas notei que seus scripts são executados em todas as páginas do administrador, o que está causando problemas em outros plugins. Como eu iria modificar seu script para garantir que os scripts só sejam carregados quando eu precisar deles?

ATUALIZAÇÃO 2

Modifiquei meu arquivo functions.php com o código fornecido por Mike (abaixo), mas parece que o JavaScript aplicável ainda está sendo incluído quando você cria um NOVO Post ou Página. Isso significa que, ao tentar criar um NOVO Post ou Página, seja criando um novo post / página do wordpress padrão ou quando você criar um NOVO post / page com base em um dos seus tipos de postagem personalizados. O código proposto por Mike está trabalhando em todas as outras páginas de administração e funciona quando você "EDITAR" um post / página existente ou um tipo de postagem personalizado. Quaisquer modificações sugeridas para tornar este trabalho correto?

Aqui está o meu código atual:

<?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");
    }
   }
?> 
    
por NetConstructor.com 31.08.2010 / 09:31

7 respostas

14

Primeiro, presumo que você está usando wp_enqueue_script() para carregar seus scripts certo?

Dito isso, se eu entendi sua pergunta, o que você precisa é algo como o seguinte . Você terá que editá-lo para seus detalhes, é claro, mas ele te dará o quadro geral.

Estamos conectando admin_init com a função load_my_script() para testar o global $pagenow para uma correspondência com a página de administração edit.php e o global $typenow para ver se o tipo de postagem é o desejado .

O resto são apenas detalhes que você pode ler sobre aqui se precisar saber mais:

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

UPDATE

Estou respondendo a sua atualização. Infelizmente ( por qualquer motivo ) $typenow não tem um valor durante admin_init , então você precisará obter o post_type carregando a postagem com base no parâmetro de URL 'post' à medida que você veja no exemplo a seguir (eu copiei a linha acima e a linha abaixo do seu exemplo para que você possa ver onde colocá-la):

<?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') {

P.S. Quanto às suas outras perguntas, poste-as como uma nova pergunta no site para que eu ou outras pessoas respondam. Como estamos trabalhando muito para ajudá-lo, por favor, tome o cuidado de dar ao seu título o melhor título possível e, por favor, escreva suas perguntas da forma mais clara e sucinta possível, com boa formatação e bom inglês. Se você fizer isso, ele ajudará com os mesmos problemas a reconhecer sua pergunta como sendo semelhante ao que eles precisam e isso tornará mais fácil para nós responder às suas perguntas.

Eu pergunto isso a você ( e de todos os outros que fazem perguntas no WordPress Answers ) como um favor em troca de esforço para responder suas perguntas porque eu e os outros moderadores queremos fazer O WordPress responde a um tremendo recurso para a comunidade em vez de outro fórum desleixado que é difícil de ler e difícil de encontrar respostas como muitos outros sites na web.

UPDATE # 2

Eu achei que você poderia ter tido problemas de precedência de operador em sua instrução if, mas quando fiz o teste antes de não me deparar com ele. Se ele está se comportando como sua palavra, então você quase certamente o faz, em vez disso, tente isso (desculpe, eu não tenho tempo para testar isso agora para garantir com certeza que funciona):

<?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'));
    }
  }
}
    
por MikeSchinkel 31.08.2010 / 12:07
3

Eu pensei em adicionar algum código aqui que resolveu um problema relacionado ao meu. No meu caso, estou tentando fazer com que JavaScript e CSS sejam carregados apenas em Páginas e Postagens e (editar e criar) e em nenhum outro lugar.

Eu encontrei uma solução viável usando basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) para determinar onde eu estava no back-end. Eu estava preocupado, pois a disponibilidade de $_SERVER[ 'SCRIPT_FILENAME' ] pode variar de servidor para servidor (alguém sabe qual a probabilidade de que $_SERVER[ 'SCRIPT_FILENAME' ] não esteja disponível em um servidor?)

Então me deparei com essa pergunta e MikeSchinkel respondeu. Com uma pequena modificação eu fiz o trabalho para mim, exceto por uma coisa. Parece que, por qualquer motivo, quando uma nova postagem é criada por meio de "Adicionar nova", ela não funciona.

Com os ajustes a seguir, consegui fazê-lo funcionar e estou compartilhando-o aqui, na esperança de ajudar os outros e de melhorá-lo.

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

  }
 }
}

Em seguida, estou tentando limitar alguns scripts à minha página de opções de tema, o que não pode ser feito com base no $ pagenow, pois a URL que aparece é admin.php? page = themeoptions e não quero os scripts em cada página admin.php, apenas nessa página específica (minha página de opções de tema)

Alguém sabe como isso pode ser feito melhor?

E para responder minha própria pergunta:

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

 }
    
por Ashley G 22.09.2010 / 09:31
2

Por Justin Tadlock, você deve conectar-se a admin_enqueue_scripts ao invés de wp_enqueue_scripts para plug-ins ou scripts somente de administrador:

enlace

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
    
por Nathaniel Schweinberg 05.09.2012 / 18:36
1

Eu criei uma versão que não usa a variável $ 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;
}
    
por Mark 17.02.2012 / 01:30
1

E sobre:

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


}
    
por chifliiiii 14.07.2012 / 01:03
0

Eu sei que a pergunta foi respondida. Acho que esta é uma solução mais simples.

<?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");
    }

}
?> 
    
por grappler 24.07.2013 / 20:40
0

Isso

  

$ typenow não tem valor durante admin_init

não está totalmente correto. Ele tem um valor definido em admin_init nas telas de tipos de postagem maioria como Adicionar Novo, lista de taxonomia, edição de taxonomia e lista de entrada, mas não possui um na tela "Editar YourPostType".

Além disso, como outros apontaram, o gancho correto a ser usado para adicionar folhas de estilo e scripts ao Administrador do WP é admin_enqueue_scripts . Se você usar esse gancho, não precisará verificar is_admin() , pois ele é acionado somente no WP Admin e você recebe como parâmetro a tela atual. enlace

    
por Elliot 28.01.2015 / 17:33