Функция wp_redirect () не собирается в нужное место в зависимости от условия - PullRequest
0 голосов
/ 26 октября 2019

Я перенаправляю пользователя в другое место на основе данных из таблицы options , используя wp_logout hook.

Таким образом, функция обратного вызова хука wp_logout ниже: (примечание: я закомментировал некоторый код, потому что я его тестирую)

public function logout_redirect_to() {      
    $options = $this->load_all_options();

    echo '<pre>';
    print_r($options);
    echo '<hr/>';

    $user = wp_get_current_user();      

    print_r($user);
    echo '<hr/>';

    foreach ($options as $role_name => $redirect_to) {
        $role_name = strtolower($role_name);    

        print_r($role_name);            
        echo '<hr/>';

        print_r($user->roles);                      
        echo '<hr/>';

        if (in_array($role_name, $user->roles ) ) {

            print_r($redirect_to);
            echo '<hr/>';

            //wp_redirect(site_url("/".$redirect_to[0]));                   
            //exit();
        } else {
            //wp_redirect(site_url('/'));    
            //exit();
        }           
    }
    wp_die();
}

Выше условиявсегда переходить в другой блок, это означает, что он идет на домашнюю страницу сайта. Но вы можете видеть, что у меня есть некоторые условия для перенаправления на другую страницу.

Каково условие?

Здесь вы можете видеть, что я получаю данные из таблицы options, используя переменную $options, и ее вывод ниже:

Array
(
    [Administrator] => Array
        (
            [0] => about-us
        )

    [Editor] => Array
        (
            [0] => account
        )

    [Author] => Array
        (
            [0] => blog
        )

    [Subscriber] => Array
        (
            [0] => support
        )

    [Shop_Accountant] => Array
        (
            [0] => support
        )

    [Shop_Vendor] => Array
        (
            [0] => purchase-confirmation
        )

)

и я также проверяю, что у пользователя есть та роль, которая существует в переменной $options. Таким образом, вывод переменной $user ниже:

WP_User Object
(
    [data] => stdClass Object
        (
            [ID] => 3
            [user_login] => umme
            [user_pass] => $P$BE0lB.YAcEqeIBJVm3QhdieaJtRrFE.
            [user_nicename] => umme
            [user_email] => umme@gmail.com
            [user_url] => 
            [user_registered] => 2019-10-22 18:15:52
            [user_activation_key] => 
            [user_status] => 0
            [display_name] => Umme Habiba
        )

    [ID] => 3
    [caps] => Array
        (
            [shop_accountant] => 1
        )

    [cap_key] => thcapabilities
    [roles] => Array
        (
            [0] => shop_accountant
        )

    [allcaps] => Array
        (
            [read] => 1
            [edit_posts] => 
            [delete_posts] => 
            [edit_products] => 1
            [read_private_products] => 1
            [view_shop_reports] => 1
            [export_shop_reports] => 1
            [edit_shop_payments] => 1
            [shop_accountant] => 1
        )

    [filter] => 
    [site_id:WP_User:private] => 1
)

Now , в цикле foreach я проверяю, что значение $role_name существует в массиве $user->roles. Для этого я использую in_array(), а также я проверяю, что является выводом этой переменной.

Обе переменные вывод:

administrator
Array
(
    [0] => shop_accountant
)
editor
Array
(
    [0] => shop_accountant
)
author
Array
(
    [0] => shop_accountant
)
subscriber
Array
(
    [0] => shop_accountant
)
shop_accountant
Array
(
    [0] => shop_accountant
)
Array
(
    [0] => support
)
shop_vendor
Array
(
    [0] => shop_accountant
)

и $redirect_to показывает мне:

Array
(
    [0] => about-us
)
Array
(
    [0] => account
)
Array
(
    [0] => blog
)
Array
(
    [0] => support
)
Array
(
    [0] => support
)
Array
(
    [0] => support
)
Array
(
    [0] => purchase-confirmation
)

Теперь главный вопрос:

В приведенном выше выводе вы можете видеть, что переменная $role_name показывает мне

shop_accountant

, а $user->roles показывает мне

Array
(
    [0] => shop_accountant
)

Тогда , почему in_array() всегда собирается блокировать что-то еще?

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Есть две вещи, которые могут быть не правы в вашем коде; 1 ° вы используете wp_die ();изменить его на exite ();или умереть ();wp_die ();Это сделано для блокировки экрана и отображения сообщения, это вызывает конфликт.

2 ° Вы не устанавливаете правильный фильтр или в неправильном порядке. посмотрите пример, который я оставил ниже, просто читая ваш код

/**
 * TESTE
 */
class WpTeste
{

  function __construct(){
    add_action( 'wp_logout', array( $this, 'logout_redirect_to' ), 1 );
  }


  public function load_all_options(){
    return array(
        'Administrator' => array('about-us'),
        'Editor' => array('acco'),
        'Author' => array('blog'),
        'Subscriber' => array('support'),
        'Shop_Accountant' => array('support'),
        'Shop_Vendor' => array('purchase-'),
    );
  }

  public function logout_redirect_to() {   
      $options = $this->load_all_options();
      $user = wp_get_current_user();      


      foreach ($options as $role_name => $redirect_to) {
          $role_name = strtolower($role_name);    

          if (in_array($role_name, $user->roles ) ) {
                wp_redirect(site_url("/".$redirect_to[0]));    
                die();  
          }        
      }
  }
}

new WpTeste();
0 голосов
/ 26 октября 2019

Может быть, я это исправил.

Не работает ebcuase в первом цикле, он возвращает false, и поэтому он собирается блокировать else для перенаправления на домашнюю страницу.

Теперь я изменил код, и он работает до сих пор ...

if (in_array($role_name, $user->roles ) ) {
    if($redirect_to[0]) {
        wp_redirect(site_url("/".$redirect_to[0]));                 
        exit(); 
    } else {
        wp_redirect(site_url("/"));                 
        exit(); 
    }               
}   

есть здесь какие-нибудь улучшения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...