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");
}
}
?>
fonte
Respostas:
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_init
com a funçãoload_my_script()
de testar o mundo$pagenow
para uma correspondência com a página de administradoredit.php
e o global$typenow
para ver se o tipo de postagem é o desejado.O resto são apenas detalhes que você pode ler aqui se precisar aprender mais:
ATUALIZAR
Estou respondendo à sua atualização. Infelizmente ( por qualquer motivo )
$typenow
não tem um valor durante,admin_init
então você precisará obtê-lopost_type
carregando 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):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):
fonte
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.
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:
fonte
De acordo com Justin Tadlock, você deve conectar-se a admin_enqueue_scripts em vez de wp_enqueue_scripts para plug-ins ou scripts apenas para administradores:
http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin
fonte
Eu sei que a pergunta foi respondida. Eu acho que essa é uma solução mais simples.
fonte
Eu criei uma versão que não usa a variável $ typenow:
fonte
$_GET
apenas poderia falhar. Enfim: Bem-vindo ao WPSE.A respeito:
fonte
este
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_scriptsfonte