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?

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.


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";

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).


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!


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


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?


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');

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/


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.