{"id":321,"date":"2026-05-13T19:00:12","date_gmt":"2026-05-13T22:00:12","guid":{"rendered":"https:\/\/neodoor.neo\/?post_type=neodoor_aula&#038;p=321"},"modified":"2026-05-21T09:05:15","modified_gmt":"2026-05-21T12:05:15","slug":"page-link-to","status":"publish","type":"post","link":"https:\/\/www.portanova.com.br\/notebook\/page-link-to\/","title":{"rendered":"[MU] Redirecionar p\u00e1gina para URL externa"},"content":{"rendered":"<h2>Aula: Redirecionar p\u00e1gina para URL externa \u2013 substituindo o plugin &#8220;page-links-to&#8221;<\/h2>\n<p><strong>Objetivo:<\/strong> Criar um MU-Plugin leve que adiciona uma metabox na edi\u00e7\u00e3o de p\u00e1ginas, posts e custom post types, permitindo definir uma URL externa. Quando a p\u00e1gina for acessada no frontend, o usu\u00e1rio ser\u00e1 redirecionado automaticamente para essa URL, sem necessidade de plugins pesados.<\/p>\n<p><strong>Contexto:<\/strong> O plugin original <code>page-links-to<\/code> \u00e9 \u00fatil para criar &#8220;atalhos&#8221; \u2013 uma p\u00e1gina que redireciona para um link externo ou interno. Nosso MU-Plugin faz exatamente isso, com c\u00f3digo limpo e sem sobrecarga, usando o hook <code>template_redirect<\/code> e armazenando o link como metadado.<\/p>\n<h3>Funcionalidades implementadas<\/h3>\n<ul>\n<li>Metabox na edi\u00e7\u00e3o de posts\/p\u00e1ginas\/CPTs para inserir a URL de redirecionamento.<\/li>\n<li>Redirecionamento HTTP 307 (tempor\u00e1rio) ou configur\u00e1vel para 301 (permanente).<\/li>\n<li>Suporte a URLs internas (ex: <code>\/contato<\/code>) ou externas (ex: <code>https:\/\/exemplo.com<\/code>).<\/li>\n<li>Verifica\u00e7\u00e3o se o campo foi preenchido e se n\u00e3o est\u00e1 em branco ou vazio.<\/li>\n<li>Total compatibilidade com o Elementor e outros builders \u2013 o redirecionamento ocorre antes de qualquer renderiza\u00e7\u00e3o.<\/li>\n<\/ul>\n<h3>C\u00f3digo do MU-Plugin: <code>neodoor-page-redirect.php<\/code><\/h3>\n<p>Crie a pasta <code>wp-content\/mu-plugins\/neodoor-page-redirect\/<\/code> e dentro dela o arquivo <code>neodoor-page-redirect.php<\/code> com o conte\u00fado abaixo.<\/p>\n<pre><code>&lt;?php\n\/**\n * Plugin Name:  Neodoor Page Redirect (ex-page-links-to)\n * Description:  Permite redirecionar qualquer p\u00e1gina\/post\/CPT para uma URL externa ou interna, via metabox.\n * Version:      1.0\n * Author:       Reinaldo (Neodoor.neo)\n *\/\n\nif ( ! defined( 'ABSPATH' ) ) {\n    exit;\n}\n\nclass Neodoor_Page_Redirect {\n\n    private static $instance = null;\n    private $meta_key = '_neodoor_redirect_url';\n\n    public static function get_instance() {\n        if ( null === self::$instance ) {\n            self::$instance = new self();\n        }\n        return self::$instance;\n    }\n\n    private function __construct() {\n        add_action( 'add_meta_boxes', [ $this, 'add_meta_box' ] );\n        add_action( 'save_post', [ $this, 'save_redirect_url' ] );\n        add_action( 'template_redirect', [ $this, 'do_redirect' ] );\n    }\n\n    \/**\n     * Adiciona a metabox na tela de edi\u00e7\u00e3o de posts\/p\u00e1ginas\/CPTs\n     *\/\n    public function add_meta_box() {\n        $screens = get_post_types( [ 'public' =&gt; true ], 'names' );\n        foreach ( $screens as $screen ) {\n            add_meta_box(\n                'neodoor_redirect_meta_box',\n                'Redirecionar para URL externa',\n                [ $this, 'render_meta_box' ],\n                $screen,\n                'side',\n                'default'\n            );\n        }\n    }\n\n    \/**\n     * Renderiza o campo da metabox\n     *\/\n    public function render_meta_box( $post ) {\n        $value = get_post_meta( $post-&gt;ID, $this-&gt;meta_key, true );\n        wp_nonce_field( 'neodoor_redirect_nonce', 'neodoor_redirect_nonce_field' );\n        echo '&lt;label for=\"neodoor_redirect_url\"&gt;URL de redirecionamento:&lt;\/label&gt;';\n        echo '&lt;input type=\"text\" id=\"neodoor_redirect_url\" name=\"neodoor_redirect_url\" value=\"' . esc_attr( $value ) . '\" style=\"width:100%;\" \/&gt;';\n        echo '&lt;p class=\"description\"&gt;Ex: https:\/\/exemplo.com ou \/contato. Deixe vazio para desativar.&lt;\/p&gt;';\n    }\n\n    \/**\n     * Salva o valor do campo ao salvar o post\n     *\/\n    public function save_redirect_url( $post_id ) {\n        if ( ! isset( $_POST['neodoor_redirect_nonce_field'] ) ) return;\n        if ( ! wp_verify_nonce( $_POST['neodoor_redirect_nonce_field'], 'neodoor_redirect_nonce' ) ) return;\n        if ( defined( 'DOING_AUTOSAVE' ) &amp;&amp; DOING_AUTOSAVE ) return;\n        if ( ! current_user_can( 'edit_post', $post_id ) ) return;\n\n        if ( isset( $_POST['neodoor_redirect_url'] ) ) {\n            $url = esc_url_raw( trim( $_POST['neodoor_redirect_url'] ) );\n            if ( ! empty( $url ) ) {\n                update_post_meta( $post_id, $this-&gt;meta_key, $url );\n            } else {\n                delete_post_meta( $post_id, $this-&gt;meta_key );\n            }\n        }\n    }\n\n    \/**\n     * Executa o redirecionamento no frontend (hook template_redirect)\n     *\/\n    public function do_redirect() {\n        \/\/ N\u00e3o redirecionar no admin, feeds, rob\u00f4s, etc.\n        if ( is_admin() || is_feed() || is_robots() || is_trackback() ) {\n            return;\n        }\n\n        \/\/ Verifica se \u00e9 um post singular (p\u00e1gina, post, CPT)\n        if ( ! is_singular() ) {\n            return;\n        }\n\n        $post_id = get_queried_object_id();\n        if ( ! $post_id ) {\n            return;\n        }\n\n        $redirect_url = get_post_meta( $post_id, $this-&gt;meta_key, true );\n        if ( empty( $redirect_url ) ) {\n            return;\n        }\n\n        \/\/ Se a URL n\u00e3o come\u00e7ar com http:\/\/ ou https:\/\/ nem com \/, assume-se que \u00e9 um caminho relativo\n        if ( ! preg_match( '#^(https?:\/\/|\/)#', $redirect_url ) ) {\n            $redirect_url = '\/' . ltrim( $redirect_url, '\/' );\n        }\n\n        \/\/ Redirecionamento com status 307 (tempor\u00e1rio). Para 301 (permanente), troque para 301.\n        wp_redirect( $redirect_url, 307 );\n        exit;\n    }\n}\n\nNeodoor_Page_Redirect::get_instance();\n<\/code><\/pre>\n<h3>Instru\u00e7\u00f5es de instala\u00e7\u00e3o<\/h3>\n<ol>\n<li>Certifique-se de que o autoloader <code>loader.php<\/code> esteja presente em <code>\/mu-plugins\/<\/code>.<\/li>\n<li>Crie a pasta <code>neodoor-page-redirect<\/code> dentro de <code>\/mu-plugins\/<\/code>.<\/li>\n<li>Dentro dela, crie o arquivo <code>neodoor-page-redirect.php<\/code> e cole o c\u00f3digo acima.<\/li>\n<li>N\u00e3o \u00e9 necess\u00e1rio ativar nada \u2013 MU-Plugins carregam automaticamente.<\/li>\n<li>Desative e remova o plugin <code>page-links-to<\/code> se estiver instalado.<\/li>\n<\/ol>\n<h3>Como testar<\/h3>\n<ol>\n<li>Edite qualquer p\u00e1gina ou post.<\/li>\n<li>Na lateral direita, procure a metabox &#8220;Redirecionar para URL externa&#8221;.<\/li>\n<li>Insira uma URL (ex: <code>https:\/\/wordpress.org<\/code> ou <code>\/minha-outra-pagina<\/code>).<\/li>\n<li>Salve o post.<\/li>\n<li>Acesse a p\u00e1gina no frontend \u2013 voc\u00ea ser\u00e1 redirecionado automaticamente.<\/li>\n<li>Para desativar, basta remover a URL da metabox e salvar novamente.<\/li>\n<\/ol>\n<h3>Personaliza\u00e7\u00f5es poss\u00edveis<\/h3>\n<ul>\n<li><strong>Redirecionamento permanente (301):<\/strong> Altere o c\u00f3digo <code>wp_redirect( $redirect_url, 307 );<\/code> para <code>wp_redirect( $redirect_url, 301 );<\/code>.<\/li>\n<li><strong>Restringir a apenas p\u00e1ginas:<\/strong> No m\u00e9todo <code>add_meta_box<\/code>, troque <code>$screens = get_post_types( ... )<\/code> por <code>$screens = [ 'page' ];<\/code>.<\/li>\n<li><strong>Adicionar mensagem de aviso:<\/strong> Antes do redirecionamento, voc\u00ea pode exibir uma mensagem usando <code>add_action( 'wp_head', ... )<\/code>, mas cuidado com loops.<\/li>\n<\/ul>\n<h3>Plugins substitu\u00eddos<\/h3>\n<ul>\n<li><code>page-links-to<\/code> \u2013 totalmente substitu\u00eddo (metabox + redirecionamento).<\/li>\n<\/ul>\n<h3>Observa\u00e7\u00f5es finais<\/h3>\n<ul>\n<li>O redirecionamento acontece no hook <code>template_redirect<\/code>, que \u00e9 executado antes de qualquer conte\u00fado ser renderizado \u2013 ideal para evitar renderiza\u00e7\u00e3o desnecess\u00e1ria.<\/li>\n<li>URLs relativas (como <code>\/contato<\/code>) s\u00e3o automaticamente transformadas em URLs absolutas a partir da raiz do site.<\/li>\n<li>Se voc\u00ea usar cache (ex: WP Super Cache), o redirecionamento ainda funciona, pois ele ocorre antes do cache ser servido.<\/li>\n<li>Compat\u00edvel com PHP 8.4 e WordPress 6.x.<\/li>\n<\/ul>\n<h3>Registro no caderno<\/h3>\n<p><strong>Data:<\/strong> <\/p>\n<p><strong>Funcionalidade:<\/strong> Redirecionamento de p\u00e1ginas\/posts para URL externa via metabox.<\/p>\n<p><strong>Plugins substitu\u00eddos:<\/strong> page-links-to.<\/p>\n<p><strong>Tempo de implementa\u00e7\u00e3o:<\/strong> ~10 minutos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aula: Redirecionar p\u00e1gina para URL externa \u2013 substituindo o plugin &#8220;page-links-to&#8221; Objetivo: Criar um MU-Plugin leve que adiciona uma metabox na edi\u00e7\u00e3o de p\u00e1ginas, posts e custom post types, permitindo definir uma URL externa. Quando a p\u00e1gina for acessada no frontend, o usu\u00e1rio ser\u00e1 redirecionado automaticamente para essa URL, sem necessidade de plugins pesados. Contexto: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,4],"tags":[],"class_list":["post-321","post","type-post","status-publish","format-standard","hentry","category-lessons","category-pluginsmu"],"_links":{"self":[{"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/posts\/321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/comments?post=321"}],"version-history":[{"count":0,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/posts\/321\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/media?parent=321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/categories?post=321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/tags?post=321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}