Como incluir arquivos PHP em plugins da maneira correta

59

Meu problema é que, no arquivo principal do plugin, incluo um arquivo PHP mais ou menos 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 chamo 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 você dizer "use if(**function_exists**('add_action')){" se eu usar isso, simplesmente não funciona.

As questões:

  • Qual seria a maneira correta de fazer isso?
  • O que são a diferença entre include, include_once, requiree quando eu uso bruxa?
Bainternet
fonte
você está fazendo algo errado se receber essa mensagem. Certifique-se de incluir qualquer arquivo antes de começar a executar as funções desses arquivos
onetrickpony
é isso, as chamadas estão dentro dos arquivos que estou incluindo!
Bainternet
lol, agora vejo WP_PLUGIN_URLem seu código acima :)
onetrickpony
3
Simplificando, você só pode incluir arquivos () através de um caminho de arquivo e não de um URI.
editor
11
Este artigo Codex (provavelmente escrito depois que você pediu a sua pergunta) é bastante útil: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Respostas:

88

Chegando atrasado para esta festa, mas aqui está a maneira "WordPress": use plugin_dir_path( __FILE__ ), por exemplo:

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

Note que a função não retornar a barra final para o caminho de arquivo.

Chip Bennett
fonte
3
Observe que, ao usá- __FILE__lo, o resultado será relativo ao arquivo atual do qual você o chama; portanto, se sua includeinstrução for feita a partir de um subdiretório dentro da estrutura de arquivos do plug-in, você também receberá o subdiretório.
Squarecandy
A alternativa - se você PRECISA de caminhos relativos, érequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

Examinei alguns plugins criados anteriormente para ver as diferentes maneiras de incluir arquivos extras dentro dos plugins e notei que existem dois métodos que você pode usar, provavelmente há mais.

Defina o diretório do seu plug-in

Dentro do seu plugin, tenha a seguinte definição para definir o local atual do plugin.

Código de exemplo:

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

Apenas inclua ou exija

Você pode simplesmente usar; inclua, inclua_once, exija ou exija_once dentro da pasta do plug-in, referenciando o local como no código de exemplo abaixo. O exemplo abaixo será baseado em um arquivo no diretório raiz do plugin, incluindo outro arquivo dentro de uma pasta dentro da pasta do plugin.

Código de exemplo:

include "classes/plugin-core.php";
Dwayne Charrington
fonte
As inclusões relativas podem trazer todos os tipos de problemas inesperados desagradáveis.
precisa
5

Acabo renunciando às construções do WordPress para inclui e uso o seguinte:

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

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

Quanto à diferença entre include e require:
include lançará um aviso se o arquivo não for encontrado.
Exigir 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 / exigido (observe que, tanto quanto eu sei, isso é apenas para um arquivo específico em um diretório específico).

mtekk
fonte
5

Primeiro, obrigado a todos que responderam,

Meu problema foi chamar os arquivos incluídos com URL completo para que eles não passassem pelo WordPress. e isso aconteceu porque, como afirmei na pergunta, estava chamando-os do arquivo principal do plug-in. então a correção acabou usando:

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

eu li sobre no suporte do WordPress . e novamente obrigado por responder!

Bainternet
fonte
Você pode reconsiderar marcar esta resposta ( wordpress.stackexchange.com/a/32002/123092 ) como aceita?
Eu sou a pessoa mais estúpida
4

Incluir

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

Incluir uma vez

A instrução include_once () inclui e avalia o arquivo especificado durante a execução do script. Esse é um comportamento semelhante à instrução include (), com a única diferença: se o código de um arquivo já tiver sido incluído, ele não será incluído novamente. Como o nome sugere, ele será incluído apenas uma vez.

Exigir

require () e include () são idênticos em todos os aspectos, exceto no modo como lidam com a falha. Ambos produzem um aviso, mas requerem resultados () em um erro fatal. Em outras palavras, não hesite em usar o require () se desejar que um arquivo ausente interrompa o processamento da página.

Requer uma vez

A instrução require_once () inclui e avalia o arquivo especificado durante a execução do script. Esse é um comportamento semelhante à instrução require (), com a única diferença: se o código de um arquivo já tiver sido incluído, ele não será incluído novamente.

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

Webord
fonte
Como o @mtekk diz, eu recomendo que você use essa estrutura: require_once (dirname ( FILE ). '/Filename.php);
Webord
1

Olá @ בניית אתרים:

Quando o WordPress está carregando, ele define a add_action()função antes de tentar carregar qualquer plug-in. O fato de você estar recebendo o erro indica que você está fazendo algo estranho ou que algo está errado com a instalação do WordPress.

Para quem você está carregando o seu "plugin" ? Você está usando um include*()ou require*()para carregá-lo, talvez em seu wp-config.phparquivo?

MikeSchinkel
fonte
1
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 enfileirar arquivos .css e .js admin_enqueue_scriptsdentro do plug-in, useplugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
Aamer Shahzad
fonte
0

Sempre que você cria um novo arquivo dentro do diretório de trabalho, é necessário incluí-lo sempre. Mas tente um método para escanear seu directroy e anexá-lo automaticamente, não apenas os arquivos php, o que ajuda a incluir arquivos php, js e css corretamente nos dois lados (backend, front end).

http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/

varadha
fonte
11
Adicione informações relevantes no link fornecido à sua resposta. Use o link para fins de crédito. Por favor, edite sua pergunta
Pieter Goosen