Чтобы добавить собственное поле 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 для секретов: поле, доступное при чтении, нужно проектировать отдельно от поля, разрешённого к изменению.
Проверка работы
- Получите запись через
/wp-json/wp/v2/case_study/{id}и проверьте наличие ключа вmeta. - Попробуйте обновление под пользователем, имеющим право редактирования записи.
- Повторите под ролью без такого права — запись должна остаться неизменной.
- Проверьте тип значения, пустую строку, неожиданную структуру JSON и неверный ID.
Маршрут зависит от параметра rest_base при регистрации CPT; здесь показан типичный вариант.
Ошибки проектирования
- Не добавили
custom-fieldsвsupportsCPT. - Поставили
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/
Материал был полезен?
Помогите нам сделать материалы точнее и понятнее.