将帖子反应到WordPress自定义帖子类型

时间:2021-03-26 作者:user8463989

我不确定这样做是否正确,但我有一个使用WordPress API作为后端的react网站。我想在WordPress中存储我的联系人表单条目,所以我创建了一个自定义帖子类型

 register_post_type(\'contact\', array(
    \'supports\'      => array(\'title\'),
    \'has_archive\'   => false,
    \'show_in_rest\'  => true,
    \'public\'        => true,
    \'labels\'        => array(
            \'name\'         => \'Contact DB\',
            \'add_new_item\' => \'Add New Contact\',
            \'edit_item\'    => \'Edit Contact\', 
            \'all_items\'    => \'All Contacts\',
    ),
    \'menu_icon\'     => \'dashicons-format-chat\'
));
我正在努力使它在前端保持简单,至少尝试存储标题

  const onSubmit = async (data) => {
    try {
      const response = await axios.post(
        `${process.env.NEXT_PUBLIC_API_ENDPOINT}/contact`,
        {
          title: data.name,
        }
      );
    } catch (err) {
      console.log(err);
    }
  };
这不应受到保护或需要授权,因为它只是用于收集联系人表单条目,用户无需登录即可创建记录。然而,我得到了一个401错误

{
    "code": "rest_cannot_create",
    "message": "Sorry, you are not allowed to create posts as this user.",
    "data": {
        "status": 401
    }
}

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我不确定这样做是否正确

我想在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状态设置为draftpublish, 对于其他状态,我让父类处理它。

请注意,(父)REST控制器类中还进行了其他权限检查,因此如果您从该类中获得另一个错误,则需要检查相关代码的源代码,然后扩展包含该代码的方法。(移除、绕过或修改限制)

如果您打算;“联系人”;发布帖子,则应通过设置exclude_from_search argumenttrue (或者可能只是设定publicfalse, 然后设置两者publicly_queryableshow_uitrue).

相关推荐

如何在WordPress 4.7+中使用REST-API进行元查询?

我试图通过元查询进行过滤,但无论我尝试什么,我都无法使其工作。基本上,我希望通过rest API进行此查询:wp-json/wp/v2/books?meta_query[relation]=OR&meta_query[0][key]=arkivera&meta_query[0][value]=1&meta_query[0][compare]== 我尝试了几个不同的自定义字段,但它总是返回所有post对象。在我的函数文件中,我添加了:function api_allow_m