Функція переадресації всередині короткого коду


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);

Це "доказ концепції". Конкретні умови, які вам потрібні, швидше за все, будуть різними. Зауважте, що це досить "важкий" біт обробки. Я би переконався, що він працює лише там, де це абсолютно необхідно.


Дякую тоні. Це просто ідеально і саме те, що я шукав.
Harish Chouhan

Привіт, я додав кілька перевірок, щоб переконатися, що цей код працює лише на певній сторінці, однак я помітив, що розміщення wp_redirect всередині короткого коду також добре працює. Я спробував з javascript, а також з, wp_redirect( $sso_url );і він просто працював.
Harish Chouhan

1
wp_redirectне працює в короткому коді за звичайних умов. Я щойно перевірив. Якщо це працює для вас, ваша тема або плагін робить щось на кшталт того, що я запропонував, щоб він працював.
s_ha_dum

Так, ти правий. Вибачте, що витрачаєте ваш час. У мене було кілька примірників вашого коду. Я повернувся до використання Вашого вище коду :)
Harish Chouhan

5

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

Що не означає, однак ви не можете використовувати короткий код для управління ним. Ви можете перевірити відповідність умов (якщо сторінка і сторінка містить короткий код) перед початком виводу (десь навколо template_redirectгачка) і виконувати переадресацію потім.

Іншим варіантом буде вивести умовно JavaScript, який буде виконувати переадресацію після завантаження сторінки.


Привіт, я виявив це: `функція pippin_login_form_shortcode ($ atts, $ content = null) {extra (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)); } повернути $ форму; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Тут здається, що wp_redirect розміщений всередині короткого коду.
Harish Chouhan


@HarishChouhan, де ти бачиш wp_redirect()у цьому коді?
Рарст

Здрастуйте, вибачте, що ви праві. У прикладі коду він просто зберігає URL-адресу, а фактично не перенаправляє. Тож відповідно до вас, здається, переадресація на основі JavaScript - єдиний мій варіант?
Harish Chouhan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.