php - WordPress 插件 : How to resolve "Call to undefined function add_action() as well as add_action()"?

标签 php mysql wordpress plugins

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 文件发送一个 post 请求,其中包含将导出的表名。我想确定管理员已登录 download.php 文件,但是当我调用任何 WordPress 核心功能时,会发生 fatal error 。我包括 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 中,仍然不 protected

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 功能,但有更好的方法可以做到这一点。最好将处理函数(那些需要但无权访问核心函数的函数)绑定(bind)到操作 Hook 中,例如“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/),这可能会很方便。在这种情况下,您的包含函数可能如下所示:

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

关于php - WordPress 插件 : How to resolve "Call to undefined function add_action() as well as add_action()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32094471/

相关文章:

php - Laravel - OAuth2 和 Facebook

mysql - 为什么这个正则表达式在 mysql 中不起作用?

wordpress - "ErrorUtils caught an error"- 任何 Wordpress Facebook 插件的 Chrome 控制台错误

php - 当 WooCommerce 中提供免费送货时,仅禁用特定的固定费率送货方式

php - 使用 php 将数据从 cron 中的 "raw"表传输到优化的 MySQL 表中

php - 获取 magento 中网站/商店可用的所有货币

php - 在 SQL WHERE 语句中使用 session 变量

php - 根据不同的运输方式更改 Woocommerce 订单状态

php - 如何配置 php_codesniffer 以强制 PHP 7.4 属性类型声明?

sql - 按已回答所有问题的用户分组