Я разрабатываю некоторый плагин, где я хотел бы включить пользовательские страницы. В моем случае некоторые пользовательские страницы будут содержать такую форму, как контактная форма (не буквально). Когда пользователь заполнит эту форму и отправит ее, должен быть следующий шаг, который потребует дополнительной информации. Допустим, первая страница с формой будет расположена в 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()
.Итак, давайте напишем последний класс:
Шаблоны, хранящиеся на виртуальной странице, объединяются в массив со значениями по умолчанию
page.php
иindex.php
перед запуском загрузки шаблона'template_redirect'
повышают гибкость и улучшают совместимость.После этого найденный шаблон проходит через пользовательский
'virtual_page_template'
и базовый'template_include'
фильтры: опять же для гибкости и совместимости.Наконец файл шаблона только что загружен.
Основной файл плагина
На данный момент нам нужно написать файл с заголовками плагинов и использовать его для добавления хуков, которые сделают наш рабочий процесс:
В настоящий файл мы, вероятно, добавим больше заголовков, таких как ссылки на плагин и автора, описание, лицензия и т. Д.
Плагин Гист
Хорошо, мы закончили с нашим плагином. Весь код можно найти в Гисте здесь .
Добавление страниц
Плагин готов и работает, но мы не добавили ни одной страницы.
Это можно сделать внутри самого плагина, внутри темы
functions.php
, в другом плагине и т. Д.Добавить страницы это просто вопрос:
И так далее. Вы можете добавить все нужные вам страницы, просто не забудьте использовать относительные URL-адреса для страниц.
Внутри файла шаблона вы можете использовать все теги шаблонов WordPress и написать все необходимые вам PHP и HTML.
Глобальный почтовый объект заполнен данными, поступающими с нашей виртуальной страницы. Сама виртуальная страница может быть доступна через
$wp_query->virtual_page
переменную.Получить URL для виртуальной страницы так же просто, как перейти по
home_url()
тому же пути, который использовался для создания страницы:Обратите внимание, что в основном цикле в загруженном шаблоне
the_permalink()
будет возвращена правильная постоянная ссылка на виртуальную страницу.Заметки о стилях / скриптах для виртуальных страниц
Возможно, когда добавляются виртуальные страницы, желательно также ставить в очередь пользовательские стили / сценарии, а затем просто использовать их
wp_head()
в пользовательских шаблонах.Это очень просто, потому что виртуальные страницы легко распознаются по
$wp_query->virtual_page
переменным, а виртуальные страницы можно отличить друг от друга по их URL.Просто пример:
Примечания к ОП
Передача данных со страницы на другую не связана с этими виртуальными страницами, а является общей задачей.
Однако, если у вас есть форма на первой странице, и вы хотите передать данные оттуда на вторую страницу, просто используйте URL-адрес второй страницы в
action
свойстве формы .Например, в файле шаблона первой страницы вы можете:
а затем во второй файл шаблона страницы:
источник
wordpress/virtual-page
и урезанный URL страницыvirtual-page
.Однажды я использовал решение, описанное здесь: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
На самом деле, когда я использовал его, я расширяю решение таким образом, что могу регистрировать более одной страницы за раз (остальная часть кода +/- похожа на решение, которое я ссылаюсь из параграфа выше).
Решение требует, чтобы у вас были хорошие постоянные ссылки ...
источник
content
в массиве при регистрации отображается поддельная страница в теле страницы - она может содержать как HTML, так и простой текст или даже шорткод.