Вопрос или проблема
Привет, ребята, надеюсь, вы сможете помочь.
У меня есть сайт на WP и внешний JSON-эндпоинт (НЕ из другого WP), и что я хочу сделать, так это создать динамические “фейковые” URL внутри WordPress, такие как: example.com/product/{{product_slug}}, и при входе по этому URL я хочу получить мой JSON-эндпоинт с этим же слагом, что-то вроде: externalsite.com/api/v1/product/{{product_slug}} внутри шаблона, например, single-product.php.
Мне удалось достичь чего-то подобного с помощью add_filter(‘template_include’) и отслеживания URL, но это было довольно хакерским решением.
Я также выяснил, что, возможно, мне следует использовать add_rewrite_rule(), но не нашел, как использовать его без перенаправления.
ПРИМЕЧАНИЕ: я не хочу создавать пользовательские типы записей.
Если вам нужна какая-либо другая информация о том, что я пытаюсь достичь, пожалуйста, спрашивайте. Я не хочу, чтобы вы писали код для меня, но хочу, чтобы вы направили меня в правильном направлении. Спасибо заранее.
Оказалось, что для меня это просто был пятница.
Спасибо @eddiemoya и @matt-keys за их ответы на этот вопрос.
Их ответ очень помог мне. После их объяснения я снова посмотрел документацию WordPress, и это действительно оказалось не так сложно для понимания.
Решение, которое я использовал для своего конкретного вопроса, было следующим:
- Я создал страницу внутри WP. Назвал её “Продукты” (slug: example.com/products)
-
Создал шаблон в корневом каталоге своей темы и указал для него имя шаблона
/** * Имя шаблона: моя страница одного продукта */
-
Выбрал “Моя страница одного продукта” из выпадающего списка шаблонов в интерфейсе администратора моей страницы “Продукты”
- Скопировал ID страницы (1234)
-
В functions.php я написал следующий код:
function product_api_rewrite_tag() { add_rewrite_tag('%product_slug%', '([^&]+)'); } function product_api_rewrite_rule() { add_rewrite_rule('^products/([^/]*)/?','index.php??page_id=1234&product_slug=$matches[1]','top'); } add_action('init', 'product_api_rewrite_tag', 10, 0); add_action('init', 'product_api_rewrite_rule', 10, 0);
-
Внутри “Моя страница одного продукта” я могу сделать что-то вроде этого:
global $wp_query; $product_slug = $wp_query->query_vars['product_slug']; echo $product_slug;
-
При посещении example.com/products/my_new_product шаблон вернет my_new_product.
Ответ или решение
Создание динамических "фейковых" URL для извлечения данных из внешнего JSON-эндоинта является интересной задачей, с которой сталкиваются многие разработчики на платформе WordPress. В этом ответе я постараюсь представить пошаговое руководство по реализации такого функционала без использования пользовательских типов записей.
1. Определение задачи
Ваша цель — создать динамические URL-адреса вида example.com/product/{{product_slug}}
, по которым будет извлекаться информация с внешнего JSON-эндоинта, используя указанный product_slug
. Для этого мы будем использовать API перезаписи WordPress, что позволит нам настраивать URL-адреса без перенаправлений на другие страницы.
2. Создание страницы и шаблона
-
Создание страницы:
- Создайте новую страницу в административной панели WordPress и назовите её "Продукты" (например,
example.com/products
).
- Создайте новую страницу в административной панели WordPress и назовите её "Продукты" (например,
-
Создание шаблона:
- В корневом каталоге вашей темы создайте файл шаблона с именем, например,
single-product.php
, и добавьте в него заголовок шаблона:
/** * Template Name: My single product page */
- В корневом каталоге вашей темы создайте файл шаблона с именем, например,
-
Выбор шаблона:
- В интерфейсе редактирования вашей страницы "Продукты" выберите созданный шаблон из выпадающего списка "Шаблон".
3. Настройка функций для перезаписи
Добавьте следующий код в файл functions.php
вашей темы:
function product_api_rewrite_tag() {
add_rewrite_tag('%product_slug%', '([^&]+)');
}
function product_api_rewrite_rule() {
add_rewrite_rule('^products/([^/]*)/?', 'index.php?pagename=products&product_slug=$matches[1]', 'top');
}
add_action('init', 'product_api_rewrite_tag', 10, 0);
add_action('init', 'product_api_rewrite_rule', 10, 0);
4. Извлечение данных в шаблоне
Внутри вашего шаблона single-product.php
вы можете использовать следующий код для извлечения product_slug
и выполнения запроса к внешнему JSON-эндпоинту:
global $wp_query;
$product_slug = $wp_query->query_vars['product_slug'];
// Теперь можно использовать $product_slug для получения данных
$response = wp_remote_get("https://externalsite.com/api/v1/product/$product_slug");
if (is_wp_error($response)) {
// Обработка ошибок
$error_message = $response->get_error_message();
echo "Ошибка: $error_message";
} else {
// Данные успешно получены
$data = json_decode(wp_remote_retrieve_body($response), true);
// Обработка данных
echo '<pre>';
print_r($data);
echo '</pre>';
}
5. Принудительное обновление правил перезаписи
Не забудьте обновить ваши правила перезаписи, чтобы новые правила начали действовать. Это можно сделать, перейдя в "Настройки" -> "Постоянные ссылки" и просто нажав кнопку "Сохранить изменения". Это не приведет к изменениям, но заставит WordPress обновить свои правила перезаписи.
Заключение
Надеюсь, это руководство направит вас в правильном направлении для достижения вашей цели. Создание динамических URL с использованием API перезаписи WordPress позволяет устраивать гибкие и структурированные решения, сохраняя при этом простоту в управлении контентом. Если у вас возникнут дополнительные вопросы или понадобится помощь, не стесняйтесь обращаться в сообщество или форумы, где всегда готовы выручить.