Вопрос или проблема
Я хочу загрузить содержимое модального окна, используя 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+'&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
. Убедитесь, что вы используете корректные маршруты при формировании запросов и что пользовательский тип записей зарегистрирован правильно. Следуя указанным шагам, вы сможете успешно загрузить данные в вашу модальную форму. Если у вас остались вопросы, не стесняйтесь задавать их!