O formulário de login personalizado é redirecionado para o site externo

Eu criei uma página privada, mas esta página precisa ser mais do que apenas disponível digitando um código para uma página que foi listada em privado nas Configurações de publicação da Visibilidade, então eu criei uma página e adicionei uma instrução if / else para verificar se o usuário estiver logado ou não. Em caso afirmativo, o conteúdo é exibido como deveria, se não for o formulário de login, e o usuário será solicitado a entrar, o que aparecerá como deveria.

O problema é que, após o login usando o formulário, eles são redirecionados para a página de administração. Eu adicionei um redirecionamento para a página de login para ir para a página que eu quero, mas isso não parece funcionar. Estou fazendo o redirecionamento incorretamente?

    
Click the Plus (+) Sign to expend the list of available minutes per section
Plus more code 'http://etomv2.bambergmarketing.com/meeting-minutes')); } ?>

Solutions Collecting From Web of "O formulário de login personalizado é redirecionado para o site externo"

Os acontecimentos internos explicaram

Quando você olha para wp_login_form() , então você verá que o argumento de redirect irá pedir um URl absoluto. Então, use admin_url() ou site_url() se quiser vincular internamente .

A action / alvo deste formulário não deve ser alterado (a menos que você defina echo para FALSE e use alguns \DOMDocument substituição ou algum Regex para alterá-lo na seqüência de saída):

 action="' . esc_url( site_url( 'wp-login.php', 'login_post' ) ) . '" method="post" 

Quando você verá wp_login.php e o case : 'login' | default , você notará duas coisas:

  1. Há um filtro para ajustar o redirecionamento, que pode replace qualquer coisa definida em seus argumentos. Tenha em mente que isso pode até alternar dependendo do usuário que executa a ação de login (geralmente usado para redirect usuários de diferentes funções para diferentes canvass de boas-vindas):

     apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user ); 
  2. Então o usuário é verificado se ele é autenticado e não um object incorreto. Dependendo disso, se a solicitação não for direcionada para o lado /wp-admin das coisas, a seguinte function é chamada:

     exit( wp_safe_redirect( $target ) ); 

… e usando wp_safe_redirect() significa que você não pode se afastar para fora (percebi isso no comentário @TheDeadMedic – obrigado!).

Soluções

Como de costume no WordPress, você tem opções:

  1. Esta function está dentro do pluggable.php , o que significa que você pode substituí-lo por sua própria function. Isso não é muito estável (todos os outros plugins podem fazer o mesmo), mas está certo se você usá-lo em seu site pessoal, documentar isso e corrigir as coisas quando há um conflito. Mais informações nesta questão e a resposta por @ChipBennet sobre ela.
  2. A melhor solução é olhar para wp_validate_redirect() que é internamente usado por wp_safe_redirect() e alavancar o filtro que o WP oferece para estender a lista de hosts permitidos .

     // End of `wp_validate_redirect()` $allowed_hosts = (array) apply_filters( 'allowed_redirect_hosts', array( $wpp['host'] ), isset( $lp['host'] ) ? $lp['host'] : '' ); if ( isset($lp['host']) && ( !in_array($lp['host'], $allowed_hosts) && $lp['host'] != strtolower($wpp['host'])) ) $location = $default; 

    No seu caso, um plugin (mu-) para permitir que esse redirecionamento se pareça com o seguinte:

     < ?php /* Plugin Name: Allow external login redirect */ add_filter( 'allowed_redirect_hosts', function( Array $hosts, $check ) { return $hosts + [ 'http://etomv2.bambergmarketing.com' ]; }, 10, 2 ); 

    Dê uma olhada no segundo argumento dentro de wp_safe_redirect( $target, $fallback ) usado para wp_validate_redirect() . É definido como filtro. Isso significa que você pode redirect para outro UR externo caso seu login falhe. Ou você pode redirect localmente para alguma página de erro (ou apenas a página atual, que é o padrão):

     apply_filters( 'wp_safe_redirect_fallback', admin_url(), $status ) 

A segunda solução é o que eu usaria. Você também pode querer usá-lo no caso de você estar usando um provedor OAuth externo para o qual você precisa validar usuários.

Nota

No caso de você ler os documentos e se perguntar sobre login_post como "esquema" lá: A function site_url() é um invólucro para get_site_url() que usa set_url_scheme() internamente. There login_post , login e rpc são iguais a admin , que ajusta a ação corretamente:

 $scheme = is_ssl() || force_ssl_admin() ? 'https' : 'http';