Вопрос или проблема
Я пытаюсь создать страницу, на которой будут ссылки, ведущие на 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, такие как темы и плагины.
Основные шаги для создания динамической страницы:
-
Регистрация пользовательских URL: Это обеспечивается через Rewrite API. Вы можете добавлять свои собственные правила URL, которые WordPress будет распознавать и соответствующим образом обрабатывать.
-
Создание функции отображения: Это часть вашего кода, которая будет знать, что делать с этими URL, и отобразит надлежащий контент.
-
Интеграция в окружение WordPress: Убедитесь, что ваш файл загружается в контексте WordPress. Это позволит использовать все функции и интеграции, которые предоставляет WordPress.
-
Обработка данных из базы данных: Использование глобального объекта $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, выполните следующие шаги:
-
Используйте WP механизмы для работы с URL. Обновите свой код для использования технологий WordPress, таких как WP Rewrites или
add_menu_page()
/add_submenu_page()
, чтобы регистрировать ваши страницы как часть админки либо фронтенда. -
Убедитесь в инициализации WordPress:
- То, что вы добавили
require_once($_SERVER['DOCUMENT_ROOT'] . '/wordpress/wp-load.php')
, заставляет скрипт сначала загружать весь WordPress. Хотя это работает, рекомендуется более элегантно интегрировать страницу — например, использоватьdo_action()
иadd_action()
для обработки URL через плагин, связанный с подходящими хуками.
- То, что вы добавили
-
Используйте безопасные методы работы с URL и данными:
- Всегда экранируйте URL и связывайте параметры запроса через защищенные методы
$wpdb->prepare()
. Это предотвратит уязвимости, связанные с SQL-инъекциями.
- Всегда экранируйте URL и связывайте параметры запроса через защищенные методы
-
Управляйте структурами пагинации через
add_rewrite_rule()
иadd_rewrite_tag()
:- Эти функции позволяют вам создать собственные URL-структуры без необходимости явного включения PHP-файлов.
-
Генерация URL должна использовать
add_query_arg()
иesc_url()
для добавления и экранирования параметров запросов:- Это лучший способ динамически строить и защищать URL.
Интеграция таких страниц не только позволит улучшить пользовательский опыт, но и обеспечит безопасность и расширяемость вашего плагина. Включая WordPress в качестве бэкэнда для динамических страниц, вы воспользуетесь преимуществами его функций тем и плагинов для комплексного расширения функционала.
Таким образом, следуя этим шагам и рекомендациям, вы получите не только динамическую страницу, но и в полной мере используете инфраструктуру WordPress для лучших результатов в области безопасности и функциональности.