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

16

Portanto, continuo com esse problema e estou apenas procurando a melhor e mais simples solução para resolver esse problema.

Eu vim para fazer uso de tipos de postagem personalizados em muitos projetos diferentes e os estendi com metaboxes personalizados, que foram estendidos ainda mais adicionando scripts personalizados, como seletores de calendário de eventos jQuery ... Tudo isso funciona muito bem, exceto por um problema importante ... Não quero que esses scripts jQuery personalizados sejam carregados em todas as páginas do administrador.

Essencialmente, estou apenas procurando uma maneira de carregar esses campos de jquery personalizados quando estou na página "editar postagem" para um tipo de postagem ESPECÍFICO.

Qual é a melhor solução aqui?


ATUALIZAÇÃO 1

Primeiro de tudo, muito obrigado.

Na verdade, estou chocado que os desenvolvedores de plugins não se certifiquem de coisas assim, porque, como eu estou descobrindo, esse é um dos principais motivos pelos quais existem problemas com plugins diferentes.

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

Modifiquei o script para chamar a instrução if assim:

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

Como você pode ver, estou tentando configurar as coisas para que meus scripts sejam chamados apenas ao adicionar ou editar uma publicação no tipo de publicação de "eventos".

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

No entanto, o problema parece ser que o script só é carregado quando eu crio uma nova postagem nesse tipo de publicação, mas parece não funcionar quando estou editando uma publicação existente.

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

Aqui está o código exato que eu estou usando ... talvez haja uma maneira melhor ou 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 postagem e carregar scripts JS diferentes para cada tipo de postagem, duplicaria o código acima três vezes separadas ou isso não é uma boa maneira de fazer isso? Por exemplo ... seria melhor chamar apenas: global $ pagenow, $ typenow; No topo do meu arquivo de funções, isso importa ou complica quando o duplico mais de uma vez?

Em um problema diferente relacionado ao mesmo ... Por exemplo, estou utilizando o plug-in "gravity forms", mas notei que seus scripts são executados em todas as páginas do administrador, causando problemas com outros plug-ins. Como eu modificaria o script deles para garantir que os scripts sejam carregados apenas quando eu precisar deles.


ATUALIZAÇÃO 2

Modifiquei meu arquivo functions.php com o código fornecido por Mike (abaixo), no entanto, parece que o javascript aplicável ainda está sendo incluído quando você cria uma NOVA postagem ou página. Isso significa que quando você tenta criar uma NOVA Postagem ou Página, criando uma nova postagem / página padrão do wordpress ou quando você cria uma NOVA postagem / página 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ê "EDITA" uma postagem / página existente ou um tipo de postagem personalizado. Alguma modificação sugerida para corrigir este trabalho?

Aqui está 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");
    }
   }
?> 
NetConstructor.com
fonte
2
@ NetConstuctor.com: Não fique chocado, muitas pessoas que escrevem plugins aprenderam a programar para poder escrever o plug-in e, portanto, ter muito pouco conhecimento em programação. Eles estão coçando a coceira, não seguindo as práticas recomendadas.
MikeSchinkel #

Respostas:

14

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

Dito isto, se eu entendi sua pergunta, o que você precisa é algo como o seguinte . Você precisará editá-lo para obter detalhes, é claro, mas fornece a estrutura geral.

Estamos nos conectando admin_initcom a função load_my_script()de testar o mundo$pagenow para uma correspondência com a página de administrador edit.phpe o global $typenowpara ver se o tipo de postagem é o desejado.

O resto são apenas detalhes que você pode ler aqui se precisar aprender 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'));
  }
}

ATUALIZAR

Estou respondendo à sua atualização. Infelizmente ( por qualquer motivo ) $typenownão tem um valor durante, admin_initentão você precisará obtê-lo post_typecarregando a postagem com base no parâmetro URL, 'post'como você vê no exemplo a seguir (copiei a linha acima e a linha abaixo do seu exemplo para que você possa ver onde colocá-lo):

<?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 Quanto às suas outras perguntas, poste-as como nova pergunta no site para que eu ou outras pessoas possamos responder. Como estamos trabalhando duro para ajudá-lo, tenha muito cuidado em atribuir ao seu título o melhor título possível e, também, escreva suas perguntas da maneira mais clara e sucinta possível, com boa formatação e inglês adequado. Se você fizer isso, ajudará com os mesmos problemas a reconhecer sua pergunta como sendo semelhante ao que eles precisam e facilitará para nós que estamos respondendo suas perguntas.

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

ATUALIZAÇÃO # 2

Eu pensei que você poderia ter tido problemas de precedência de operador na sua instrução if, mas quando eu testei antes, não encontrei. Se estiver se comportando de acordo com a sua opinião, você quase certamente o fará (desculpe, não tenho tempo para testar isso agora para garantir que funcione):

<?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'));
    }
  }
}
MikeSchinkel
fonte
oi mike ... ver o meu comentário abaixo ... desculpe, eu postei na caixa errada
NetConstructor.com
@ NetConstuctor.com : não forneça esclarecimentos para sua pergunta no local designado para obter respostas . Mudei o conteúdo que você colocou em uma resposta para sua pergunta e estou votando para fechar essa resposta.
MikeSchinkel #
Oi Mike ... seu código funciona perfeitamente, exceto por um problema ... Quando você está na página de administração, onde pode adicionar uma nova postagem ou uma nova página (estou falando da postagem / página padrão), o código javascript que deve apenas ser carregado para o tipo de postagem personalizado é carregado. Além desse problema, parece estar funcionando perfeitamente e está carregando apenas o javascript nos tipos de postagem especificados. Você tem alguma modificação que possa sugerir?
NetConstructor.com
Desculpe Mike - Minha suposição inicial estava realmente incorreta. Parece que o código que você forneceu inclui o javascript em outros tipos de post que eu também tenho. Fui e incluí o script exatamente como você sugeriu. Você poderia revisar isso mais uma vez?
NetConstructor.com
11
OK ... Então, depois de analisar isso ainda mais, descobri que o código de Mike está realmente funcionando corretamente em todos os lugares, exceto quando você cria uma postagem "NOVA". Pelo que estou vendo aqui, o javascript está incorretamente sendo incluído quando você cria uma NEW PAGE, NEW POST para as páginas / posts padrão do wordpress, bem como qualquer tipo de post personalizado que você possa ter. O código está funcionando (não está sendo incluído o JavaScript) quando você edita uma postagem ou página existente que é uma postagem ou página padrão do wordpress ou um tipo de postagem personalizada. Alguém pode fornecer uma modificação sugerida para corrigir esse problema?
NetConstructor.com
3

Eu pensei em adicionar algum código aqui que resolvesse um problema relacionado ao meu. No meu caso, estou tentando obter JavaScript e css para carregar apenas em páginas e posts e (editar e criar) e em nenhum outro lugar.

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

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

Com os seguintes ajustes, consegui que funcionasse e estou compartilhando 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 temas, o que não pode ser feito com base em $ pagenow, pois o URL que aparece é admin.php? Page = themeoptions e não quero os scripts em todos os administradores .php, somente nessa página específica (minha página de opções de tema)

Alguém sabe como isso pode ser feito da melhor maneira?

E para responder minha própria pergunta:

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

 }
Ashley G
fonte
2

Eu sei que a pergunta foi respondida. Eu acho que essa é 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");
    }

}
?> 
grappler
fonte
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;
}
Marca
fonte
Os globais não mudam, por isso são seguros de usar. Além disso, existem ganchos específicos para essas páginas, portanto você não precisa dessa função e desse esforço. Por último, mas não menos importante: você está verificando as seqüências de caracteres não-estritas e também não-yoda, portanto elas podem falhar. Também depender $_GETapenas poderia falhar. Enfim: Bem-vindo ao WPSE.
Kaiser
1

A respeito:

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


}
chifliiiii
fonte
0

este

$ typenow não tem um valor durante admin_init

não está totalmente correto. Ele tem um valor definido em admin_init na maioria das telas de tipo de postagem, como Adicionar novo, lista de taxonomia, edição de taxonomia e lista de entradas, mas não possui um na tela "Editar seuPostType".

Além disso, como outros apontaram, o gancho correto a ser usado para adicionar folhas de estilo e scripts ao WP Admin é admin_enqueue_scripts. Se você usar esse gancho, não precisará verificar, is_admin()pois ele é acionado apenas no WP Admin e você obtém como parâmetro a tela atual. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Elliot
fonte