Aula: Redirecionar página para URL externa – substituindo o plugin “page-links-to”
Objetivo: Criar um MU-Plugin leve que adiciona uma metabox na edição de páginas, posts e custom post types, permitindo definir uma URL externa. Quando a página for acessada no frontend, o usuário será redirecionado automaticamente para essa URL, sem necessidade de plugins pesados.
Contexto: O plugin original page-links-to é útil para criar “atalhos” – uma página que redireciona para um link externo ou interno. Nosso MU-Plugin faz exatamente isso, com código limpo e sem sobrecarga, usando o hook template_redirect e armazenando o link como metadado.
Funcionalidades implementadas
- Metabox na edição de posts/páginas/CPTs para inserir a URL de redirecionamento.
- Redirecionamento HTTP 307 (temporário) ou configurável para 301 (permanente).
- Suporte a URLs internas (ex:
/contato) ou externas (ex:https://exemplo.com). - Verificação se o campo foi preenchido e se não está em branco ou vazio.
- Total compatibilidade com o Elementor e outros builders – o redirecionamento ocorre antes de qualquer renderização.
Código do MU-Plugin: neodoor-page-redirect.php
Crie a pasta wp-content/mu-plugins/neodoor-page-redirect/ e dentro dela o arquivo neodoor-page-redirect.php com o conteúdo abaixo.
<?php
/**
* Plugin Name: Neodoor Page Redirect (ex-page-links-to)
* Description: Permite redirecionar qualquer página/post/CPT para uma URL externa ou interna, via metabox.
* Version: 1.0
* Author: Reinaldo (Neodoor.neo)
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Neodoor_Page_Redirect {
private static $instance = null;
private $meta_key = '_neodoor_redirect_url';
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
add_action( 'add_meta_boxes', [ $this, 'add_meta_box' ] );
add_action( 'save_post', [ $this, 'save_redirect_url' ] );
add_action( 'template_redirect', [ $this, 'do_redirect' ] );
}
/**
* Adiciona a metabox na tela de edição de posts/páginas/CPTs
*/
public function add_meta_box() {
$screens = get_post_types( [ 'public' => true ], 'names' );
foreach ( $screens as $screen ) {
add_meta_box(
'neodoor_redirect_meta_box',
'Redirecionar para URL externa',
[ $this, 'render_meta_box' ],
$screen,
'side',
'default'
);
}
}
/**
* Renderiza o campo da metabox
*/
public function render_meta_box( $post ) {
$value = get_post_meta( $post->ID, $this->meta_key, true );
wp_nonce_field( 'neodoor_redirect_nonce', 'neodoor_redirect_nonce_field' );
echo '<label for="neodoor_redirect_url">URL de redirecionamento:</label>';
echo '<input type="text" id="neodoor_redirect_url" name="neodoor_redirect_url" value="' . esc_attr( $value ) . '" style="width:100%;" />';
echo '<p class="description">Ex: https://exemplo.com ou /contato. Deixe vazio para desativar.</p>';
}
/**
* Salva o valor do campo ao salvar o post
*/
public function save_redirect_url( $post_id ) {
if ( ! isset( $_POST['neodoor_redirect_nonce_field'] ) ) return;
if ( ! wp_verify_nonce( $_POST['neodoor_redirect_nonce_field'], 'neodoor_redirect_nonce' ) ) return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( ! current_user_can( 'edit_post', $post_id ) ) return;
if ( isset( $_POST['neodoor_redirect_url'] ) ) {
$url = esc_url_raw( trim( $_POST['neodoor_redirect_url'] ) );
if ( ! empty( $url ) ) {
update_post_meta( $post_id, $this->meta_key, $url );
} else {
delete_post_meta( $post_id, $this->meta_key );
}
}
}
/**
* Executa o redirecionamento no frontend (hook template_redirect)
*/
public function do_redirect() {
// Não redirecionar no admin, feeds, robôs, etc.
if ( is_admin() || is_feed() || is_robots() || is_trackback() ) {
return;
}
// Verifica se é um post singular (página, post, CPT)
if ( ! is_singular() ) {
return;
}
$post_id = get_queried_object_id();
if ( ! $post_id ) {
return;
}
$redirect_url = get_post_meta( $post_id, $this->meta_key, true );
if ( empty( $redirect_url ) ) {
return;
}
// Se a URL não começar com http:// ou https:// nem com /, assume-se que é um caminho relativo
if ( ! preg_match( '#^(https?://|/)#', $redirect_url ) ) {
$redirect_url = '/' . ltrim( $redirect_url, '/' );
}
// Redirecionamento com status 307 (temporário). Para 301 (permanente), troque para 301.
wp_redirect( $redirect_url, 307 );
exit;
}
}
Neodoor_Page_Redirect::get_instance();
Instruções de instalação
- Certifique-se de que o autoloader
loader.phpesteja presente em/mu-plugins/. - Crie a pasta
neodoor-page-redirectdentro de/mu-plugins/. - Dentro dela, crie o arquivo
neodoor-page-redirect.phpe cole o código acima. - Não é necessário ativar nada – MU-Plugins carregam automaticamente.
- Desative e remova o plugin
page-links-tose estiver instalado.
Como testar
- Edite qualquer página ou post.
- Na lateral direita, procure a metabox “Redirecionar para URL externa”.
- Insira uma URL (ex:
https://wordpress.orgou/minha-outra-pagina). - Salve o post.
- Acesse a página no frontend – você será redirecionado automaticamente.
- Para desativar, basta remover a URL da metabox e salvar novamente.
Personalizações possíveis
- Redirecionamento permanente (301): Altere o código
wp_redirect( $redirect_url, 307 );parawp_redirect( $redirect_url, 301 );. - Restringir a apenas páginas: No método
add_meta_box, troque$screens = get_post_types( ... )por$screens = [ 'page' ];. - Adicionar mensagem de aviso: Antes do redirecionamento, você pode exibir uma mensagem usando
add_action( 'wp_head', ... ), mas cuidado com loops.
Plugins substituídos
page-links-to– totalmente substituído (metabox + redirecionamento).
Observações finais
- O redirecionamento acontece no hook
template_redirect, que é executado antes de qualquer conteúdo ser renderizado – ideal para evitar renderização desnecessária. - URLs relativas (como
/contato) são automaticamente transformadas em URLs absolutas a partir da raiz do site. - Se você usar cache (ex: WP Super Cache), o redirecionamento ainda funciona, pois ele ocorre antes do cache ser servido.
- Compatível com PHP 8.4 e WordPress 6.x.
Registro no caderno
Data:
Funcionalidade: Redirecionamento de páginas/posts para URL externa via metabox.
Plugins substituídos: page-links-to.
Tempo de implementação: ~10 minutos.