Создание пользовательских URL-адресов с шаблоном для получения внешнего JSON.

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

Привет, ребята, надеюсь, вы сможете помочь.

У меня есть сайт на 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, и это действительно оказалось не так сложно для понимания.

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

  1. Я создал страницу внутри WP. Назвал её “Продукты” (slug: example.com/products)
  2. Создал шаблон в корневом каталоге своей темы и указал для него имя шаблона

    /** 
     * Имя шаблона: моя страница одного продукта
     */
    
  3. Выбрал “Моя страница одного продукта” из выпадающего списка шаблонов в интерфейсе администратора моей страницы “Продукты”

  4. Скопировал ID страницы (1234)
  5. В 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);
    
  6. Внутри “Моя страница одного продукта” я могу сделать что-то вроде этого:

    global $wp_query;
    $product_slug = $wp_query->query_vars['product_slug'];
    
    echo $product_slug;
    
  7. При посещении 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. Создание страницы и шаблона

  1. Создание страницы:

    • Создайте новую страницу в административной панели WordPress и назовите её "Продукты" (например, example.com/products).
  2. Создание шаблона:

    • В корневом каталоге вашей темы создайте файл шаблона с именем, например, single-product.php, и добавьте в него заголовок шаблона:
    /**
    * Template Name: My single product page
    */
  3. Выбор шаблона:

    • В интерфейсе редактирования вашей страницы "Продукты" выберите созданный шаблон из выпадающего списка "Шаблон".

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 позволяет устраивать гибкие и структурированные решения, сохраняя при этом простоту в управлении контентом. Если у вас возникнут дополнительные вопросы или понадобится помощь, не стесняйтесь обращаться в сообщество или форумы, где всегда готовы выручить.

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

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