这里我的最终目的是要实现在一个 WP 的网站发布文章,之后同步到不同的 WP 站点。这样的话我发布文章的主站就需要有其他几个网站的 API 权限。
WP 的 Rest API 支持三种身份验证方式:Basic 身份认证、Cookie 认证及 OAuth 身份认证。
这里我使用的是 Basic 身份认证,也就是授权时在 Auth 中传入用户名、密码之后 base64编码。这里用户名是管理员邮箱,密码是通过应用程序密码生成的。
首先管理员邮箱肯定每个站长都清楚,所以需要做的就是在其他几个要接收文章的站点后台设置应用程序密码。具体的权限密码是在 WP 后台——用户——个人资料页面的 应用程序密码 生成的:
输入一个名称,之后系统会自动生成一个密码串,你需要保存好,因为为了安全考虑,系统不支持查询该密码。
以创建文章为例,具体代码实现:
$site_config = [
'a.xxx.com' => [
'type' => 'zibll',
'crypt_key'=> base64_encode($admin_email . ':' . ACRYPT_KEY),
],
'b.xxx.com' => [
'type' => 'ripro',
'crypt_key'=> base64_encode($admin_email . ':' . BCRYPT_KEY),
],
];
function sync_to_target_sites($post_id, $post) {
global $site_config;
$api_name = 'wp/v2/posts';
// 获取文章内容
$post_content = $post->post_content;
// 获取文章分类
$post_categories = wp_get_post_categories($post_id);
$post_meta = [
'cao_price' => '9.9',
];
$post_data = [
'author' => $post->post_author,
'title' => $post->post_title,
'content' => $post_content,
'categories' => $post_categories,
'meta' => $post_meta,
'status' => $post->post_status,
];
// 同步数据到各个网站
foreach ($site_config as $host => $site) {
// 构建请求参数
$request_params = [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . $site['crypt_key'],
],
'body' => wp_json_encode($post_data),
'timeout' => 60,
];
$target_api_url = "https://$host/wp-json/$api_name";
// 发起请求到目标网站的 REST API
$response = wp_remote_post($target_api_url, $request_params);
// 检查响应是否成功
if (is_wp_error($response)) {
error_log('error code: ' . $response_code. '失败原因:' . $response->get_error_message());
}
}
}
PHP具体的 API 参数信息可参见:https://developer.wordpress.org/rest-api/reference/。
应用程序的启用与禁用
// 禁用是 __return_false 启动是 __return_true
add_filter( 'wp_is_application_passwords_available', '__return_false' );
PHP文章 meta 数据的插入
文章插入 meta 数据也是有讲究的。我反复查看了 API 及查找资料才搞清楚插入步骤。
A 网站向 B 网站插入 meta 数据,除了需要给 API 的 meta 赋值之外,首先是需要在 B 网站注册相关字段的。比如我需要向 B 站点插入 cao_price 字段,那么在 B 站点的主题文件中可以写这样一个函数:
add_action( 'rest_api_init', function() {
$object_type = 'post';
function register_my_meta($object_type, $meta_key, $type, $description, $show_in_rest = true, $extra = []) {
$meta_data = [
'type' => $type,
'description' => $description,
'single' => true,
'show_in_rest' => $show_in_rest
];
foreach ($extra as $key => $value) {
$meta_data[$key] = $value;
}
register_meta($object_type, $meta_key, $meta_data);
}
// 注册元数据
register_my_meta($object_type, 'cao_price', 'string', 'resource price');
});
PHP其中 register_my_meta 函数支持插入简单结构的字符串 比如 price,也可以插入复杂结构的数组。
更多精彩内容:各种技能学习课程、黑科技软件、网站小程序源码、副业小项目、电商课程、推广引流课程等,尽在 天边资源网 。