Я разрабатываю плагин, где нужно включить пользовательские страницы. В моем случае некоторые пользовательские страницы будут содержать контактную форму. Когда пользователь заполнит эту форму и отправит ее, должен быть следующий шаг, который потребует дополнительной информации. Допустим, первая страница с формой будет расположена по адресу www.domain.tld/custom-page/
, и после успешной отправки формы пользователь должен быть перенаправлен на www.domain.tld/custom-page/second
. Шаблон с элементами HTML и PHP-кодом также должен быть индивидуальным.
Я думаю, что часть проблемы можно решить с помощью пользовательских перезаписей URL, но другие части в настоящее время мне неизвестны. Я действительно не знаю, с чего мне начать искать и как правильно описать эту проблему. Любая помощь могла бы быть полезна.
Когда вы посещаете страницу веб-интерфейса, WordPress запрашивает базу данных, и если ваша страница не существует в базе данных, этот запрос не нужен и является пустой тратой ресурсов.
К счастью, WordPress предлагает способ пользовательской обработки запросов к веб-интерфейсу. Это делается благодаря хуку
'do_parse_request'
. р>Вернув
false
на этот хук, вы сможете запретить WordPress обрабатывать запросы и делать это по-своему.Тем не менее, я хочу поделиться способом создания простого плагина ООП, который может обрабатывать виртуальные страницы простым в использовании (и повторно использовать) способом.
Вот что нужно
Интерфейсы
Перед созданием классов давайте напишем интерфейсы для 3 объектов, перечисленных выше.
Сначала интерфейс страницы (файл
PageInterface.php
):Большинство методов — просто геттеры и сеттеры, объяснений не требуется. Последний метод должен использоваться для получения
WP_Post
объекта из виртуальной страницы.Интерфейс контроллера (файл
ControllerInterface.php
):и интерфейс загрузчика шаблонов (файл
TemplateLoaderInterface.php
):комментарии phpDoc должны быть достаточно понятны для этих интерфейсов.
План
Теперь, когда у нас есть интерфейсы, и прежде чем писать конкретные классы, давайте рассмотрим наш рабочий процесс:
Controller
(реализующийControllerInterface
) и внедряем (возможно, в конструктор) экземпляр классаTemplateLoader
(реализующийTemplateLoaderInterface
)init
мы вешаемControllerInterface::init()
для настройки контроллера и запуска хука, который пользовательский код будет использовать для добавления виртуальных страниц.ControllerInterface::dispatch()
, и там мы проверим все добавленные виртуальные страницы и, если одна из них имеет тот же URL текущего запроса, отобразим его; после установки всех основных глобальных переменных ($wp_query
,$post
). Мы также будем использовать классTemplateLoader
для загрузки нужного шаблона.Во время этого рабочего процесса мы будем запускать некоторые основные хуки, например
wp
,template_redirect
,template_include
… чтобы сделать плагин более гибким и обеспечить совместимость с ядром и другие плагины, или, по крайней мере, с большим их количеством.Помимо предыдущего рабочего процесса, нам также потребуется:
the_permalink
, при необходимости вернуть правильный URL-адрес виртуальной страницы.Классы
Теперь мы можем писать наши конкретные классы. Начнем с класса страницы (файл
Page.php
):Реализация интерфейса.
Класс контроллера (файл
Controller.php
):По сути, класс создает
SplObjectStorage
, где хранятся все добавленные объекты страниц.В
'do_parse_request'
— класс контроллера, который зацикливает это хранилище, чтобы найти соответствие для текущего URL на одной из добавленных страниц.Если он найден, класс делает именно то, что мы запланировали: запускает некоторые хуки, настраивает переменные и загружает шаблон через класс, расширяющий
TemplateLoaderInterface
.После этого просто
exit()
.Итак, давайте напишем последний класс: p>
Шаблоны, хранящиеся на виртуальной странице, объединяются в массив со значениями по умолчанию
page.php
иindex.php
перед загрузкой шаблона'template_redirect'
запускается для повышения гибкости и улучшения совместимости.После этого найденный шаблон проходит через пользовательский
'virtual_page_template'
и ядро'template_include'
: снова для гибкости и совместимости.Наконец файл шаблона загружен.
Основной файл плагина
На данный момент нам нужно написать файл с заголовками плагинов и использовать его для добавления хуков, которые позволят нашему рабочему процессу произойти:
В настоящий файл мы, вероятно, добавим больше заголовков, таких как ссылки на плагин и автора, описание, лицензия и т.д.
Добавление страниц
Плагин готов и работает, но мы не добавили ни одной страницы.
Это можно сделать внутри самого плагина, внутри темы
functions.php
, в другом плагине и т.д.Добавить страницы:
И так далее. Вы можете добавить все нужные вам страницы, просто не забудьте использовать относительные URL для этих страниц.
Внутри файла шаблона вы можете использовать все теги шаблонов WordPress и написать все необходимые вам PHP и HTML.
Глобальный объект post заполнен данными, поступающими с нашей виртуальной страницы. К самой виртуальной странице можно получить доступ через переменную
$ wp_query->gt; virtual_page
.Получить URL для виртуальной страницы так же просто, как передать
home_url()
тот же путь, который использовался для создания страницы:Обратите внимание, что в основном цикле в загруженном шаблоне
the_permalink ()
вернет правильную постоянную ссылку на виртуальную страницу.Замечания о стилях / скриптах для виртуальных страниц
Вероятно, когда добавляются виртуальные страницы, желательно также поставить в очередь пользовательские стили / сценарии, а затем просто использовать
wp_head()
в пользовательских шаблонах.Это очень просто, потому что виртуальные страницы легко распознаются по переменной
$ wp_query-> virtual_page
, а виртуальные страницы можно отличить друг от друга по их URL-адресам.Пример:
Об ООП
Передача данных с одной страницы на другую не связана с этими виртуальными страницами, а является просто общей задачей.
Однако, если у вас есть форма на первой странице и вы хотите передать данные оттуда на вторую страницу, просто используйте URL-адрес второй страницы в свойстве
action
формы.например. в файле шаблона первой страницы вы можете:
а затем во втором файле шаблона страницы: p>