¿WordPress tiene una función incorporada para duplicar publicaciones?

2 minutos de lectura

Soy el avatar de usuario de la persona más estúpida.
Soy la persona más estúpida

Quiero duplicar algunas publicaciones programáticamente sin comentarios.

¿WordPress tiene una función incorporada para duplicar publicaciones?

  • No creo que WP tenga esa característica por defecto en el núcleo.

    – Nilambar Sharma

    4 de junio de 2019 a las 4:15

Puedes usar el wp_insert_post() función para duplicar una publicación.

Solo necesita eliminar la ID de la publicación de los datos que le pasa, y WordPress creará una nueva publicación en lugar de actualizar una existente. P.ej

    $post_id = 1234;
    $post = (array) get_post( $post_id ); // Post to duplicate.
    unset($post['ID']); // Remove id, wp will create new post if not set.
    wp_insert_post($post);

Los comentarios se almacenan en una tabla diferente. Y están vinculados por el ID de la publicación. Como la publicación duplicada tendrá una ID diferente, los comentarios originales no se asociarán con ella.

  • Gracias. Pero, ¿qué sucede con los campos personalizados, la taxonomía personalizada? Esos también deberían duplicar

    – Soy la persona más estúpida

    4 de junio de 2019 a las 4:55


  • Los meta y términos deberían copiarse por separado.

    – engranaje

    4 de junio de 2019 a las 5:59

No, no existe tal funcionalidad como publicación duplicada en el núcleo de WordPress.

Para cumplir con sus requisitos, puede usar este complemento: https://wordpress.org/plugins/post-duplicator/

Este complemento duplica la publicación pero no comenta. Ver allí la documentación

Si solo necesita copiar la publicación, puede usar la solución de @ngearing en https://stackoverflow.com/a/56437515/3480821

Si también desea duplicar la publicación con su meta y términos, puede usar la siguiente función:

<?php

/**
 * Duplicates a post & its meta and returns the new duplicated Post ID.
 *
 * @param int $post_id The Post ID you want to clone.
 * @return int The duplicated Post ID.
 */
function duplicate_post(int $post_id): int
{
    $old_post = get_post($post_id);
    if (!$old_post) {
        // Invalid post ID, return early.
        return 0;
    }

    $title = $old_post->post_title;

    // Create new post array.
    $new_post = [
        'post_title'  => $title,
        'post_name'   => sanitize_title($title),
        'post_status' => 'draft',
        'post_type'   => $old_post->post_type,
    ];

    // Insert new post.
    $new_post_id = wp_insert_post($new_post);

    // Copy post meta.
    $post_meta = get_post_custom($post_id);
    foreach ($post_meta as $key => $values) {
        foreach ($values as $value) {
            add_post_meta($new_post_id, $key, maybe_unserialize($value));
        }
    }

    // Copy post taxonomies.
    $taxonomies = get_post_taxonomies($post_id);
    foreach ($taxonomies as $taxonomy) {
        $term_ids = wp_get_object_terms($post_id, $taxonomy, ['fields' => 'ids']);
        wp_set_object_terms($new_post_id, $term_ids, $taxonomy);
    }

    // Return new post ID.
    return $new_post_id;
}

También he hecho que esta función esté disponible en un La esencia de Github aquí.

¿Ha sido útil esta solución?