繁体   English   中英

WordPress插件:如何解决“对未定义函数add_action()和add_action()的调用”?

[英]WordPress Plugin: How to resolve “Call to undefined function add_action() as well as add_action()”?

Fatal error: Call to undefined function add_action() in D:\xampp\htdocs\excel\wp-content\plugins\DatabaseToExcel\download.php on line 13

我正在创建一个插件以将数据库表导出到Excel工作表。 主要是我的插件中有两个文件,我正在发送一个后发请求,要求下载具有表名的download.php文件。 我想确保已登录admin的download.php文件,但是当我调用任何WordPress Core函数时,发生致命错误。 我包括wp-load.php和其他类似的文件-

require_once('../../../wp-load.php');
require_once('../../../wp-config.php');
require_once('../../../wp-includes/load.php');

在这种情况下,auth_redirect()之类的功能可以正常工作而不会出现任何错误。 但我想将此插件上传到www.wordpress.org。

他们说使用这种方法包含文件不是很好,我们不能批准它,因为另一个WordPress安装中的文件结构可能会有所不同,在这种情况下将无法使用。

这是wordpress.org-的回复

在download.php中,该方式仍然不受保护

require_once('../../../wp-load.php');
require_once('../../../wp-config.php');
require_once('../../../wp-includes/load.php');

包括wp-config.php,wp-blog-header.php,wp-load.php或几乎所有您必须直接通过include调用的其他WordPress核心文件都不是一个好主意,我们无法批准该插件除非有充分的理由来加载文件,否则请这样做。 由于并非所有WordPress安装都具有完全相同的文件结构,因此很容易失败。

通常,插件将包括wp-config.php或wp-load.php,以获取对WordPress核心功能的访问权限,但是有更好的方法来执行此操作。 最好将处理功能(需要但无法访问核心功能的处理功能)绑定到动作挂钩中,例如“ init”或“ admin_init”。

请参考插件API参考以获取更多信息: http : //codex.wordpress.org/Plugin_API

对于其他可能性,或者为了更好地理解我们为什么不允许这样做,请阅读以下内容: http : //ottopress.com/2010/dont-include-wp-load-please/

如果您由于需要访问WordPress之外的WordPress功能而尝试使用它,那么实际上我们宁愿您根本不这样做。 您的插件应位于WordPress内,如果需要这种访问权限,则只有已登录并获得授权的人员才能访问。 插件的页面应像其他所有设置面板一样通过仪表板调用,这样,它们将始终可以访问WordPress函数。

这是我的第一个WordPress插件,经过数小时的努力和阅读所有这些插件,我没有解决方案。

加载WP文件后,包括您的download.php文件。 这是放置在插件主文件(或加载程序)中的代码示例:

add_action('wp_loaded', 'pluginPrefix_include_download_script');
function pluginPrefix_include_download_script() {
  require('download.php');
}

如果您需要更早加载此文件,则还可以使用其他操作,例如admin_init 您还可以使用plugin_dir_path(__FILE__)指定文件的路径,这将返回您插件目录的路径,您可以像这样使用它:

function pluginPrefix_include_download_script() {
  $pluginDirPath = plugin_dir_path(__FILE__);
  require($pluginDirPath.'download.php');
}

如果您的download.php位于子文件夹(例如,inc /)中,则可能会变得很方便。 在这种情况下,您的include函数可能如下所示:

require($pluginDirPath.'inc/download.php')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM