Função de redirecionamento dentro de um Shortcode

13

Estou desenvolvendo um plug-in gratuito para conectar um sistema de suporte externo ao WordPress para poder autenticar usuários no WordPress.

Para isso, atualmente no sistema externo, o usuário é enviado para a página de login do WordPress com isso no final

?action=freshdesk-remote-login

Meu plug-in verifica se o usuário está conectado ao WP, se não mostra o formulário de login e, após o login bem-sucedido, redireciona-o novamente para o site de terceiros.

O redirecionamento é feito usando algo como isto: wp_redirect( $sso_url );

Agora isso funciona bem, mas pretendo oferecer um código curto que possa ser adicionado a uma página que o usuário escolher. Agora que um usuário acessar esta página, se estiver conectado, deverá ser encaminhado para o site de terceiros, caso contrário, para a página de login.

Existe uma maneira de sugerir que o wp_redirect funcione dentro de um código de acesso?

Harish Chouhan
fonte

Respostas:

21

Como o @Rarst explica, os códigos de acesso normalmente atrasam demais para você redirecionar de dentro de um. Eles geralmente rodam no the_contentgancho, o que é muito bom depois que o conteúdo é enviado ao navegador. Se você precisar redirecionar com base na presença de um código curto, precisará verificar esse código curto antes que qualquer conteúdo saia do servidor.

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

Isso é "prova de conceito". As condições específicas necessárias provavelmente serão diferentes. Observe que esse é um pouco de processamento "pesado". Eu garantiria que ele só funcione onde for absolutamente necessário.

s_ha_dum
fonte
Graças uma tonelada. Isso é perfeito e exatamente o que eu estava procurando.
Harish Chouhan
Olá, adicionei algumas verificações para garantir que esse código seja executado apenas em uma página específica, no entanto, notei que colocar o wp_redirect dentro de um código curto também funciona bem. Eu tentei com javascript e também com wp_redirect( $sso_url );e apenas funcionou.
Harish Chouhan
1
wp_redirectnão funciona em um código curto em condições normais. Eu acabei de verificar. Se estiver funcionando para você, seu tema ou um plug-in está fazendo algo parecido com o que sugeri para fazê-lo funcionar.
s_ha_dum
Sim você está certo. Desculpe desperdiçar seu tempo. Eu tive várias instâncias do seu código. Estou de volta a usar seu código acima :)
Harish Chouhan
5

wp_redirect()executa redirecionamento via cabeçalhos HTTP, de forma que tecnicamente não funcione (ou pelo menos não deva) funcionar após o início da saída da página. Então você não pode simplesmente usar esta função no shortcode.

O que não significa, porém, que você não pode usar o shortcode para controlá-lo. Você pode verificar as condições de adaptação (se a página e a página contêm código de acesso) antes do início da saída (em algum lugar em torno do template_redirectgancho) e executar o redirecionamento.

Outra opção seria a saída condicional de JavaScript que executará o redirecionamento após o carregamento da página.

Rarst
fonte
Olá, encontrei o seguinte: `function pippin_login_form_shortcode ($ atts, $ content = null) {extract (shortcode_atts (array ('redirect' => ''), $ atts)); if (! is_user_logged_in ()) {if ($ redirecionar) {$ redirect_url = $ redirecionar; } else {$ redirect_url = get_permalink (); } $ form = wp_login_form (array ('eco' => false, 'redirecionar' => $ redirect_url)); } retornar $ form; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Aqui parece que o wp_redirect está colocado dentro de um shortcode.
Harish Chouhan
@HarishChouhan, onde você vê wp_redirect()esse código?
Rarst
Olá, desculpe, você está certo. No código de exemplo, ele salva o URL e não é redirecionado. Então, de acordo com você, o redirecionamento baseado em JavaScript parece ser minha única opção?
Harish Chouhan