我不确定这样做是否正确
我想在WordPress中存储我的联系人表单条目,所以我创建了acustom post type
这不是唯一正确的方法,但在我看来,这是一个很好的方法。:)
它只是用来收集联系人表单条目,用户无需登录即可创建记录。然而,我得到了一个401错误
正如我在评论中所说,通过默认端点创建帖子(例如/wp/v2/contact
在您的情况下)需要authentication 默认情况下,即在API请求中,您需要关联有权在站点上创建帖子的用户,例如您自己。
如果您访问上述链接,默认的身份验证方法是基于cookie的,它要求当前用户登录到您的WordPress站点,因此该方法不适合您的情况,因为联系人表单对所有人(注册/登录用户和非注册/登录用户)都可用。
因此,您可能想考虑改用应用程序密码,而在过去,您需要使用类似的插件this, 但是有WordPress 5.6+, 您不再需要使用第三方插件。:)
但我不会进一步讨论您应该使用什么身份验证方法或如何使用它们,但是,我仍然想说,如果我要通过JS对我的API请求进行身份验证,而当前用户没有登录WordPress,我想我不会使用JWT,因为它通常要求我们在请求令牌时发送WordPress密码,我们当然不想暴露我们宝贵的密码!:)
这不应受到保护或需要授权
在这种情况下,您可以禁用CPT默认API端点的身份验证,这里有一种简单的方法:使用自定义rest_controller_class
用于您的CPT。
步骤如下:
扩展WP_REST_Posts_Controller
class 并修改create_item_permissions_check()
method (检查给定请求是否有权创建帖子)如下所示:
// File name: class-my-wp-rest-contact-controller.php
class My_WP_REST_Contact_Controller extends WP_REST_Posts_Controller {
public function create_item_permissions_check( $request ) {
if ( ! empty( $request[\'id\'] ) ) {
return new WP_Error(
\'rest_post_exists\',
__( \'Cannot create existing post.\' ),
array( \'status\' => 400 )
);
}
return true;
}
}
然后设置
rest_controller_class
以上类别的名称:
// On \'init\', load the above class file:
require_once \'/path/to/class-my-wp-rest-contact-controller.php\';
// Then register your CPT:
register_post_type( \'contact\', array(
// ... your other args.
\'show_in_rest\' => true,
\'rest_controller_class\' => \'My_WP_REST_Contact_Controller\',
// ... your other args.
) );
就这些,但是请随意进一步定制课程(如果需要任何说明,请告诉我)。
更新请注意,上述步骤只允许未经验证的请求使用基本帖子数据(如标题)创建帖子草稿。所以基本上,这些步骤只会有助于摆脱rest_cannot_create
错误(请注意下面的“创建”与“发布”)。
创建已发布的帖子(post_status
= publish
), 该请求需要经过身份验证,如果没有,那么代码就会出错rest_cannot_publish
.
但是,您可以扩展handle_status_param()
REST控制器类中的方法,如下所示:
public function handle_status_param( $post_status, $post_type ) {
if ( in_array( $post_status, array( \'draft\', \'publish\' ) ) ) {
return $post_status;
}
return parent::handle_status_param( $post_status, $post_type );
}
因此,在上面的示例中,我允许未经验证的请求将post状态设置为
draft
或
publish
, 对于其他状态,我让父类处理它。
请注意,(父)REST控制器类中还进行了其他权限检查,因此如果您从该类中获得另一个错误,则需要检查相关代码的源代码,然后扩展包含该代码的方法。(移除、绕过或修改限制)
如果您打算;“联系人”;发布帖子,则应通过设置exclude_from_search
argument 到true
(或者可能只是设定public
到false
, 然后设置两者publicly_queryable
和show_ui
到true
).