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

Posted

技术标签:

【中文标题】WordPress 插件:如何解决“调用未定义函数 add_action() 以及 add_action()”?【英文标题】:WordPress Plugin: How to resolve "Call to undefined function add_action() as well as add_action()"? 【发布时间】:2015-11-12 16:36:50 【问题描述】:
Fatal error: Call to undefined function add_action() in D:\xampp\htdocs\excel\wp-content\plugins\DatabaseToExcel\download.php on line 13

我正在创建一个插件来将数据库表导出到 Excel 表。主要是我的插件中有两个文件,我正在发送一个 post 请求到 download.php 文件,其中包含将被导出的表名。我想确保在 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 或几乎任何其他必须通过包含直接调用的 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,您的方法不是一个好习惯。 WP 插件应该在它的生命周期中工作,并且应该在其中使用您的自定义代码。对于前端和插件之间的交互,您可以使用 wp_ajax_、admin_post_、admin_post_nopriv 等 WP 操作...只需根据 Codex 创建一个常规 WP 插件并将您的代码移动到其中,如何处理前端表单数据或操作请参阅这个answer 【参考方案1】:

在加载 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/)中,这可能会很方便。在这种情况下,您的包含函数可能如下所示:

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

【讨论】:

以上是关于WordPress 插件:如何解决“调用未定义函数 add_action() 以及 add_action()”?的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义的函数 wp_mail

致命错误:未捕获错误:调用未定义函数 is_product()

Wamp中的“调用未定义函数sqlsrv_connect()”,已安装驱动程序[重复]

致命错误:在第 2 行的 index.php 中调用未定义函数 get_header()

PHP调用未定义函数mysql_connect

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