Получение пользовательского типа записи REST API не работает

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

Я хочу загрузить содержимое модального окна, используя REST API WordPress. Я добавил параметр show_in_rest к пользовательскому типу сообщения, который зарегистрировал в своем файле функций, но я не могу его загрузить, получаю эту ошибку rest_no_route.
Как я могу это исправить?

Функции:

function staff()
  {
    $labels = array(
      'name'               => _x( 'Команда', 'общее название типа поста'),
      'singular_name'      => _x( 'Команда', 'единственное число типа поста'),
      'menu_name'          => _x( 'Команда', 'административное меню'),
      'name_admin_bar'     => _x( 'Команда', 'добавить новое в админ баре'),
      'add_new'            => _x( 'Новый Человек', 'Добавить участника команды'),
      'add_new_item'       => __( 'Имя'),
      'new_item'           => __( 'Добавить Человека'),
      'edit_item'          => __( 'Редактировать Человека'),
      'view_item'          => __( 'Просмотреть Команду'),
      'all_items'          => __( 'Просмотреть Все'),
      'featured_image'     => __( 'Изображение', 'text_domain' ),
      'search_items'       => __( 'Найти Человека'),
      'parent_item_colon'  => __( 'Родитель:'),
      'not_found'          => __( 'Участник не найден.'),
      'not_found_in_trash' => __( 'Участник не найден в Корзине.'),
    );

    $args = array(
      'labels'             => $labels,
      #'menu_icon'       => 'dashicons-star-half',
      'description'        => __( 'Описание.'),
      'public'             => true,
      'publicly_queryable' => true,
      'show_ui'            => true,
      'show_in_menu'       => true,
      'show_in_rest'       => true,
      'query_var'          => true,
      'rewrite'            => true,
      'capability_type'    => 'post',
      'has_archive'        => true,
      'hierarchical'       => true,
      'menu_position'      => null,
      'supports'           => array('title','editor','thumbnail','custom-fields')
    );

    register_post_type( 'staff', $args );
  }
  add_action('init', 'staff');

JS/AJAX код:

  $('.staff-link').on('click', function(e){
    e.preventDefault();
    var id = $(this).attr('data-id');
    var type = $(this).attr('data-type');
    console.log(id);
    $.getJSON('https://localhost/wordpress/wp-json/wp/v2/'+type+'&id='+id, function(data){
      console.log(data);
    });
  });

У меня есть еще одно решение для тех, кто хотел бы забыть REST API WordPress.

Создайте свой собственный PHP файл, где вы вернете JSON код необходимых данных. Основная структура файла:

(Примечание: вам нужно инициализировать ваш файл, подключив его в functions.php и используя add_action “init”)

<?php
$autorisation = isset($_POST['activate']) ? $_POST['activate'] : '';
$id = isset($_POST['id']) ? $_POST['id'] : '';

if($autorisation !== 'call-staff-post'){
    return;
}

if(empty($id)){
    // Если id пуст, вернуть все данные
    $args = array('post_type' => 'staff', 'posts_per_page' => '-1');
} else {
    $args = array('post_type' => 'staff', 'p' => $id);
}

$staff = new WP_Query($args);

$return = array();
while($staff->have_posts()) : $staff->the_post();
    $return[] = array(
        'title' => get_the_title(),
    );
endwhile;

echo json_encode($return);

exit;
?>

Ваш JS/POST вызов:

$.post(window.location.href, {
    activate: 'call-staff-post',
    id: YOUR ID // Должен быть целым числом, а не строкой
}, function(data){
    var json = JSON.parse(data);

    console.log(json);
});

.

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

Решение проблемы с REST API для пользовательского типа записей в WordPress

Введение

Использование REST API WordPress для загрузки контента является мощным инструментом, однако иногда возникают проблемы, такие как ошибка rest_no_route. В данном руководстве мы внимательно разберём вашу ситуацию и предложим решение для корректной работы REST API пользовательского типа записей.

Проблема: Ошибка rest_no_route

Ошибка rest_no_route возникает, когда запрашиваемый маршрут не найден в REST API. В вашем случае это может быть связано с неправильной настройкой пользовательского типа записей или неверным форматом AJAX-запроса.

Проверка регистрационного кода пользовательского типа записей

Ваш код для регистрации кастомного типа записей выглядит в основном корректно. Однако, убедитесь, что параметр show_in_rest действительно установлен в true, и пользовательский тип записей зарегистрирован корректно:

function staff() {
    // Labels
    $labels = array(
        // (опущены для краткости)
    );

    // Arguments
    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'show_in_rest'       => true, // Обязательно должно быть true
        'hierarchical'       => true,
        'supports'           => array('title', 'editor', 'thumbnail', 'custom-fields')
    );

    register_post_type('staff', $args);
}
add_action('init', 'staff');

Убедитесь, что функция staff вызывается в нужный момент жизни WordPress (до выполнения любых запросов).

Проверка запроса к REST API

Ваш AJAX-запрос имеет некоторые ошибки, которые могут препятствовать корректной работе. Ваша строка запроса:

$.getJSON('https://localhost/wordpress/wp-json/wp/v2/'+type+'&amp;id='+id, function(data){
    console.log(data);
});

Этот код следует изменить на правильный формат REST API, который требует использования как пути, так и параметров, переданных через ?_embed:

$.getJSON('https://localhost/wordpress/wp-json/wp/v2/' + type + '/' + id, function(data){
    console.log(data);
}).fail(function(jqXHR, textStatus, errorThrown) {
    console.error('Ошибка: ' + textStatus, errorThrown);
});

Обратите внимание, что вы передаете id в URL, как и положено. Также рекомендуется добавить механизм обработки ошибок, чтобы получать более конкретную информацию о проблемах.

Проверка доступности маршрутов

Вам следует проверить, доступны ли ваши маршруты. Для этого вы можете перейти по следующему URL в браузере:

https://localhost/wordpress/wp-json/wp/v2/staff

Если маршрут вернёт ошибку, это означает, что есть что-то неправильно в регистрации вашего пользовательского типа записей. Если вы видите данные, значит, маршрут работает корректно, и проблема скорее всего заключается в другой части вашего AJAX-запроса.

Альтернативный подход

Если вы хотите обойтись без REST API, можно создать отдельный PHP файл для получения данных. Однако этот подход менее масштабируем и не использует мощь REST API WordPress. Ваша реализация AJAX через POST запрос, приведенная в вашем вопросе, также имеет смысл, но для современных проектов рекомендуем придерживаться REST API.

Заключение

Работа с WordPress REST API может быть непростой задачей, но с правильной настройкой и тщательной проверкой вашего кода вы сможете устранить проблему rest_no_route. Убедитесь, что вы используете корректные маршруты при формировании запросов и что пользовательский тип записей зарегистрирован правильно. Следуя указанным шагам, вы сможете успешно загрузить данные в вашу модальную форму. Если у вас остались вопросы, не стесняйтесь задавать их!

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

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