我的问题是,在主插件文件上包含如下所示的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和我什么时候使用巫婆有什么区别?


评论

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

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

大声笑,现在我在上面的代码中看到WP_PLUGIN_URL :)

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

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

#1 楼

这次聚会来晚了,但是这是“ WordPress”方式:使用plugin_dir_path( __FILE__ ),例如:

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


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

评论


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

– squarecandy
18年1月30日在20:30



替代方法-如果需要相对路径,则是require_once(plugin_dir_path(__ DIR __)。'/ myfile.inc');

–FoggyDay
19-10-4在20:28

#2 楼

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

定义您的插件目录

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

示例代码:

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


只需简单地包含或要求

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

示例代码:

include "classes/plugin-core.php";


评论


相对包括可能带来各种令人讨厌的意外问题。

–马克·卡普伦
17年12月1日在7:47

#3 楼

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

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

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


我在WordPress支持中阅读了有关内容。
再次感谢您的回答!

评论


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

–我是最愚蠢的人
17年9月18日在10:28

#4 楼

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

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


我认为它不会真正解决您的问题,这似乎是一个范围问题,但这是我使用的代码。

关于include和require之间的区别:
如果找不到该文件,include将抛出警告
require将引发致命错误如果找不到文件,则会出现错误

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

#5 楼


Include

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

Include一次

include_once()语句包括和在执行
脚本期间评估指定的
文件。这是与
include()语句类似的行为,唯一的区别是,如果已经包含了来自文件的代码,则将不包含该文件。再次。就像
名称所暗示的那样,它只会被包含一次


Require

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月21日在3:35



#6 楼

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

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

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

#7 楼

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


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

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


#8 楼

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

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

评论


请从提供给您答案的链接中添加相关信息。将链接用于信用目的。请编辑您的问题

–Pieter Goosen
2014年5月29日下午5:48