Функция перенаправления внутри шорткода

14

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

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

?action=freshdesk-remote-login

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

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

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

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

Хариш Чухан
источник

Ответы:

21

Как объясняет @Rarst, шорткоды обычно запускаются слишком поздно, чтобы вы могли перенаправить их изнутри. Обычно они работают на 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 {
      // login form or redirect to login page
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

Это «доказательство концепции». Конкретные условия, которые вам нужны, скорее всего, будут другими. Обратите внимание, что это довольно «тяжелая» часть обработки. Я хотел бы убедиться, что он работает только там, где это абсолютно необходимо.

s_ha_dum
источник
Спасибо за тонну. Это просто идеально и именно то, что я искал.
Хариш Чухан
Здравствуйте, я добавил несколько проверок, чтобы убедиться, что этот код выполняется только на определенной странице, однако я заметил, что размещение wp_redirect внутри шорткода также работает нормально. Я попробовал с javascript, а также с, wp_redirect( $sso_url );и это просто сработало.
Хариш Чухан
1
wp_redirectне работает в шорткоде при нормальных условиях. Я только что проверил. Если это работает для вас, ваша тема или плагин делают что-то очень похожее на то, что я предложил, чтобы это работало.
s_ha_dum
Да ты прав. Извините, что трачу ваше время. У меня было несколько экземпляров вашего кода. Я вернулся к использованию вашего кода выше :)
Harish Chouhan
5

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

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

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

Rarst
источник
Здравствуйте, я нашел это: `function pippin_login_form_shortcode ($ atts, $ content = null) {extract (shortcode_atts (array ('redirect' => ''), $ atts)); if (! is_user_logged_in ()) {if ($ redirect) {$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink (); } $ form = wp_login_form (array ('echo' => false, 'redirect' => $ redirect_url)); } return $ form; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Здесь, похоже, wp_redirect находится внутри шорткода.
Хариш Чухан
Ссылка pippinsplugins.com/wordpress-login-form-short-code
Хариш Чухан
@HarishChouhan, где вы видите wp_redirect()в этом коде?
Rarst
Здравствуйте, извините, вы правы. В примере кода он просто сохраняет URL, а не фактически перенаправляет. Так что, по вашему мнению, редирект на основе JavaScript кажется моим единственным вариантом?
Хариш Чухан