Поддержка Проблемы и решения Редирект между страницами в админке

  • Здравствуйте, всем!!!
    Такой вопрос: Есть страница добавления новых записей, необходимо по нажатию на кнопку организовать редирект на страницу со списком ранее добавленных записей.
    Делаю так:
    В файле плагина, там, где анализируется нажатие на кнопку пишу:
    wp_redirect(admin_url().'admin.php?page='.basename(__FILE__).'&action=');

    Но выдается ошибка:

    Cannot modify header information — headers already sent by (output started at D:\wp\wp-admin\admin-header.php:18) in D:\wp\wp-includes\pluggable.php on line 865

    В D:\wp\wp-includes\pluggable.php on line 865 — выводится header(«Location: $location»);

    Вопрос: Как правильно сделать редирект в моей ситуации и почему так происходит?

    Заранее спасибо.

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Успел отобразиться заголовок страницы. Нужно выполнять перенаправление до вывода на экран — например, в привязке к 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');
                 }

    Почему-то перенаправление не срабатывает.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Видимо, 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

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Как вариант, вынести обработку действий в отдельную функцию, которую и привязать к 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 определил, что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится. Эта проблема может возникать при отключении или запрещении принятия кук.

    Что это может быть?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Загружается 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;
                 }

    Наверное при такой структуре, редирект никак не получится, менять ее не хочется, потому что все уже отлажено, что-то идей нет никаких по этому поводу.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В процитированном коде нет никаких препятствий для обработки действий в отдельной функции. Массив $_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');

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Редирект между страницами в админке» закрыта для новых ответов.