{"id":473,"date":"2026-05-11T06:00:20","date_gmt":"2026-05-11T09:00:20","guid":{"rendered":"https:\/\/www.portanova.com.br\/?p=315"},"modified":"2026-05-21T09:29:36","modified_gmt":"2026-05-21T12:29:36","slug":"post-type-switcher","status":"publish","type":"post","link":"https:\/\/www.portanova.com.br\/notebook\/post-type-switcher\/","title":{"rendered":"[MU] Converte posts em p\u00e1ginas (e vice-versa)"},"content":{"rendered":"<h2>\ud83d\udcd8 Aula: MU-Plugin \u201cSimple Post Type Switcher\u201d \u2013 Converta posts em p\u00e1ginas (e vice-versa) com um clique<\/h2>\n<p>Nesta aula, vamos construir um <strong>MU-Plugin<\/strong> extremamente leve e pr\u00e1tico que adiciona a funcionalidade de alternar entre os tipos <strong>post<\/strong> e <strong>page<\/strong> diretamente na tela de edi\u00e7\u00e3o e tamb\u00e9m na listagem (quick edit).<\/p>\n<p>O c\u00f3digo \u00e9 limpo, n\u00e3o usa JavaScript pesado, n\u00e3o carrega CSS extra e funciona perfeitamente no ambiente <strong>Multisite<\/strong>. Ele \u00e9 ideal para organizar conte\u00fado importado ou para ajustes pontuais na estrutura do site.<\/p>\n<hr \/>\n<h3>\ud83c\udfaf O que o plugin faz?<\/h3>\n<ul>\n<li>Adiciona um <strong>seletor de tipo<\/strong> dentro da metabox \u201cPublicar\u201d, ao lado do bot\u00e3o de atualiza\u00e7\u00e3o.<\/li>\n<li>Permite converter um <strong>post em p\u00e1gina<\/strong> ou uma <strong>p\u00e1gina em post<\/strong> com apenas um clique.<\/li>\n<li>Oferece tamb\u00e9m um <strong>link \u201cConverter\u201d<\/strong> diretamente na listagem de posts\/p\u00e1ginas, eliminando a necessidade de abrir o editor.<\/li>\n<li>Preserva metadados, coment\u00e1rios, taxonomias e dados do Elementor (a \u00fanica coisa que muda \u00e9 o tipo de post).<\/li>\n<\/ul>\n<hr \/>\n<h3>\ud83d\udcc1 Instala\u00e7\u00e3o<\/h3>\n<ol>\n<li>Acesse o servidor via FTP ou File Manager.<\/li>\n<li>Navegue at\u00e9 a pasta <code>\/wp-content\/mu-plugins\/<\/code> (crie\u2011a se n\u00e3o existir).<\/li>\n<li>Crie um arquivo chamado <strong><code>simple-post-type-switcher.php<\/code><\/strong>.<\/li>\n<li>Cole o c\u00f3digo abaixo e salve.<\/li>\n<li>Pronto! O plugin ser\u00e1 carregado automaticamente em toda a rede \u2013 nenhuma ativa\u00e7\u00e3o \u00e9 necess\u00e1ria.<\/li>\n<\/ol>\n<hr \/>\n<h3>\ud83e\udde9 C\u00f3digo completo do MU-Plugin<\/h3>\n<pre><code>&lt;?php\r\n\/**\r\n * Plugin Name: Simple Post Type Switcher (Post \u2194 Page)\r\n * Description: Adiciona um seletor para converter posts em p\u00e1ginas (e vice-versa) na tela de edi\u00e7\u00e3o.\r\n * Version: 1.0\r\n * Author: Reinaldo (Neodoor)\r\n *\r\n * Este MU\u2011Plugin N\u00c3O usa jQuery, N\u00c3O carrega CSS extra e N\u00c3O polui o banco de dados.\r\n * Funciona com o Editor Cl\u00e1ssico e com o Gutenberg.\r\n *\/\r\n\r\nif ( ! defined( 'ABSPATH' ) ) {\r\n    exit; \/\/ Bloqueia acesso direto.\r\n}\r\n\r\n\/\/ ==================================================\r\n\/\/ 1. Adiciona o seletor de tipo de post na metabox \"Publicar\"\r\n\/\/ ==================================================\r\nadd_action( 'post_submitbox_misc_actions', 'neodoor_pt_switcher_submitbox' );\r\n\r\nfunction neodoor_pt_switcher_submitbox() {\r\n    global $post;\r\n\r\n    \/\/ Apenas para posts que j\u00e1 existem (evita exibir na cria\u00e7\u00e3o).\r\n    if ( $post-&gt;post_status == 'auto-draft' ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Tipos de post permitidos: apenas 'post' e 'page'.\r\n    $allowed_types = array( 'post', 'page' );\r\n    if ( ! in_array( $post-&gt;post_type, $allowed_types ) ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Define o r\u00f3tulo oposto para exibir no seletor.\r\n    $new_type = ( $post-&gt;post_type === 'post' ) ? 'page' : 'post';\r\n    $label    = ( $new_type === 'page' ) ? 'P\u00e1gina' : 'Post';\r\n\r\n    \/\/ Gera o HTML do seletor.\r\n    ?&gt;\r\n    &lt;div class=\"misc-pub-section misc-pub-post-type-switcher\"&gt;\r\n        &lt;label for=\"neodoor_pt_switch\"&gt;Tipo de conte\u00fado:&lt;\/label&gt;\r\n        &lt;select name=\"neodoor_pt_switch\" id=\"neodoor_pt_switch\"&gt;\r\n            &lt;option value=\"&lt;?php echo esc_attr( $post-&gt;post_type ); ?&gt;\" selected=\"selected\"&gt;\r\n                &lt;?php echo esc_html( ucfirst( $post-&gt;post_type ) ); ?&gt;\r\n            &lt;\/option&gt;\r\n            &lt;option value=\"&lt;?php echo esc_attr( $new_type ); ?&gt;\"&gt;\r\n                &lt;?php echo esc_html( $label ); ?&gt;\r\n            &lt;\/option&gt;\r\n        &lt;\/select&gt;\r\n        &lt;?php wp_nonce_field( 'neodoor_pt_switch_action', 'neodoor_pt_switch_nonce' ); ?&gt;\r\n    &lt;\/div&gt;\r\n    &lt;?php\r\n}\r\n\r\n\/\/ ==================================================\r\n\/\/ 2. Salva a altera\u00e7\u00e3o do tipo de post quando o post \u00e9 atualizado\r\n\/\/ ==================================================\r\nadd_action( 'save_post', 'neodoor_pt_switcher_save', 10, 2 );\r\n\r\nfunction neodoor_pt_switcher_save( $post_id, $post ) {\r\n    \/\/ Impede execu\u00e7\u00e3o em autosave, revis\u00e3o ou quando n\u00e3o h\u00e1 nonce.\r\n    if ( defined( 'DOING_AUTOSAVE' ) &amp;&amp; DOING_AUTOSAVE ) {\r\n        return;\r\n    }\r\n    if ( wp_is_post_revision( $post_id ) ) {\r\n        return;\r\n    }\r\n    if ( ! isset( $_POST['neodoor_pt_switch_nonce'] ) ||\r\n         ! wp_verify_nonce( $_POST['neodoor_pt_switch_nonce'], 'neodoor_pt_switch_action' ) ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Verifica se o usu\u00e1rio tem permiss\u00e3o.\r\n    if ( ! current_user_can( 'edit_post', $post_id ) ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Captura o novo tipo de post selecionado.\r\n    $new_type = isset( $_POST['neodoor_pt_switch'] ) ? sanitize_text_field( $_POST['neodoor_pt_switch'] ) : '';\r\n    if ( empty( $new_type ) ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Permite apenas os tipos 'post' e 'page'.\r\n    if ( ! in_array( $new_type, array( 'post', 'page' ) ) ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Se o tipo n\u00e3o mudou, n\u00e3o faz nada.\r\n    if ( $new_type === $post-&gt;post_type ) {\r\n        return;\r\n    }\r\n\r\n    \/\/ Atualiza o tipo de post diretamente no banco.\r\n    global $wpdb;\r\n    $wpdb-&gt;update(\r\n        $wpdb-&gt;posts,\r\n        array( 'post_type' =&gt; $new_type ),\r\n        array( 'ID' =&gt; $post_id ),\r\n        array( '%s' ),\r\n        array( '%d' )\r\n    );\r\n\r\n    \/\/ Limpa o cache do post para evitar inconsist\u00eancias.\r\n    clean_post_cache( $post_id );\r\n}\r\n\r\n\/\/ ==================================================\r\n\/\/ 3. Adiciona o link \"Converter\" na listagem (Quick Edit)\r\n\/\/    (Opcional \u2013 extremamente leve, sem jQuery)\r\n\/\/ ==================================================\r\nadd_filter( 'post_row_actions', 'neodoor_pt_switcher_quick_link', 10, 2 );\r\nadd_filter( 'page_row_actions', 'neodoor_pt_switcher_quick_link', 10, 2 );\r\n\r\nfunction neodoor_pt_switcher_quick_link( $actions, $post ) {\r\n    \/\/ Apenas para 'post' e 'page'.\r\n    if ( ! in_array( $post-&gt;post_type, array( 'post', 'page' ) ) ) {\r\n        return $actions;\r\n    }\r\n\r\n    \/\/ Monta a URL de convers\u00e3o (usa o pr\u00f3prio admin-post.php).\r\n    $url = add_query_arg(\r\n        array(\r\n            'action'   =&gt; 'neodoor_pt_quick_switch',\r\n            'post_id'  =&gt; $post-&gt;ID,\r\n            'new_type' =&gt; ( $post-&gt;post_type === 'post' ) ? 'page' : 'post',\r\n            '_wpnonce' =&gt; wp_create_nonce( 'neodoor_pt_quick_switch_' . $post-&gt;ID ),\r\n        ),\r\n        admin_url( 'admin-post.php' )\r\n    );\r\n\r\n    $actions['neodoor_pt_switch'] = sprintf(\r\n        '&lt;a href=\"%s\" style=\"color: #0073aa;\"&gt;Converter para %s&lt;\/a&gt;',\r\n        esc_url( $url ),\r\n        ( $post-&gt;post_type === 'post' ) ? 'P\u00e1gina' : 'Post'\r\n    );\r\n\r\n    return $actions;\r\n}\r\n\r\n\/\/ ==================================================\r\n\/\/ 4. Processa a convers\u00e3o via link r\u00e1pido (admin-post.php)\r\n\/\/ ==================================================\r\nadd_action( 'admin_post_neodoor_pt_quick_switch', 'neodoor_pt_quick_switch_handler' );\r\n\r\nfunction neodoor_pt_quick_switch_handler() {\r\n    \/\/ Verifica o nonce.\r\n    if ( empty( $_GET['_wpnonce'] ) || empty( $_GET['post_id'] ) || empty( $_GET['new_type'] ) ) {\r\n        wp_die( 'Requisi\u00e7\u00e3o inv\u00e1lida.' );\r\n    }\r\n\r\n    $post_id = intval( $_GET['post_id'] );\r\n    if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'neodoor_pt_quick_switch_' . $post_id ) ) {\r\n        wp_die( 'Falha de seguran\u00e7a. Tente novamente.' );\r\n    }\r\n\r\n    \/\/ Verifica permiss\u00e3o.\r\n    if ( ! current_user_can( 'edit_post', $post_id ) ) {\r\n        wp_die( 'Voc\u00ea n\u00e3o tem permiss\u00e3o para editar este conte\u00fado.' );\r\n    }\r\n\r\n    $new_type = sanitize_text_field( $_GET['new_type'] );\r\n    if ( ! in_array( $new_type, array( 'post', 'page' ) ) ) {\r\n        wp_die( 'Tipo de post inv\u00e1lido.' );\r\n    }\r\n\r\n    \/\/ Atualiza o tipo de post.\r\n    global $wpdb;\r\n    $wpdb-&gt;update(\r\n        $wpdb-&gt;posts,\r\n        array( 'post_type' =&gt; $new_type ),\r\n        array( 'ID' =&gt; $post_id ),\r\n        array( '%s' ),\r\n        array( '%d' )\r\n    );\r\n\r\n    clean_post_cache( $post_id );\r\n\r\n    \/\/ Redireciona de volta para a tela de listagem.\r\n    $referer = wp_get_referer();\r\n    if ( ! $referer ) {\r\n        $referer = admin_url( 'edit.php' );\r\n    }\r\n    wp_safe_redirect( $referer );\r\n    exit;\r\n}\r\n<\/code><\/pre>\n<hr \/>\n<h3>\ud83d\udccc Como usar<\/h3>\n<h4>\ud83d\udd39 Na tela de edi\u00e7\u00e3o (post ou p\u00e1gina)<\/h4>\n<ol>\n<li>Abra qualquer post ou p\u00e1gina para edi\u00e7\u00e3o.<\/li>\n<li>Role para baixo at\u00e9 a metabox <strong>\u201cPublicar\u201d<\/strong> (geralmente na coluna da direita).<\/li>\n<li>Voc\u00ea ver\u00e1 uma nova linha chamada <strong>\u201cTipo de conte\u00fado:\u201d<\/strong> com um seletor.<\/li>\n<li>Escolha <strong>Post<\/strong> ou <strong>P\u00e1gina<\/strong> (dependendo do que voc\u00ea deseja).<\/li>\n<li>Clique em <strong>\u201cAtualizar\u201d<\/strong> ou <strong>\u201cPublicar\u201d<\/strong>. O tipo ser\u00e1 alterado instantaneamente.<\/li>\n<\/ol>\n<h4>\ud83d\udd39 Na listagem (quick edit)<\/h4>\n<ol>\n<li>V\u00e1 para <strong>Posts \u2192 Todos os posts<\/strong> ou <strong>P\u00e1ginas \u2192 Todas as p\u00e1ginas<\/strong>.<\/li>\n<li>Passe o mouse sobre o t\u00edtulo do item que deseja converter.<\/li>\n<li>Abaixo das op\u00e7\u00f5es \u201cEditar\u201d, \u201cLixeira\u201d, etc., aparecer\u00e1 um novo link: <strong>\u201cConverter para P\u00e1gina\u201d<\/strong> ou <strong>\u201cConverter para Post\u201d<\/strong>.<\/li>\n<li>Clique no link. O item ser\u00e1 convertido e voc\u00ea ser\u00e1 redirecionado de volta para a listagem.<\/li>\n<\/ol>\n<hr \/>\n<h3>\ud83e\uddf9 Boas pr\u00e1ticas e recomenda\u00e7\u00f5es<\/h3>\n<ul>\n<li>\u2705 <strong>Preserva\u00e7\u00e3o de dados:<\/strong> O plugin altera apenas a coluna <code>post_type<\/code> no banco de dados. Todos os metadados, taxonomias e configura\u00e7\u00f5es do Elementor permanecem intactos.<\/li>\n<li>\u26a0\ufe0f <strong>Cuidado com URLs:<\/strong> Converta apenas itens recentes ou que n\u00e3o tenham sido amplamente indexados. A URL original deixar\u00e1 de existir \u2013 use redirecionamentos 301 se necess\u00e1rio.<\/li>\n<li>\ud83d\udd12 <strong>Seguran\u00e7a:<\/strong> O c\u00f3digo utiliza <code>nonce<\/code> e verifica\u00e7\u00e3o de capacidade <code>edit_post<\/code>, garantindo que apenas usu\u00e1rios autorizados possam realizar a convers\u00e3o.<\/li>\n<\/ul>\n<hr \/>\n<h3>\u2705 Conclus\u00e3o<\/h3>\n<p>Este MU-Plugin \u00e9 o exemplo perfeito do que pregamos: <strong>simples, funcional e sem firulas<\/strong>. Ele resolve uma necessidade real (reorganiza\u00e7\u00e3o de conte\u00fado) sem a complexidade dos plugins comerciais e sem propagandas. Ideal para seu caderno de estudos e para uso em qualquer site da rede.<\/p>\n<p><strong>Arquivo final:<\/strong> <code>\/wp-content\/mu-plugins\/simple-post-type-switcher.php<\/code><\/p>\n<p>Agora voc\u00ea tem uma ferramenta poderosa e minimalista para gerenciar seus tipos de post. Basta instalar e come\u00e7ar a usar! \ud83d\ude80<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcd8 Aula: MU-Plugin \u201cSimple Post Type Switcher\u201d \u2013 Converta posts em p\u00e1ginas (e vice-versa) com um clique Nesta aula, vamos construir um MU-Plugin extremamente leve e pr\u00e1tico que adiciona a funcionalidade de alternar entre os tipos post e page diretamente na tela de edi\u00e7\u00e3o e tamb\u00e9m na listagem (quick edit). O c\u00f3digo \u00e9 limpo, n\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,4],"tags":[],"class_list":["post-473","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\/473","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=473"}],"version-history":[{"count":0,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/posts\/473\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/media?parent=473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/categories?post=473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.portanova.com.br\/notebook\/wp-json\/wp\/v2\/tags?post=473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}