Я постоянно сталкиваюсь с одним и тем же раздражением, поэтому я подумал, что посмотрю, есть ли какие-нибудь идеи или опыт там ...
Я создал плагин, который использует свою собственную страницу администратора. Он должен. Теперь, когда я разобрался с WP_List_Table (), я должен сказать, что это здорово ... но ....
Пользовательские страницы плагинов всегда загружаются, admin.php?page=...
если только я не хочу загружать их непосредственно из каталога плагинов, чего я не делаю. Теперь, если я выполняю «действие» на этой странице, мне нужно как-то обработать его, а затем перенаправить обратно на страницу без параметра действия. Неважно, если я делаю GET или POST, на самом деле.
На всех своих внутренних страницах WP делает это на одной и той же странице, проверяет, есть ли какое-либо действие, обрабатывает ли его и затем перенаправляет на себя без действия. Это возможно, потому что на этих страницах admin-header
еще не было загружено.
Однако если вы попытаетесь сделать это на своей странице, половина интерфейса администратора уже отправлена в браузер, поэтому перенаправление больше невозможно. Понятно, что решение состоит в том, чтобы POST / GET напрямую перейти на другую страницу, загрузить на нем платформу WP, выполнить обработку и затем перенаправить обратно на исходную страницу ... но ... это немного раздражает, потому что ... мой оригинал страница загружается с помощью обратного вызова, поэтому она запускается в методе моего класса. Это красиво.
Если я загружаю отдельную страницу, мне нужно вручную включить ее, wp-load.php
и я нахожусь за пределами моего класса, что раздражает, и в моем конкретном случае это меня особенно беспокоит, потому что я только создаю экземпляр своего класса плагина анонимно, чтобы никто не мог получить к нему доступ. снаружи.
Итак, после этой длинной истории ... кто-нибудь придумал хорошее решение для загрузки другой страницы с помощью обратного вызова, не настроив весь интерфейс администратора?
(Я знаю обходной путь ... я могу подключить функцию, load-....
которая проверяет параметр action, выполняет обработку и перенаправление. Но мне интересно, есть ли лучший способ.)
Спасибо.
[plugin-wp-pagenavi]
?[plugin-development]
безусловно, приветствуется здесь.plugin-wp-pagenavi
для ... я предполагал, что это было для вещей, касающихся корреляции между плагинами и меню администратора. Так как мой вопрос связан с этим, я выбрал этот тег.[admin-menu]
здесь, но я не думаю, что это действительно связано с этим. Я изменил теги так, как мне кажется, он подходит, вы, конечно, можете снова его редактировать.Ответы:
Как правило, для большинства действий следует использовать запрос POST, чтобы убедиться, что они не выполнены случайно . Но также рекомендуется перенаправлять на обычную страницу после запроса POST, чтобы предотвратить дублирование при обновлении страницы пользователем.
Итак, поток такой:
Средняя страница не должна быть вашей страницей плагина. Это означает , что вы можете использовать «общий обработчик POST» , который включал в себя три года назад, на
'admin_action_' . $_REQUEST['action']
крючокadmin.php
.Примером пользователя является плагин Akismet . Если вы хотите использовать его надежно, вы должны подчиниться
admin.php
непосредственно , а не другой странице, которая включает в себяadmin.php
.Вот очень простой пример того, как его использовать:
источник
admin.php
напрямую - это «трюк», которому научил меня источник в Akismet. Вы правы, когда отображаете форму и хотите снова отобразить ее в случае ошибок: тогда было бы легко, если бы местом назначения была ваша страница плагина, но где-то хук где-то в начале (чтобы вы могли перенаправить в случае успеха или отобразить Форма снова с сообщениями об ошибках, если нет). Может быть, предложить это в билете Trac?'load-<pagehook>'
зацепка работает ... она вызывается перед загрузкой страницы ... ноadmin_action_...
концепция кажется намного приятнее и конкретнее. Кроме того, на заметку, сообщения об ошибках все еще проблематичны, если вы делаете POST и не хотите перепечатывать при перезагрузке, но это другая тема.admin_action_
хук будет перемещен перед загрузчиком страниц плагина.Я подошел к этому немного по-другому, просто добавив noheader = true к URL-адресу действия на странице, где пользователь отправляет действие.
Мой обработчик затем выполняет действие (т.е. обычно добавляет, обновляет или удаляет), затем завершает с помощью wp_redirect () до следующего действия страницы (например, добавить страницу -> изменить страницу, удалить страницу -> список страниц, изменить страницу -> изменить страницу ). Я также передаю сообщение по URL-адресу, чтобы отображать состояние, такое как обновление прошло успешно или не удалось.
Этот подход сохраняет все действия: список, добавление, редактирование, удаление, массовое удаление и т. Д. В одном и том же классе и с одним и тем же административным портом, поэтому его довольно легко поддерживать и понимать.
источник
Другой другой подход - просто добавить скрытое поле ввода в форму:
Таким образом, WordPress, кажется, обрабатывает перенаправление автоматически.
источник