Как создать динамически создаваемую страницу в плагине WordPress?

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

Я пытаюсь создать страницу, на которой будут ссылки, ведущие на URL, который определяется динамически по id ссылки.

function all_activites_submenu_page(){
        //Получить имя таблицы
        global $wpdb;
        $table_name="wp_booking_seasons";
        //получить название активности из таблицы
        $results = $wpdb->get_results("SELECT activity_name, id FROM $table_name");
        //получить URL сайта для динамического отображения страницы        
        $url = get_site_url();
        $plugin_url = $url. '/wp-content/plugins/ROOMZERO';
    //итерация по каждой записи и отображение каждой из них 
        foreach ($results as $row) {
            if($row->activity_name !== null && unserialize($row->activity_name) !== "" ){
            echo "Название активности:".unserialize($row->activity_name)."<div id='activity_button'><a href="https://wordpress.stackexchange.com/questions/428582/".$plugin_url."/backend/all_activities/modify_activity.php?id=".$row->id.""><button>Изменить активность</button></a></div> <br>";     
        }
        }
}

моя modify_activity.php страница выглядит так:

if (isset($_GET['id']) && !empty($_GET['id'])) {
    //установить id активности 
    $activity_id = intval($_GET['id']);
    global $wpdb;
    if(!isset($wpdb)){
        die("Ошибка: \$wpdb равно NULL");
    }
    
    $table_name="wp_booking_seasons";
    $results= $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", $activity_id));
    if($results){
        echo "<h1>". unserialize($results-> activity_name)."</h1>";
    }
    else{
        die("Активность с ID " . $activity_id . " не найдена");
    }
}

я думаю, что страница не включена в среду WordPress по какой-то причине, хотя я добавил ее на главную страницу с помощью

 require_once MY_PLUGIN_PATH .'backend/all_activities/modify_activity.php';

почему это не работает? Спасибо за ответы 🙂

Я добавил это :

require_once( $_SERVER['DOCUMENT_ROOT'] . '/wordpress/wp-load.php' );

и это сработало.

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

Создание динамически создаваемой страницы в плагине WordPress — это интересная задача, которая может потребовать знания как PHP, так и особенностей архитектуры WordPress. Давайте подробно рассмотрим, как можно это реализовать, включая создание динамических URL, интеграцию страницы в окружение WordPress и устранение возможных проблем.

Теория

Тем, кто разрабатывает плагины для WordPress, необходимо понимать, что WordPress использует так называемую "петельную архитектуру" (Event Loop). Любой контент, который необходимо интегрировать в WordPress, должен обязательно пройти через этот цикл, чтобы правильно загрузиться и используя все ресурсов WordPress, такие как темы и плагины.

Основные шаги для создания динамической страницы:

  1. Регистрация пользовательских URL: Это обеспечивается через Rewrite API. Вы можете добавлять свои собственные правила URL, которые WordPress будет распознавать и соответствующим образом обрабатывать.

  2. Создание функции отображения: Это часть вашего кода, которая будет знать, что делать с этими URL, и отобразит надлежащий контент.

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

  4. Обработка данных из базы данных: Использование глобального объекта $wpdb для извлечения данных из базы данных WordPress и их последующего отображения.

Пример

Рассмотрим код, который вы привели:

function all_activites_submenu_page(){
    // Получаем название таблицы
    global $wpdb;
    $table_name = "wp_booking_seasons";
    // Извлекаем имя активности из таблицы
    $results = $wpdb->get_results("SELECT activity_name, id FROM $table_name");
    // Получаем URL сайта для динамического отображения страницы        
    $url = get_site_url();
    $plugin_url = $url . '/wp-content/plugins/ROOMZERO';

    // Итерируем через каждую строку и отображаем каждый элемент
    foreach ($results as $row) {
        if($row->activity_name !== null && unserialize($row->activity_name) !== "" ){
            echo "Activity Name:" . unserialize($row->activity_name) . "<div id='activity_button'><a href='" . $plugin_url . "/backend/all_activities/modify_activity.php?id=" . $row->id . "'><button>Modify Activity</button></a></div><br>";     
        }
    }
}

Также ваш файл modify_activity.php:

if (isset($_GET['id']) && !empty($_GET['id'])) {
    // Присваиваем идентификатор активности
    $activity_id = intval($_GET['id']);
    global $wpdb;
    if(!isset($wpdb)){
        die("Error: \$wpdb is NULL");
    }

    $table_name = "wp_booking_seasons";
    $results = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", $activity_id));
    if($results){
        echo "<h1>" . unserialize($results->activity_name) . "</h1>";
    }
    else{
        die("No activity found with ID " . $activity_id);
    }
}

Применение

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

  1. Используйте WP механизмы для работы с URL. Обновите свой код для использования технологий WordPress, таких как WP Rewrites или add_menu_page() / add_submenu_page(), чтобы регистрировать ваши страницы как часть админки либо фронтенда.

  2. Убедитесь в инициализации WordPress:

    • То, что вы добавили require_once($_SERVER['DOCUMENT_ROOT'] . '/wordpress/wp-load.php'), заставляет скрипт сначала загружать весь WordPress. Хотя это работает, рекомендуется более элегантно интегрировать страницу — например, использовать do_action() и add_action() для обработки URL через плагин, связанный с подходящими хуками.
  3. Используйте безопасные методы работы с URL и данными:

    • Всегда экранируйте URL и связывайте параметры запроса через защищенные методы $wpdb->prepare(). Это предотвратит уязвимости, связанные с SQL-инъекциями.
  4. Управляйте структурами пагинации через add_rewrite_rule() и add_rewrite_tag():

    • Эти функции позволяют вам создать собственные URL-структуры без необходимости явного включения PHP-файлов.
  5. Генерация URL должна использовать add_query_arg() и esc_url() для добавления и экранирования параметров запросов:

    • Это лучший способ динамически строить и защищать URL.

Интеграция таких страниц не только позволит улучшить пользовательский опыт, но и обеспечит безопасность и расширяемость вашего плагина. Включая WordPress в качестве бэкэнда для динамических страниц, вы воспользуетесь преимуществами его функций тем и плагинов для комплексного расширения функционала.

Таким образом, следуя этим шагам и рекомендациям, вы получите не только динамическую страницу, но и в полной мере используете инфраструктуру WordPress для лучших результатов в области безопасности и функциональности.

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

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