我同意你的看法Tom\'s comment, WP-CLI命令可能更好。其优点是该命令直接从php在服务器上运行(通常没有最长执行时间,加载不同的php.ini等),并且不需要涉及Web服务器。
如果不可能,下一个最好的方法可能是create a custom REST endpoint. WordPress有一个类WP_REST_Controller
, 通常我写的类extend
从这里开始工作。为了简单起见,下面的示例没有使用继承,但我尽量使用相同的行话。
1. Register new route
通过注册新/自定义路线
register_rest_route()
就像这样
$version = 1;
$namespace = sprintf(\'acme/v%u\', $version);
$base = \'/import\';
\\register_rest_route(
$namespace,
$base,
[
[
\'methods\' => \\WP_REST_Server::CREATABLE,
// equals [\'POST\',\'PUT\',\'PATCH\']
\'callback\' => [$this, \'import_csv\'],
\'permission_callback\' => [$this, \'get_import_permissions_check\'],
\'args\' => [],
// used for OPTIONS calls, left out for simplicity\'s sake
],
]
);
这将创建一条新路线,您可以通过
http://www.example.com/wp-json/acme/v1/import/
default REST start-^ ^ ^
namespace with version-| |-base
2. Define permissions check
也许你需要身份验证?使用nonces?
public function get_import_permissions_check($request)
{
//TODO: implement
return true;
}
3. Create your actual endpoint callback
之前定义的方法通过
WP_REST_Request
对象,使用它访问请求正文等。为了保持一致,通常最好返回
WP_REST_Response
而不是自定义打印JSON或类似内容。
public function import_csv($request)
{
$data = [];
// do stuff
return new \\WP_REST_Response($data, 200);
}
如果您以OOP风格完成所有这些,您将获得以下类
class Import_CSV
{
/**
* register routes for this controller
*/
public function register_routes()
{
$version = 1;
$namespace = sprintf(\'acme/v%u\', $version);
$base = \'/import\';
\\register_rest_route(
$namespace,
$base,
[
[
\'methods\' => \\WP_REST_Server::CREATABLE,
\'callback\' => [$this, \'import_csv\'],
\'permission_callback\' => [$this, \'get_import_permissions_check\'],
\'args\' => [],
],
]
);
}
/**
* endpoint for POST|PUT|PATCH /acme/v1/import
*/
public function import_csv($request)
{
$data = [];
// do stuff
return new \\WP_REST_Response($data, 200);
}
/**
* check if user is permitted to access the import route
*/
public function get_import_permissions_check($request)
{
//TODO: implement
return true;
}
}
但是。。还是404?是的,遗憾的是,简单地定义类是行不通的(默认情况下没有自动加载:(),所以我们需要运行
register_routes()
像这样(在插件文件中)
require_once \'Import_CSV.php\';
add_action(\'rest_api_init\', function(){
$import_csv = new \\Import_CSV;
$import_csv->register_routes();
});