Seguro que alguna vez has querido duplicar una entrada, una página o un producto de WooCommerce. Lo típico: quieres hacer una copia rápida para modificar algo sin tocar el original.
Y como muchos, quizá hayas tirado de plugins como Yoast Duplicate Post o similares.
Pero… ¿y si te digo que no necesitas ningún plugin para hacer esto?
Sí, así como lo lees. Con menos de 100 líneas de código puedes añadir una opción de “Duplicar” en el panel de administración de WordPress para cualquier tipo de contenido: entradas, páginas, productos o cualquier Custom Post Type (CPT) que tengas.

Qué hace este código
Este código:
- Añade un enlace «Duplicar» debajo de cada contenido en el admin.
- Crea una copia exacta como borrador, con:
- El título original + «(Copia)»
- El mismo contenido
- El mismo extracto
- Categorías y etiquetas copiadas
- Cualquier taxonomía personalizada (como los atributos de WooCommerce)
- Todos los campos personalizados (metadatos), como precios, imágenes, niveles de acceso, etc.
- El mismo tipo de contenido (
post,page,product,portfolio, etc.)
Y lo mejor: funciona para cualquier CPT, no solo para entradas o páginas.

Cómo funciona
- Al pegar el código en tu
functions.php(o en Code Snippets), WordPress detecta todos los tipos de contenido público. - Añade una acción en el menú de cada uno para que puedas duplicarlo.
- Al hacer clic en “Duplicar”, te lleva al editor con una copia nueva del contenido original, en estado borrador.
No hace falta configurar nada. Todo es automático.
¿Qué ventaja tiene frente a un plugin?
- Cero sobrecarga: no cargas librerías ni funciones extra.
- Control total: puedes adaptarlo, personalizarlo, limitarlo por rol, etc.
- Compatible con WooCommerce, ACF, Custom Post Types…
- Funciona con taxonomías personalizadas y campos avanzados.
Y si algún día quieres desactivarlo, simplemente borras el código y listo.
Qué no hace (por si lo necesitas saber)
Aunque este sistema es bastante completo, hay algunas limitaciones:
- No copia los archivos físicos de imagen. Las imágenes (tanto destacadas como del contenido) se mantienen, pero no se duplica el archivo en la biblioteca de medios. La copia usa la misma imagen que el original.
- No deja elegir qué copiar. Duplica todo tal cual: título, contenido, campos personalizados, taxonomías, etc. No es selectivo.
- No es masivo. Solo permite duplicar entradas de una en una desde el enlace en el listado del admin.
¿Dónde colocar el código?
Puedes:
- Pegarlo directamente en el
functions.phpde tu tema hijo. - O usar el plugin Code Snippets (modo solo administración).

// Acción que realiza la duplicación
function pw_duplicar_post_como_borrador() {
if (
! isset($_GET['post']) ||
! isset($_GET['action']) ||
$_GET['action'] !== 'pw_duplicar_post' ||
! current_user_can('edit_posts')
) {
return;
}
$post_id = absint($_GET['post']);
$post = get_post($post_id);
if (! $post) {
wp_die('Entrada no encontrada.');
}
// Datos base del nuevo post
$new_post_args = [
'post_title' => $post->post_title . ' (Copia)',
'post_content' => $post->post_content,
'post_excerpt' => $post->post_excerpt,
'post_status' => 'draft',
'post_type' => $post->post_type,
'post_author' => get_current_user_id()
];
$new_post_id = wp_insert_post($new_post_args);
// Copiar taxonomías (categorías, etiquetas, atributos, etc.)
$taxonomias = get_object_taxonomies($post->post_type);
foreach ($taxonomias as $taxonomia) {
$terms = wp_get_object_terms($post_id, $taxonomia, ['fields' => 'slugs']);
wp_set_object_terms($new_post_id, $terms, $taxonomia, false);
}
// Copiar metadatos
$meta = get_post_meta($post_id);
foreach ($meta as $clave => $valores) {
foreach ($valores as $valor) {
update_post_meta($new_post_id, $clave, maybe_unserialize($valor));
}
}
// Redirigir al editor del nuevo post
wp_redirect(admin_url('post.php?action=edit&post=' . $new_post_id));
exit;
}
add_action('admin_action_pw_duplicar_post', 'pw_duplicar_post_como_borrador');
// Agregar el enlace "Duplicar" a cualquier CPT
function pw_agregar_enlace_duplicar($acciones, $post) {
if (current_user_can('edit_posts')) {
$url = wp_nonce_url(
admin_url('admin.php?action=pw_duplicar_post&post=' . $post->ID),
basename(__FILE__),
'_wpnonce'
);
$acciones['duplicar'] = '<a href="' . esc_url($url) . '" title="Duplicar este contenido">Duplicar</a>';
}
return $acciones;
}
// Aplicar a cualquier tipo de contenido registrado
function pw_agregar_duplicar_a_todos_los_cpts() {
$post_types = get_post_types(['public' => true], 'names');
foreach ($post_types as $post_type) {
add_filter($post_type . '_row_actions', 'pw_agregar_enlace_duplicar', 10, 2);
}
}
add_action('admin_init', 'pw_agregar_duplicar_a_todos_los_cpts');
Lenguaje del código: PHP (php)
Conclusión
Con este código, duplicar contenido en WordPress sin usar plugins es no solo posible, sino súper eficiente.
Perfecto si estás montando tiendas con WooCommerce, sitios con CPTs personalizados o simplemente quieres un flujo de trabajo más rápido sin añadir más plugins al sitio.




¿Tienes alguna duda u opinión? Déjala en los comentarios.