No necesitas un Plugin para duplicar entradas
Aunque hay plugins específicos para duplicar entradas y otros contenidos, como Duplicate Post y otros similares, lo cierto es que no necesitamos nada de eso.
Te ahorras tener que instalar nada y aligeras tu web.
Con un simple fragmento de código podemos duplicar prácticamente cualquier contenido.
Lo puedes insertar con el famoso plugin Code Snippets.
Como Duplicar entradas o páginas sin plugins
Copia y pega este fragmento de código en un nuevo snippet:
// Duplica una página o post de WordPress con un Click
add_filter("post_row_actions", "wpsh_add_duplicate_link", 10, 2);
add_filter("page_row_actions", "wpsh_add_duplicate_link", 10, 2); // agrega el enlace a las paginas
function wpsh_duplicate_post_as_draft()
{
if (!current_user_can("edit_posts")) {
return;
}
if (
!isset($_GET["duplicate_nonce"]) ||
!wp_verify_nonce($_GET["duplicate_nonce"], basename(__FILE__))
) {
return;
}
global $wpdb;
if (
!(
isset($_GET["post"]) ||
isset($_POST["post"]) ||
(isset($_REQUEST["action"]) &&
"wpsh_duplicate_post_as_draft" == $_REQUEST["action"])
)
) {
wp_die("No post to duplicate has been supplied!");
}
// This on here gets the original post id and post all the original post data
$post_id = isset($_GET["post"])
? absint($_GET["post"])
: absint($_POST["post"]);
$post = get_post($post_id);
// En el caso de que no desees que el usuario actual sea el autor de la nueva publicación, cambia esta línea a esto:
$new_post_author = $post->post_author;
$current_user = wp_get_current_user();
$new_post_author = $current_user->ID;
// Si existen datos de la publicacion, crea la publicacion duplicada
if (isset($post) && $post != null) {
$args = [
"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,
];
$new_post_id = wp_insert_post($args);
// Conseguir todos los términos de publicación actuales y configúralos en el nuevo borrador de publicación
$taxonomies = get_object_taxonomies($post->post_type);
foreach ($taxonomies as $taxonomy) {
$post_terms = wp_get_object_terms($post_id, $taxonomy, [
"fields" => "slugs",
]);
wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false);
}
// Duplicar todos los meta post
$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);
}
// Redirigir a la pantalla de edición de publicación para el nuevo borrador
wp_safe_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_wpsh_duplicate_post_as_draft",
"wpsh_duplicate_post_as_draft"
);
// Agrega el enlace "Duplicate" a la lista de acciones para post_row_actions
function wpsh_add_duplicate_link($actions, $post)
{
if (current_user_can("edit_posts")) {
$actions["duplicate"] =
'ID,
basename(__FILE__),
"duplicate_nonce"
) .
'" title="Duplicate this item" rel="permalink">Duplicate';
}
return $actions;
}