[MU] Redirecionar página para URL externa

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

  1. Certifique-se de que o autoloader loader.php esteja presente em /mu-plugins/.
  2. Crie a pasta neodoor-page-redirect dentro de /mu-plugins/.
  3. Dentro dela, crie o arquivo neodoor-page-redirect.php e cole o código acima.
  4. Não é necessário ativar nada – MU-Plugins carregam automaticamente.
  5. Desative e remova o plugin page-links-to se estiver instalado.

Como testar

  1. Edite qualquer página ou post.
  2. Na lateral direita, procure a metabox “Redirecionar para URL externa”.
  3. Insira uma URL (ex: https://wordpress.org ou /minha-outra-pagina).
  4. Salve o post.
  5. Acesse a página no frontend – você será redirecionado automaticamente.
  6. 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 ); para wp_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.

Média: 3.0 (30 votos)