it-swarm-pt.tech

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

Então continuo a me deparar com essa questão e apenas procurando a melhor e mais simples solução para resolver esse problema.

Eu tenho vindo a fazer uso de tipos de post personalizado em muitos projetos diferentes e estendi-los com metaboxes personalizados que eu ainda estendido adicionando scripts personalizados, como seletores de calendário de eventos jQuery ... Tudo isso funciona muito bem, exceto por um problema-chave ... 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 estiver 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.

Eu estou realmente chocado que os desenvolvedores de plugins não se certificar de coisas assim porque como eu estou descobrindo esta é uma das principais razões que existem problemas com plugins diferentes.

Eu estou tendo alguns problemas adicionais 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 sejam chamados apenas 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.

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

Você poderia testar isso e talvez me deixar saber o que eu poderia estar fazendo errado?

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

Em um problema diferente relacionado ao mesmo ... Eu, por exemplo, estou utilizando o plugin "gravity forms", mas tenho notado que seus scripts são executados em todas as páginas do administrador, o que está causando problemas com outros plugins. Como eu iria modificar seu script para garantir que os scripts sejam carregados somente 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 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 baseado em um dos seus tipos de post personalizado. O código proposto por Mike IS funciona 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á 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");
    }
   }
?> 
16
NetConstructor.com

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

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

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

O resto são apenas detalhes que você pode ler sobre aqui se você 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 a sua atualização. Infelizmente (por alguma razão) $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 URL 'post' como você vê no exemplo a seguir (eu 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') {

P.S. Quanto às suas outras perguntas, por favor poste-as como nova pergunta no site para mim ou outras pessoas para responder. 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 de você (e de todos os outros que fazem perguntas sobre o WordPress Answers) como um favor em troca de esforço para responder suas perguntas, porque eu e os outros moderadores queremos tornar o WordPress Answers um tremendo recurso para a comunidade em vez de mais um fórum desleixado que é difícil de ler e difícil de encontrar respostas como tantos outros sites na web.

ATUALIZAÇÃO # 2

Eu pensei que você poderia ter tido um problema de precedência de operador em sua instrução if, mas quando eu testei antes de não me deparar com ele. Se estiver se comportando como se você dissesse, então você quase certamente tentará isso (desculpe, eu 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'));
    }
  }
}
14
MikeSchinkel

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

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

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 encontrei uma solução viável usando basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) para determinar onde no backend eu estava. Eu estava preocupado, porém, como a disponibilidade de $_SERVER[ 'SCRIPT_FILENAME' ] pode variar de servidor para servidor (alguém sabe como é provável que $_SERVER[ 'SCRIPT_FILENAME' ] não esteja disponível em um servidor?)

Então me deparei com essa pergunta e MikeSchinkel responder. Com uma pequena modificação, fiz com que funcionasse para mim, exceto por uma coisa. Parece que, por qualquer motivo, quando um novo post é criado via "Add New", ele 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 todos os administradores página .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' );

 }
3
Ashley G

Sobre o quê:

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

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;
}
1
Mark

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

}
?> 
1
grappler

Este

$ typenow não tem valor durante admin_init

não está totalmente correto. Ele tem um valor definido em admin_init nas telas most post type como Add New, lista de taxonomia, edição de taxonomia e lista de entrada, mas não possui uma na tela "Edit YourPostType".

Além disso, como outros apontaram, o gancho correto a ser usado para adicionar folhas de estilo e scripts a WP Admin é admin_enqueue_scripts. Se você usar este hook você não precisa checar is_admin() já que ele é disparado apenas em WP Admin e você obtém como parâmetro a tela atual. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot