En este tutorial, te mostraré cómo puedes aprovechar dos fragmentos de código en tus proyectos de WordPress para duplicar posts y páginas fácilmente y actualizar automáticamente el slug (URL) cuando cambias el título de un post o página. Estos snippets te permitirán optimizar tu flujo de trabajo sin la necesidad de instalar plugins adicionales.
El siguiente fragmento de código te permitirá duplicar cualquier post o página en WordPress y guardarlo como un borrador. Esto es útil si necesitas crear una nueva versión de un post existente sin perder el contenido original.
<?php
function duplicate_post_as_draft() {
global $wpdb;
if (! (isset($_GET['post']) || isset($_POST['post']) || (isset($_REQUEST['action']) && '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
$post = get_post($post_id);
// If post data exists
if (isset($post) && $post != null) {
// New post data array
$args = array(
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
'post_author' => $post->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 . ' (Copy)',
'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);
}
// 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_duplicate_post_as_draft', 'duplicate_post_as_draft');
function duplicate_post_link($actions, $post) {
if (current_user_can('edit_posts')) {
$actions['duplicate'] = '<a href="' . wp_nonce_url('admin.php?action=duplicate_post_as_draft&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce') . '" title="Duplicate this item" rel="permalink">Duplicate</a>';
}
return $actions;
}
add_filter('post_row_actions', 'duplicate_post_link', 10, 2);
add_filter('page_row_actions', 'duplicate_post_link', 10, 2);
Simplemente haz clic en «Duplicate» en cualquier post o página que desees copiar, y se creará un nuevo borrador con todo el contenido y metadatos replicados.
El siguiente fragmento de código asegura que, cuando cambias el título de un post o página, el slug (URL) se actualice automáticamente para reflejar el nuevo título.
<?php
function update_slug_on_title_change($post_id) {
// Evita la actualización si es una revisión o si el post está siendo guardado automáticamente.
if (wp_is_post_revision($post_id) || defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Evita la actualización durante la edición del menú.
if (isset($_POST['nav-menu-data'])) {
return;
}
// Obtiene el post.
$post = get_post($post_id);
// Verifica el tipo de post para evitar afectar otros contextos, como la gestión de menús.
if (!in_array($post->post_type, array('post', 'page'))) {
return;
}
// Verifica que no sea un auto-borrador.
if ($post->post_status == 'auto-draft') {
return;
}
// Obtiene el slug original.
$original_slug = $post->post_name;
// Genera un nuevo slug basado en el título.
$new_slug = sanitize_title($post->post_title);
// Solo actualiza si el nuevo slug es diferente al original.
if ($original_slug !== $new_slug) {
// Asegura que el nuevo slug sea único.
$new_slug = wp_unique_post_slug($new_slug, $post_id, $post->post_status, $post->post_type, $post->post_parent);
// Actualiza el post con el nuevo slug.
wp_update_post(array(
'ID' => $post_id,
'post_name' => $new_slug
));
}
}
add_action('save_post', 'update_slug_on_title_change');
Cada vez que cambies el título de un post o página, la URL se actualizará automáticamente para reflejar este cambio, manteniendo la consistencia entre el título y la URL.
Estos dos snippets de código son herramientas poderosas para mejorar tu flujo de trabajo en WordPress, permitiéndote duplicar posts y páginas fácilmente y mantener URLs consistentes con los títulos de tus contenidos. Implementarlos en tu sitio es sencillo y te ahorrará tiempo en la gestión de contenidos.
¡Espero que estos consejos te sean de gran ayuda!
La Inteligencia Artificial ha dejado de ser una promesa de futuro para convertirse en una…
Descarga gratis la Guía Rápida de Redes Sociales 2025 con estrategias, consejos y herramientas para…
En el vertiginoso mundo del marketing online, la incorporación de herramientas de inteligencia artificial se…
Los cuatro tipos de consumidores que vamos a analizar son: el optimista, el escéptico, el…
Hay cinco aspectos fundamentales a tener en cuenta para tener éxito en el mundo digital…
SEO (Search Engine Optimization) y SEM (Search Engine Marketing) son dos técnicas diferentes que se…