Al usar WordPress es fácil que necesitemos duplicar una página o entrada para ahorrar tiempo y no tener que copiar el contenido y estructura manualmente o simplemente porque quieres tener una copia de esa página o entrada antes de modificarla o incluso para poder duplicar una landing ya realizada.
En este artículo te mostraré, a través de un código, como duplicar páginas y entradas con un clic. También te aconsejaré algún plugin, por si no quieres poner código, pero cuanto menos plugins innecesarios utilices mejor.
Índice del artículo
Duplicar páginas y entradas sin utilizar plugin
El código que vamos a poner a continuación es un poco largo pero con ello conseguiremos poder duplicar páginas, entradas e incluso portfolios en WordPress. Primero tendremos que abrir nuestro archivo functions.php de nuestro Child Theme, para no perder los cambios en futuras actualizaciones, y copiar y pegar el siguiente código.
/* * Function creates post duplicate as a draft and redirects then to the edit post screen */ function rd_duplicate_post_as_draft(){ global $wpdb; if (! ( isset( $_GET['post']) || isset( $_POST['post']) || ( isset($_REQUEST['action']) && 'rd_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) { wp_die('No post to duplicate has been supplied!'); } /* * get the original post id */ $post_id = (isset($_GET['post']) ? $_GET['post'] : $_POST['post']); /* * and all the original post data then */ $post = get_post( $post_id ); /* * if you don't want current user to be the new post author, * then change next couple of lines to this: $new_post_author = $post->post_author; */ $current_user = wp_get_current_user(); $new_post_author = $current_user->ID; /* * if post data exists, create the post duplicate */ if (isset( $post ) && $post != null) { /* * new post data array */ $args = array( 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status, 'post_author' => $new_post_author, 'post_content' => $post->post_content, 'post_excerpt' => $post->post_excerpt, 'post_name' => $post->post_name, 'post_parent' => $post->post_parent, 'post_password' => $post->post_password, 'post_status' => 'draft', 'post_title' => $post->post_title, 'post_type' => $post->post_type, 'to_ping' => $post->to_ping, 'menu_order' => $post->menu_order ); /* * insert the post by wp_insert_post() function */ $new_post_id = wp_insert_post( $args ); /* * get all current post terms ad set them to the new post draft */ $taxonomies = get_object_taxonomies($post->post_type); // returns array of taxonomy names for post type, ex array("category", "post_tag"); foreach ($taxonomies as $taxonomy) { $post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs')); wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false); } /* * duplicate all post meta just in two SQL queries */ $post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id"); if (count($post_meta_infos)!=0) { $sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) "; foreach ($post_meta_infos as $meta_info) { $meta_key = $meta_info->meta_key; $meta_value = addslashes($meta_info->meta_value); $sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'"; } $sql_query.= implode(" UNION ALL ", $sql_query_sel); $wpdb->query($sql_query); } /* * finally, redirect to the edit post screen for the new draft */ wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) ); exit; } else { wp_die('Post creation failed, could not find original post: ' . $post_id); } } add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' ); /* * Add the duplicate link to action list for post_row_actions */ function rd_duplicate_post_link( $actions, $post ) { if (current_user_can('edit_posts')) { $actions['duplicate'] = '<a href="admin.php?action=rd_duplicate_post_as_draft&post=' . $post->ID . '" title="Duplicate this item" rel="permalink">Duplicar</a>'; } return $actions; } add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 ); add_filter( 'page_row_actions', 'rd_duplicate_post_link', 10, 2); /* for pages */ add_filter( 'portfolio_row_actions', 'rd_duplicate_post_link', 10, 2); /* a custom post called portfolio */
En el propio código hay comentarios, en inglés, explicando cada parte del código para entender el proceso un poco mejor. Una vez puesto, si vamos dentro de una página o entrada, veremos que aparece la opción de «Duplicar«.
Como ves, es bastante sencillo de aplicar y sin tener que utilizar ningún plugin. Esta función nos ahorrará bastante tiempo a la hora de duplicar contenido.
¿Qué plugin utilizar para duplicar páginas y entradas?
Si eres de los que prefiere utilizar un plugin y así evitar poner código en la plantilla, te recomiendo instalar el siguiente plugin, existen unos cuantos en el repositorio oficial de WordPress pero el más conocido es el que te muestro a continuación.
- Yoast Duplicate Post
Plugin 100% gratuito para duplicar contenido de manera sencilla en WordPress. El plugin es bastante intuitivo, así que no tendrás ningún tipo de problema para poder configurarlo. Lo bueno de este plugin, en relación al anterior código, es que se puede duplicar varias entradas a la vez ya que la opción de duplicar o clonar aparece también desde el panel «Acciones en lote«.
Ir al sitio oficial del plugin
Con esto ya no tendrás ningún problema en duplicar contenido de manera rápida en WordPress. Solo depende de ti si quieres utilizar un plugin o no para poder realizarlo.
!Si te gustó este artículo, no dejes de visitar el blog o suscribirte a la newsletter! | Iborra Web Design