Como incluir arquivos PHP em plugins da maneira correta

53

Meu problema é quando no arquivo principal do plugin eu incluo um arquivo PHP algo assim:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

e nesse arquivo eu tenho uma chamada para uma função do WordPress como:

add_action('hook', 'callback');

e eu recebo:

  

Erro Fatal: Chamada para a função indefinida add_action ()

Agora, antes de dizer "use if(**function_exists**('add_action')){ ", se eu usar isso, simplesmente não funcionará.

As perguntas:

  • Qual seria a maneira correta de fazer isso?
  • Qual é a diferença entre include , include_once , require e quando eu uso bruxaria?
por Bainternet 21.01.2011 / 02:48
fonte

8 respostas

4

Primeiro, obrigado a todos que responderam,

Meu problema era chamar os arquivos incluídos com o URL completo dessa maneira que eles não passam pelo WordPress. e isso aconteceu porque, como afirmei na pergunta, eu estava chamando-os do arquivo principal do plugin. então a correção acabou usando:

include_once('/ipn/paypal-ipn.php');

Eu li sobre o suporte para WordPress . e mais uma vez obrigado por responder!

    
por Bainternet 21.01.2011 / 05:00
fonte
76

Chegando tarde a essa festa, mas aqui está a maneira do "WordPress": use plugin_dir_path( __FILE__ ) , por exemplo:

<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>

Note que a função faz retornar a barra final para o caminho do arquivo.

    
por Chip Bennett 25.10.2011 / 00:19
fonte
8

Eu olhei através de alguns plugins que eu criei anteriormente para ver as diferentes maneiras que eu incluí arquivos extras dentro de plugins e notei que existem dois métodos que você pode usar, provavelmente há mais.

Defina seu diretório de plug-ins

Dentro do seu plugin tem a seguinte definição para definir a localização atual do plugin.

Exemplo de código:

define( 'PLUGIN_DIR', dirname(__FILE__).'/' );  

Basta incluir ou exigir

Você pode simplesmente usar; inclua, include_once, require ou require_once dentro da pasta do seu plugin referenciando o local como no código de exemplo abaixo. O exemplo abaixo será baseado em um arquivo no diretório do plugin raiz, incluindo outro arquivo dentro de uma pasta dentro da pasta do seu plugin.

Exemplo de código:

include "classes/plugin-core.php";
    
por Dwayne Charrington 21.01.2011 / 11:40
fonte
5

Eu acabo renunciando às construções do WordPress para includes e uso o seguinte:

require_once(dirname(__FILE__) . '/filename.php);

Eu não acho que isso realmente resolverá seu problema, o que parece ser um problema de escopo, mas é o código que eu uso.

Quanto à diferença entre incluir e exigir:
include lançará um aviso se o arquivo não for encontrado
require irá lançar um erro fatal se o arquivo não for encontrado

include_once e require_once não incluirão / exigirão o arquivo / código novamente se ele já tiver sido incluído / requerido (observe que, até onde eu sei, isso é apenas para um arquivo específico em um diretório específico).

    
por mtekk 21.01.2011 / 04:29
fonte
3
  

Incluir

     

A instrução include () inclui e avalia o arquivo especificado.

     

Incluir uma vez

     

A instrução include_once () inclui e avalia o valor especificado   arquivo durante a execução do   roteiro. Este é um comportamento semelhante ao   a instrução include (), com o único   diferença sendo que, se o código de   um arquivo já foi incluído,   não será incluído novamente. Enquanto o   nome sugere, será incluído   apenas uma vez.

     

Exigir

     

require () e include () são idênticos em todos os sentidos, exceto como eles   lidar com falhas. Ambos produzem um   Atenção, mas require () resulta em um   Erro fatal. Em outras palavras, não   hesite em usar require () se você quiser   um arquivo ausente para interromper o processamento de   a página.

     

Exigir uma vez

     

A instrução require_once () inclui e avalia o valor especificado   arquivo durante a execução do   roteiro. Este é um comportamento semelhante ao   a instrução require (), com o único   diferença sendo que, se o código de   um arquivo já foi incluído,   não será incluído novamente.

A informação acima é da documentação do PHP, a coisa é que não existe uma correta, dependerá da necessidade do código, eu exijo () em coisas importantes como funções, mas em arquivos de tema como rodapé ou loop eu uso include_once ou include porque eu posso manipular o aviso e dizer ao usuário / visitante que aconteceu um erro ao invés de apenas um fatal_error

    
por Webord 21.01.2011 / 04:34
fonte
1

Oi @ בניית אתרים:

Quando o WordPress está carregando, ele define a função add_action() antes de tentar carregar quaisquer plugins O fato de você estar recebendo o erro me diz que você está fazendo algo estranho ou que algo está errado com o seu WordPress instalar.

Quem você está colocando em seu "plugin" para carregar? Você está usando um include*() ou require*() para carregá-lo, talvez no seu arquivo wp-config.php ?

    
por MikeSchinkel 21.01.2011 / 04:46
fonte
0

Sempre que você criar um novo arquivo dentro do seu diretório de trabalho, você deve incluí-lo toda vez. Mas tente um método para escanear sua directroy e anexá-la automaticamente, não apenas os arquivos php, o que ajuda a incluir php, js e css fiules corretamente em ambos os lados (backend, front end).

enlace

    
por varadha 29.05.2014 / 06:56
fonte
0
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

ou

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

ou

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

Nota: para enqueu .css & Arquivos .js admin_enqueue_scripts dentro do plugin use plugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
    
por Aamer Shahzad 13.05.2016 / 18:35
fonte