ворд-пресс.рф
Разработка

Поля CPT в WordPress REST API: register_post_meta и права доступа

Как зарегистрировать поле собственного типа записи и безопасно читать и менять его через REST API.

Чтобы добавить собственное поле CPT в REST API, недостаточно просто записать значение через update_post_meta(). Нужно зарегистрировать ключ и описать тип значения, правила очистки и условия доступа.

Перед началом

Предполагается, что CPT case_study уже зарегистрирован и содержит show_in_rest => true, а в supports добавлено custom-fields. Это обязательное условие для стандартной регистрации метаданных CPT в REST API.

Пример поля external_ref

<?php
add_action( 'init', function () {
    register_post_meta( 'case_study', 'external_ref', array(
        'type'              => 'string',
        'single'            => true,
        'default'           => '',
        'show_in_rest'      => true,
        'sanitize_callback' => 'sanitize_text_field',
        'auth_callback'     => function ( $allowed, $meta_key, $post_id ) {
            return current_user_can( 'edit_post', $post_id );
        },
    ) );
} );

Это учебный пример для нечувствительного идентификатора внешней системы. Не применяйте show_in_rest => true для секретов: поле, доступное при чтении, нужно проектировать отдельно от поля, разрешённого к изменению.

Проверка работы

  1. Получите запись через /wp-json/wp/v2/case_study/{id} и проверьте наличие ключа в meta.
  2. Попробуйте обновление под пользователем, имеющим право редактирования записи.
  3. Повторите под ролью без такого права — запись должна остаться неизменной.
  4. Проверьте тип значения, пустую строку, неожиданную структуру JSON и неверный ID.

Маршрут зависит от параметра rest_base при регистрации CPT; здесь показан типичный вариант.

Ошибки проектирования

  • Не добавили custom-fields в supports CPT.
  • Поставили show_in_rest => true, но не подумали о чтении чувствительных сведений.
  • Проверяют только nonce без current_user_can().
  • Полагаются на очистку sanitize_text_field() как на универсальную защиту.
  • Возвращают сложные массивы без JSON Schema для show_in_rest.

Результат

У зарегистрированного поля есть тип, правило очистки и контролируемая запись. При добавлении сложных структур используйте схему REST и тесты авторизации, а не копируйте упрощённый пример для строк.

Источник: https://developer.wordpress.org/reference/functions/register_post_meta/

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.