+34 650908608 contacto@creandowp.es
Seleccionar página
siteground-optimizer-asset error

¿Necesitas duplicar una página en WordPress sin utilizar un plugin?

Seguramente te habrás visto en la necesidad de duplicar una página en WordPress para crear una plantilla, ya sea para crear páginas o entradas y no quieres sobrecargar tu página con más plugins que realicen llamadas al servidor o que tengas que estar pendiente de actualizarlo para evitar brechas de seguridad.

Pues bien a continuación vamos a mostrarte como hacerlo con unas líneas de código php.

Duplicar páginas en WordPress sin plugin - sin función

Duplicar una página y/o entrada

A continuación añadiremos el código para duplicar una página o una entrada en WordPress, solo tenemos que ir a nuestro editor de temas e ir al archivo functions.php
Functions.php
Solamente tenemos que añadir estas lineas de código a nuestro archivo functions.php y ya lo tendremos listo

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!’);

}

/*
* Nonce verification
*/
if ( !isset( $_GET[‘duplicate_nonce’] ) || !wp_verify_nonce( $_GET[‘duplicate_nonce’], basename( __FILE__ ) ) )
return;

/*
* get the original post id
*/
$post_id = (isset($_GET[‘post’]) ? absint( $_GET[‘post’] ) : absint( $_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;
if( $meta_key == ‘_wp_old_slug’ ) continue;
$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=”‘ . wp_nonce_url(‘admin.php?action=rd_duplicate_post_as_draft&amp;post=’ . $post-&gt;ID, basename(__FILE__), ‘duplicate_nonce’ ) . ‘” title=”Duplicate this item” rel=”permalink”>Duplicate</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 );

 

Duplicar páginas en WordPress sin plugin - función php añadida
Como podéis ver ya tenemos la opción de duplicar una página o un post sin utilizar un plugin.

¿Y si solamente quiero duplicar páginas o entradas sin que sean ambas?

También es posible con este mismo código solamente hay que eliminar una linea según necesites.

Para que solamente aparezca la opción de duplicar páginas hay que añadir el siguiente código:

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!’);

  }

  /*

   * Nonce verification

   */

  if ( !isset( $_GET[‘duplicate_nonce’] ) || !wp_verify_nonce( $_GET[‘duplicate_nonce’], basename( __FILE__ ) ) )

    return;

  /*

   * get the original post id

   */

  $post_id = (isset($_GET[‘post’]) ? absint( $_GET[‘post’] ) : absint( $_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;

        if( $meta_key == ‘_wp_old_slug’ ) continue;

        $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=”‘ . wp_nonce_url(‘admin.php?action=rd_duplicate_post_as_draft&post=’ . $post->ID, basename(__FILE__), ‘duplicate_nonce’ ) . ‘” title=”Duplicate this item” rel=”permalink”>Duplicate</a>’;

  }

  return $actions;

}

add_filter( ‘page_row_actions’, ‘rd_duplicate_post_link’, 10, 2 );

Y para que solamente podamos duplicar entradas el código debe ser el siguiente:

function rd_duplicate_post_as_draft(){

global $wpdb;

if (! ( isset( $_GET[‘post’]) || isset( $_POST[‘post’]) || ( isset($_REQUEST[‘action’]) &amp;&amp; ‘rd_duplicate_post_as_draft’ == $_REQUEST[‘action’] ) ) ) {

wp_die(‘No post to duplicate has been supplied!’);

}

/*
* Nonce verification
*/
if ( !isset( $_GET[‘duplicate_nonce’] ) || !wp_verify_nonce( $_GET[‘duplicate_nonce’], basename( __FILE__ ) ) )
return;

/*
* get the original post id
*/
$post_id = (isset($_GET[‘post’]) ? absint( $_GET[‘post’] ) : absint( $_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-&gt;post_author;
*/
$current_user = wp_get_current_user();
$new_post_author = $current_user-&gt;ID;

/*
* if post data exists, create the post duplicate
*/
if (isset( $post ) &amp;&amp; $post != null) {

/*
* new post data array
*/
$args = array(
‘comment_status’ =&gt; $post-&gt;comment_status,
‘ping_status’ =&gt; $post-&gt;ping_status,
‘post_author’ =&gt; $new_post_author,
‘post_content’ =&gt; $post-&gt;post_content,
‘post_excerpt’ =&gt; $post-&gt;post_excerpt,
‘post_name’ =&gt; $post-&gt;post_name,
‘post_parent’ =&gt; $post-&gt;post_parent,
‘post_password’ =&gt; $post-&gt;post_password,
‘post_status’ =&gt; ‘draft’,
‘post_title’ =&gt; $post-&gt;post_title,
‘post_type’ =&gt; $post-&gt;post_type,
‘to_ping’ =&gt; $post-&gt;to_ping,
‘menu_order’ =&gt; $post-&gt;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-&gt;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’ =&gt; ‘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-&gt;get_results(“SELECT meta_key, meta_value FROM $wpdb-&gt;postmeta WHERE post_id=$post_id”);
if (count($post_meta_infos)!=0) {
$sql_query = “INSERT INTO $wpdb-&gt;postmeta (post_id, meta_key, meta_value) “;
foreach ($post_meta_infos as $meta_info) {
$meta_key = $meta_info-&gt;meta_key;
if( $meta_key == ‘_wp_old_slug’ ) continue;
$meta_value = addslashes($meta_info-&gt;meta_value);
$sql_query_sel[]= “SELECT $new_post_id, ‘$meta_key’, ‘$meta_value'”;
}
$sql_query.= implode(” UNION ALL “, $sql_query_sel);
$wpdb-&gt;query($sql_query);
}

/*
* finally, redirect to the edit post screen for the new draft
*/
wp_redirect( admin_url( ‘post.php?action=edit&amp;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=”‘ . wp_nonce_url(‘admin.php?action=rd_duplicate_post_as_draft&amp;post=’ . $post-&gt;ID, basename(__FILE__), ‘duplicate_nonce’ ) . ‘” title=”Duplicate this item” rel=”permalink”>Duplicate</a>’;
}
return $actions;
}

add_filter( ‘post_row_actions’, ‘rd_duplicate_post_link’, 10, 2 );

¡Esperamos que este post os sirva de ayuda, cualquier duda dejad vuestro comentario!

Entradas relacionadas