Редирект внутри шорткода

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

Для этого, в настоящее время из внешней системы пользователь отправляется на страницу входа в WordPress с этим в конце

?action=freshdesk-remote-login

Мой плагин затем проверяет, вошел ли пользователь в WP, если нет, то показывает форму входа и после успешного входа перенаправляет его обратно на сторонний сайт.

Перенаправление выполняется с помощью этого: wp_redirect( $sso_url );

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

Есть ли способ заставить wp_redirect работать внутри шорткода?

 

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 3
  1. s_ha_dum

    Шорткоды обычно запускаются слишком поздно для перенаправления изнутри. Обычно они запускаются на хуке the_content, который происходит после отправки содержимого в браузер. Если вам нужно перенаправить на основе наличия шорткода, вам нужно проверить этот шорткод, прежде чем какой-либо контент покинет сервер.

    function pre_process_shortcode() {
      if (!is_singular()) return;
      global $post;
      if (!empty($post->post_content)) {
        $regex = get_shortcode_regex();
        preg_match_all('/'.$regex.'/',$post->post_content,$matches);
        if (!empty($matches[2]) && in_array('yourshortcodeslug',$matches[2]) && is_user_logged_in()) {
          // redirect to third party site
        } else {
          // редирект на форму авторизации 
        }
      }
    }
    add_action('template_redirect','pre_process_shortcode',1);
    
  2. Meldin Xavier

    Добавьте ob_start(); в начале плагина или в конструкторе класса:

    function __construct() {
        ob_start();
    }
    
  3. Rarst

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

    Это не означает, что вы не можете использовать шорткод. Вы можете проверить условия подгонки (если страница и страница содержат шорткод) до начала вывода (где-то около ловушки template_redirect) и затем выполнить перенаправление.

    Другой вариант — вывести условно JavaScript, который будет выполнять перенаправление после загрузки страницы.

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: