Извлечь мои пользовательские настройки на конечной точке API в настройках.

Вопрос или проблема

Я прочитал этот пост: Сериализованные настройки в REST API и, хотя я действительно убежден, что ответ именно то, что мне нужно, я не могу заставить его работать.

То, чего я пытаюсь достичь, это получить мои собственные настройки при вызове эндпоинта /wp-json/wp/v2/settings/.

Мои настройки зарегистрированы следующим образом:

 public function __construct() {
      add_action( 'init', array( $this, 'coopedia_settings_init' ) );
      add_action( 'rest_api_init', array( $this, 'coopedia_settings_init' ) );
}

public function coopedia_settings_init() {
      register_setting(
        'coopedia_settings_group', // option_group
        'coopedia_settings', // option_name
        array(
          'show_in_rest' => array(
            'schema' => array(
              'type'       => 'object',
              'properties' => array(
                'identity_provider_uri' => array(
                    'type' => 'string',
                ),
                'classifications_uri' => array(
                    'type' => 'string',
                ),
              )
            )
          ),
          'sanitize_callback' => array($this, 'coopedia_settings_sanitize'),
     ),
  );
}

Обновление и регистрация настроек на самом деле работают, они отображаются на моей странице настроек и сохраняются правильно.

Но затем, когда я вызываю эндпоинт внутри блока Gutenberg, используя следующий синтаксис:

 async componentDidMount() {
    console.log("fetching datatatata");
    wp.api.loadPromise.then(async () => {
      this.settings = new wp.api.models.Settings();
      if (false === this.state.isAPILoaded) {
        this.settings.fetch().then((response) => {
          // Push the coopedia settings classification website in state
          this.setState({
            classifications_uri: response.classifications_uri,
            isAPILoaded: true,
          });
        });
      }
    }
}

Вызов this.settings.fetch() выполняется (я проверил это на вкладке сети), но я получаю только стандартные:

{
  "title": "coopedia-test",
  "description": "Просто еще один сайт WordPress",
  "url": "http://coopediatest.local",
  "email": "benoit+32@******.com",
  "timezone": "",
  "date_format": "F j, Y",
  "time_format": "g:i a",
  "start_of_week": 1,
  "language": "en_US",
  "use_smilies": true,
  "default_category": 1,
  "default_post_format": "0",
  "posts_per_page": 10,
  "default_ping_status": "open",
  "default_comment_status": "open"
}

Вот скриншот вызова сети и объект ответа из инспектора:

Скриншот вызова сети

Что я здесь упускаю? Кстати, документация неясна в отношении возможностей расширения стандартных эндпоинтов, а также используемых объектов wp.* в новых мета-блоках Gutenberg.

У меня была похожая проблема, и я попал сюда.

Я не уверен, было ли это исправлено временем, но я попробовал этот код, и он работает как ожидалось, coopedia_settings: null присутствует в ответе fetch.

Единственный случай, который я могу представить: если класс, который вызывает rest_api_init, инициализируется в действии, которое происходит после вызова rest_api_loaded, он зарегистрируется для страницы настроек, но не зарегистрируется для API.

В моем случае создание класса прямо в инициализации плагина работает как ожидалось.

Ответ или решение

Конечно, давайте разберемся подробно с вашей задачей. Из вашего описания проблемы видно, что вы хотите получить доступ к пользовательским настройкам через REST API на WordPress, используя конечную точку /wp-json/wp/v2/settings/. Однако вы сталкиваетесь с тем, что получаете только стандартные настройки сайта.

Проблема

Основная проблема здесь заключается в том, что настройки, которые вы зарегистрировали с помощью функции register_setting, не добавляются в ответ вашего REST API. Это может быть связано с несколькими факторами:

  1. Неправильное инициирование хука rest_api_init: Если ваш класс или функции, которые регистрируют настройки, вызываются после момента, когда загружается REST API, они могут не быть зарегистрированы должным образом.

  2. Неправильный формат схемы: Важно убедиться, что ваша схема в параметре show_in_rest соответствует всем требованиям WordPress для регистрации REST API полей.

Решение

Теперь давайте посмотрим, как вы можете решить эту проблему:

1. Правильная регистрация на хуке rest_api_init:

Убедитесь, что ваша функция coopedia_settings_init правильно регистрируется с помощью хука rest_api_init. Это критично для того, чтобы ваша настройка отображалась в API. Вот небольшой пример, как можно это сделать:

add_action('rest_api_init', function() {
    register_setting('coopedia_settings_group', 'coopedia_settings', array(
        'show_in_rest' => array(
            'schema' => array(
                'type'       => 'object',
                'properties' => array(
                    'identity_provider_uri' => array(
                        'type' => 'string',
                    ),
                    'classifications_uri' => array(
                        'type' => 'string',
                    ),
                ),
            ),
        ),
        'sanitize_callback' => 'sanitize_callback_function',
    ));
});

2. Проверка схемы: Убедитесь, что схема и структура данных соответствует требуемой для REST API формату. Это важно для правильной работы сериализации данных в API.

3. Инициализация класса: Убедитесь, что ваш класс инициализируется на этапе загрузки плагина, а не после загрузки всех API. Это может выглядеть как:

add_action('plugins_loaded', function() {
    $your_class_instance = new Your_Class_Name();
});

4. Проверка на JavaScript стороне: Убедитесь, что ваш front-end код корректно обрабатывает данные. Из кода видно, что вы используете модель wp.api.models.Settings, но для работы с пользовательскими настройками, возможно, вам потребуется самостоятельно писать запросы для получения специфичных данных.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...