如何以正确的方式在插件中包含PHP文件


59

我的问题是,在主插件文件上包含如下所示的PHP文件时:

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

在该文件上,我调用了WordPress函数,例如:

add_action('hook', 'callback');

我得到:

致命错误:调用未定义函数add_action()

现在在您说“使用if(**function_exists**('add_action')){” 之前,如果我使用它,那将是行不通的。

问题:

  • 正确的方法是什么?
  • 有什么区别includeinclude_oncerequire做当我使用巫婆?

如果收到该消息,说明您做错了。开始从这些文件运行功能之前,请确保包括所有文件
onetrickpony

多数民众赞成在没有,电话都在我包括的文件内!
Bainternet'1

大声笑,现在我WP_PLUGIN_URL在您的代码中看到了:)
onetrickpony

3
简单地说,您只能通过文件路径而不是URI包含()文件。
编辑者

1
这份Codex文章(可能是在您问了问题之后写的)很有帮助:codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright 2014年

Answers:


88

迟到了这个聚会,但这是“ WordPress”的方式:use plugin_dir_path( __FILE__ ),例如:

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

请注意,该函数的确返回文件路径的尾部斜杠


3
请注意,通过使用__FILE__它,它将相对于您从其调用的当前文件进行输出,因此,如果您的include声明是通过插件文件结构内的子目录完成的,则您也将获得该子目录。
squarecandy18年

另一种选择-如果您需要相对路径,则是require_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay

10

我浏览了以前创建的几个插件,以了解在插件中包含额外文件的不同方式,并且我注意到可以使用两种方法,可能还有更多方法。

定义您的插件目录

插件内部具有以下定义,以定义当前插件位置。

示例代码:

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

只是直接包括或要求

您可以简单地使用;通过参考以下示例代码中的位置,在插件文件夹中包含,include_once,require或require_once。以下示例将基于您的根插件目录中的文件,包括位于您的插件文件夹内的文件夹中的另一个文件。

示例代码:

include "classes/plugin-core.php";

相对包括可能带来各种令人讨厌的意外问题。
马克·卡普伦

5

我最终放弃了包含的WordPress结构,并使用以下内容:

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

我认为这实际上不会解决您的问题,这似乎是范围问题,但这是我使用的代码。

至于包括和需要之间的区别:
包括将抛出一个警告,如果找不到该文件
要求将抛出一个致命的错误,如果没有找到文件

如果已经包含/需要,include_once和require_once将不再包含/请求文件/代码(请注意,据我所知,这仅适用于特定目录中的特定文件)。


5

首先,感谢所有回答的人,

我的问题是用不带WordPress的方式调用包含文件的完整URL。发生这种情况是因为正如我在问题上所说,我是从主插件文件中调用它们的。因此修复程序最终使用:

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

我在WordPress支持处了解到。再次感谢您的回答!


您能否重新考虑将这个答案(wordpress.stackexchange.com/a/32002/123092)标记为已接受?
我是最愚蠢的人

4

包括

include()语句包括并评估指定的文件。

包含一次

include_once()语句在脚本执行期间包含并评估指定的文件。这是与include()语句相似的行为,唯一的区别是,如果已经包含了文件中的代码,则不会再次包含它。顾名思义,它将仅包含一次。

要求

require()和include()在所有方面都相同,除了它们如何处理故障。它们都产生警告,但require()会导致致命错误。换句话说,如果您想要丢失的文件来停止页面处理,请立即使用require()。

需要一次

require_once()语句在脚本执行期间包括并评估指定的文件。这是一种与require()语句相似的行为,唯一的区别是,如果已经包含了文件中的代码,则不会再次包含它。

上面的信息来自PHP文档,没有一个正确的信息,将取决于代码的需要,我对诸如函数之类的重要内容确实执行require(),但对页脚或主题循环之类的主题文件却使用了我include_once或include,因为我可以处理警告并向发生错误的用户/访问者说,而不只是fatal_error


正如@mtekk所说,我建议您使用tis结构:require_once(dirname(FILE)。'/filename.php);
Webord 2011年

1

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

当WordPress加载时,它会尝试加载任何插件之前先定义add_action()函数。事实上,您收到的错误告诉我您做的事情很奇怪,或者WordPress安装有问题。

您要向谁加载“插件”?您是否正在使用include*()require*()加载wp-config.php文件,也许是在文件中?


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

要么

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

要么

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

注意:admin_enqueue_scripts在插件内部使用.css和.js文件入队plugin_dir_url( __FILE__ )

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

0

每当您在工作目录中创建一个新文件时,都必须每次都包含它。但是尝试一种方法来扫描您的Directroy并自动附加它,不仅限于php文件,这有助于在两侧(后端,前端)正确地包含php,js和css文件。

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


1
请从提供给您答案的链接中添加相关信息。将链接用于信用目的。请编辑您的问题
Pieter Goosen 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.