从操作挂钩之外的插件访问数据库

时间:2016-11-16 作者:Hugh Stimson

我正在开发一个插件,该插件提供了一个端点,用于针对远程服务器处理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.

是否有另一种访问数据库的方法,应该在这种情况下工作,并且插件目录维护人员可以接受这种方法?

1 个回复
最合适的回答,由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参数感到满意。