我正在开发一个插件,该插件提供了一个端点,用于针对远程服务器处理OAuth2授权,成功授权后,将来自该服务器的一些信息存储在Wordpress数据库中,并将用户重定向到Wordpress站点上的页面。
为了存储数据,插件使用wpdb
功能,我理解为推荐做法。
E、 g.:
# Require wp-load.php in order to access $wpdb.
require_once(dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . \'wp-load.php\');
global $wpdb;
$table_name = $wpdb->prefix . \'placespeak\';
$query_array = [$app_id];
$client_info = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM " . $table_name . " WHERE id = %d",
$query_array
)
);
插件的当前版本为
hosted on github here.
然而,当我将插件提交到Wordpress插件目录时,我收到了以下响应:
直接调用核心加载文件,包括wp config。php,wp博客标题。php,wp加载。php或几乎任何其他WordPress核心文件,您必须通过include直接调用,这不是一个好主意,我们不能批准这样做的插件,除非它有很好的理由加载文件。由于并非所有WordPress安装都具有完全相同的文件结构,因此很容易失败。
通常插件将包括wp config。php或wp加载。php来访问核心WordPress函数,但有更好的方法来实现这一点。最好将处理函数(需要但无法访问核心函数的函数)绑定到一个动作挂钩中,例如;初始化(&Q);或“或”;admin\\u init";。
这是完全合理的,但我不知道如何继续。
因为端点不是Wordpress管理界面的一部分,所以没有钩子来包装它(我想是吧?)。
我试着要求;“剥离式”;版本wp-load
, e、 g。
define( \'SHORTINIT\', true );
require_once(dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . \'wp-load.php\');
但这产生了
Call to undefined function trailingslashit()
使用执行数据库查询时出错
wpdb
如上所述
a known limitation 使用
SHORTINIT
版本
wp-load
.
是否有另一种访问数据库的方法,应该在这种情况下工作,并且插件目录维护人员可以接受这种方法?
最合适的回答,由SO网友:soulseekah 整理而成
从直接命中的PHP文件引导WordPress通常不是一个好主意,存储库维护人员是对的。使用Rewrite API, 所以你没有理由不这样做。
add_action( \'init\', function() {
/** Add a custom path and set a custom query argument. */
add_rewrite_rule( \'^your/custom/path/?$\', \'index.php?custom_action=1\', \'top\' );
} );
add_filter( \'query_vars\', function( $query_vars ) {
/** Make sure WordPress knows about this custom action. */
$query_vars []= \'custom_action\';
return $query_vars;
} );
add_action( \'wp\', function() {
/** This is an call for our custom action. */
if ( get_query_var( \'custom_action\' ) ) {
// your code here
}
} );
现在击中
https://yoursite.com/your/custom/path/ WordPress将加载并调用您的代码。
更简单的方法是使用$_GET
参数
add_action( \'init\', function() {
if ( !empty( $_GET[\'custom_action\'] ) ) {
// your code here
}
} );
然后击中
https://yoursite.com/?custom_action=1您的选择,取决于您是想要一个好的URL,还是对不太漂亮的GET参数感到满意。