Usando require_once () dentro do admin

3

No diretório do meu tema, tenho a seguinte estrutura:

/includes/functions-custom.php
/includes/avatax/AvaTax.php
/includes/classes/gmaps.class.php

Estou fazendo uma chamada do arquivo functions-custom.php para incluir o segundo arquivo na administração do WordPress usando este código

require_once('avatax/AvaTax.php'); //Avalara Sales Tax API
if ( is_admin() ) {
    require_once('classes/gmaps.class.php');
}

O primeiro requer aplica-se ao tema e ao administrador. O segundo, obviamente, só se aplica ao administrador. No entanto, o primeiro requer falha com a seguinte mensagem:

Warning: require_once(/Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/classes/BatchSvc/WP_User_Search.class.php) [function.require-once]: failed to open stream: No such file or directory in /Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/AvaTax.php on line 23

Fatal error: require_once() [function.require]: Failed opening required '/Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/classes/BatchSvc/WP_User_Search.class.php' (include_path='.:/Applications/MAMP/bin/php5/lib/php') in /Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/AvaTax.php on line 23

Eu não sinto que isso deva ser tão difícil. Talvez eu esteja negligenciando algo óbvio? Eu tentei precedendo o caminho do arquivo com a constante 'TEMPLATEPATH' e usando as funções óbvias do WordPress como

require_once(get_template_directory().'/path/to/file');

Estou desenvolvendo localmente no MAMP. Particularmente estranha é a chamada para o arquivo (na mensagem de erro) '/classes/BatchSvc/WP_User_Search.class.php'.

Alguém pode ajudar?

    
por Philip Downer 10.02.2012 / 01:52

4 respostas

0

Então, após uma noite de sono e a confirmação dos usuários acima de que eu estava incluindo os arquivos corretamente, resolvi o problema.

No arquivo AvaTax.php, havia uma função __autoload ():

<?php
function __autoload($class_name) 
{   

if ( $class_name != 'WP_User_Search' ) { //WORDPRESS HACK
    $path=dirname(__FILE__).'/classes/'.$class_name . '.class.php';

    if(!file_exists($path))
    {
        $path=dirname(__FILE__).'/classes/BatchSvc/'.$class_name . '.class.php';

    }

    require_once $path;
}


}
?>

A função está sendo passada por uma variável do WordPress - $ class_name. Eu não estou inteiramente certo de onde a variável vem, mas provavelmente poderia despejar o $ _GLOBALS ou $ wp_query e descobrir. Eu basicamente assegurei (hackeado) a função para garantir que a variável passada não correspondesse à string 'WP_User_Search'.

Quanto aos meus arquivos de inclusão, usei o seguinte código:

<?php
define('INCLUDE_PATH', get_template_directory().'/includes');
require_once(INCLUDE_PATH.'/avatax/AvaTax.php'); //Avalara Sales Tax API
if ( is_admin() ) {
require_once(INCLUDE_PATH.'/classes/gmaps.class.php');
}
?>

Obrigado por me ajudar a trabalhar com esse cara!

    
por Philip Downer 10.02.2012 / 17:49
12

Evite funções php nativas

  1. Eles não são relativos, então quebrar coisas é fácil. (como no caso dos OPs)
  2. Por que o papel é seu, se o núcleo tiver uma função para você?
  3. Eles não consideram casos extremos

Você NUNCA deve usar as constantes

  • STYLESHEET_DIRECTORY
  • TEMPLATE_DIRECTORY
  • WP_PLUGIN_DIR
  • etc ...

Lembre-se: essas não são API! e pode, portanto, mudar!

mas INSTEAD USE as seguintes funções da API:

  • Tema principal: get_template_directory() / get_template_directory_uri()
  • Tema infantil: get_stylesheet_directory() / get_stylesheet_directory_uri()

Você pode usar ambos em plug-ins e temas:

  • plugin_dir_path(__FILE__).'/your/path/to/file.ext *) para temas também
  • plugin_dir_url( __FILE__ ).'/your/path/to/file.ext

mas plugin_dir_url() é reservado somente para plug-ins.

Tenha em mente ...

Que existem

  • Plugins
  • MU-Plugins
  • Drop-ins
  • Temas
  • Temas em diretórios registrados por meio de register_theme_directory( $dir );

Então, por favor, fique com as funções nativas da API como wp_upload_dir(); , content_url(); , etc.

Em geral: dê uma olhada em /wp-includes/link-template.php para um monte de bom caminho e funções de API relacionadas ao URl.

    
por kaiser 10.02.2012 / 16:02
1

Parece que o requisito está sendo chamado de AvaTax.php , portanto, se você alterar a chamada para ../classes/gmaps.class.php (em AvaTax.php , não em functions-custom.php ), ele deverá corrigir o erro.

    
por mor7ifer 10.02.2012 / 02:56
0

Manifestphil , se você usa o WordPress Autoloader, não precisa se preocupar em carregar arquivos de classes. É claro que você tem que escrever arquivos de classe limpos neste caso, o que também torna seu código mais gerenciável.

etapas fáceis:

  • Crie uma pasta / lib dentro da pasta raiz do seu tema
  • Para evitar problemas com os mesmos nomes de classe, use namespaces e crie estrutura de pastas apropriada
  • Escreva seu código com sabedoria para dar suporte ao carregamento automático de classes. Divida o código em classes, para que as classes sejam carregadas apenas quando absolutamente necessário. Evite arquivos de classe grande.

Por exemplo, para carregar a classe MyNameSpace \ MyClass você precisa da estrutura de pastas mostrada abaixo:

/mytheme
   /lib
      /MyNameSpace
         /MyClass.php

Se você inicializar um novo objeto ou chamar algum método, o seu arquivo de classe será automaticamente carregado. Também funciona muito bem com qualquer método de engate do WordPress, por exemplo:

add_action ( 'admin_menu', 'MyNameSpace\MyClass::AddSomeToolsMenu' );

No caso acima, sua classe é carregada somente quando realmente necessária e chamada pelo WordPress:)

    
por D.A.H 10.04.2013 / 03:58

Tags