Função de redirecionamento dentro de um Shortcode

12

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

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

?action=freshdesk-remote-login

Meu plugin então verifica se o usuário está logado no WP, se não mostra o formulário de login e após o login com sucesso, redireciona-os de volta para o site de terceiros.

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

Agora, isso funciona bem, mas pretendo oferecer um código de acesso que possa ser adicionado a uma página escolhida pelo usuário. Agora, uma vez que um usuário acessa esta página, se estiver logado, ele deve ser encaminhado para o site de terceiros, caso contrário, para a página de login.

Existe uma maneira de sugerir o wp_redirect para funcionar dentro de um shortcode?

    
por Harish Chouhan 01.06.2013 / 14:09

3 respostas

19

Como @Rarst explica, os códigos de acesso normalmente são executados muito tarde para você redirecionar de dentro de um. Eles geralmente são executados no the_content hook, que é bem depois que o conteúdo é enviado para o navegador. Se você precisar redirecionar com base na presença de um shortcode, será necessário verificar esse código antes de qualquer conteúdo sair 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 particulares de que você precisa provavelmente serão diferentes. Note que isso é um pouco "pesado" de processamento. Eu me certificaria de que só funcionasse onde fosse absolutamente necessário.

    
por s_ha_dum 01.06.2013 / 19:04
5

wp_redirect() executa o redirecionamento via cabeçalhos HTTP, então, tecnicamente, ele não irá (ou pelo menos não deveria) funcionar depois saída de página iniciada. Então você não pode simplesmente usar essa função no shortcode.

O que não significa, no entanto, que você não pode usar o shortcode para controlá-lo. Você pode verificar as condições de ajuste (se a página e a página contiverem shortcode) antes de iniciar a saída (em algum lugar próximo a template_redirect hook) e executar o redirecionamento.

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

    
por Rarst 01.06.2013 / 14:21
-1

Adicione ob_start(); no topo do plugin ou adicione a função de construção de classe Exemplo:

function __construct() {
    ob_start();
}
    
por Meldin Xavier 19.01.2017 / 05:32