Успел отобразиться заголовок страницы. Нужно выполнять перенаправление до вывода на экран — например, в привязке к admin_init
.
Сделала так:
function sld_redirect() {
wp_redirect(admin_url().'admin.php?page='.basename(__FILE__).'&action=');
}
//функция , которая отвечает за обработку действий
function slide_page()
{
if (isset($_GET['action']))
$action = $_GET['action'];
else
$action = '';
switch ($action):
case 'add_data':
//если нажата кнопка
if ($btn_sld_add) {
......
add_action('admin_init', 'sld_redirect');
}
Почему-то перенаправление не срабатывает.
Видимо, slide_page()
выполняется уже после admin_init
.
slide_page — отвечает за построение меню и обработку действий на странице меню:
function add_admin_sub_menu()
{
add_submenu_page(basename(__FILE__), 'Slides', 'Slides', 8,basename(__FILE__), 'slide_page');
}
А как можно тогда поступить? Мне нужно делать это именно по нажатию на кнопку, которая обрабатывается в slide_page
Как вариант, вынести обработку действий в отдельную функцию, которую и привязать к admin_init
.
Никак не получается обрабатывать вне slide_page(). Но решила попробовать как вообще работает перенапрвление, написала прямо в теле плагина:
function sld_redirect() {
wp_redirect(admin_url().'admin.php?page='.basename(__FILE__).'&action=');
}
add_action('admin_init', 'sld_redirect');
В ответ получила вот это, хотя куки у меня включены и URL, на который идет редирект при копировании в браузер работает нормально:
Неверное перенаправление на странице. Firefox определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится. Эта проблема может возникать при отключении или запрещении принятия кук.
Что это может быть?
Загружается WP → вызывается admin_init
→ срабатывает wp_redirect
→ загружается WP → вызывается admin_init
→ срабатывает wp_redirect
… 🙂
Перенаправление должно срабатывать только при некотором условии.
А почему не получается вне slide_page()
? Если нужно сохранять какие-то промежуточные данные, можно использовать глобальные переменные.
В slide_page() через switch, перечисляются действия типа add, edit, delete. Каждое действие обрабатывается кнопкой. Редирект нужен по кнопке. И эта же функция отвечает за создание пункта меню в админке.
function add_admin_sub_menu()
{
add_submenu_page(basename(__FILE__), 'Slides', 'Slides', 8,basename(__FILE__), 'slide_page');
}
//функция , которая отвечает за обработку действий
function slide_page()
{
if (isset($_GET['action']))
$action = $_GET['action'];
else
$action = '';
switch ($action):
case 'add_data':
//если нажата кнопка
if ($btn_sld_add) {
......
<strong>//Здесь нужен редирект
add_action('admin_init', 'sld_redirect');</strong>
break;
....
endswitch;
}
Наверное при такой структуре, редирект никак не получится, менять ее не хочется, потому что все уже отлажено, что-то идей нет никаких по этому поводу.
В процитированном коде нет никаких препятствий для обработки действий в отдельной функции. Массив $_GET
будет и там тоже 🙂
Вроде бы в общем и целом все получилось, утро вечера мудренее, как говорится. Но один вопрос возник. До перенаправления в
case ‘add_data’ я формирую переменную, которая содержит сообщение $image_uploaded об успешности действий и теперь должна выводиться на странице Edit, на которую идет перенаправление:
switch ($action):
case 'add_data':
//если нажата кнопка
if ($btn_sld_add) {
......
$image_uploaded = 'Сообщение';
if ($error == '' ) {
wp_redirect(admin_url().'admin.php?page='.basename(__FILE__).'&action=edit');
}
break;
case 'edit_data':
...
break;
Но значение этой переменной теряется, можно как-то ее вывести?
Не знаю на сколько это правильно, но работает вроде как надо:
Добавила в адрес перенаправления другое значение для параметра action. Соответсвенно в switch в функции отображения шаблонов обрабатываю его и выдаю нужное сообщение.
function for_redirect() {
switch ($action):
case 'add_data':
//если нажата кнопка
if ($btn_sld_add) {
......
if ($error == '' ) {
wp_redirect(admin_url().'admin.php?page='.basename(__FILE__).'&action=edit_data_success&data='.$data_id');
}
break;
case 'edit_data':
...
break;
}
function slide_page(){
switch ($action):
case 'edit_data':
include('template/edit_data_page.php');
break;
case 'edit_data_success':
$image_uploaded = __('Данные"'.stripslashes($data_title).'" успешно обновлены.');
include('template/edit_data_page.php');
break;
....
endswitch;
}
add_action('admin_init', 'for_redirect');