WordPress: Einen Beitrag mit PHP duplizieren

Es gibt Plugins, mit denen man spielend leicht einen Beitrag oder auch andere Inhaltsarten duplizieren kann. Mit einem kleinen Schnipsel lässt sich dies aber auch mit PHP alleine lösen. Hier erfährst du, wie du mittels PHP einen Beitrag duplizierst. Dabei werden Metafelder und auch die Taxonomien dupliziert.

Beitrag duplizieren

function duplicate($post_id)
{
    // Ruft den Titel des Beitrags ab
    $title = get_the_title($post_id);

    // Ruft den Beitrag mithilfe seiner ID ab
    $old = get_post($post_id);

    // Erstellt ein Array mit den Eigenschaften für den neuen Beitrag
    $post = [
        'post_title' => $title, // Titel des neuen Beitrags
        'post_name' => sanitize_title($title), // Name des neuen Beitrags (keine Sonderzeichen oder Leerzeichen)
        'post_status' => 'draft', // Status des neuen Beitrags (Entwurf)
        'post_type' => $old->post_type, // Typ des neuen Beitrags (gleich wie beim alten Beitrag),
        'post_content' => $old->post_content, // Inhalt des neuen Beitrags (gleich wie beim alten Beitrag)
    ];

    // Erstellt den neuen Beitrag in der Datenbank
    $new = wp_insert_post($post);

    // Gibt die ID des neuen Beitrags zurück
    return $new;
}Code-Sprache: PHP (php)

Diese Funktion dupliziert einen Beitrag in WordPress mit einer bestimmten ID. Der Beitrag wird in den Entwurfsmodus versetzt, wenn er dupliziert wird.

Die Funktion nimmt eine Beitrags-ID als Eingabeparameter und verwendet dann die WordPress-Funktion get_the_title und get_post, um den Titel und die Eigenschaften des Beitrags mit der angegebenen ID abzurufen.

Danach werden die Eigenschaften des Beitrags in einem Array gespeichert und die WordPress-Funktion wp_insert_post verwendet, um eine neue Kopie des Beitrags zu erstellen. Das Array enthält den Titel des Beitrags, eine „saubere“ Version des Titels (was bedeutet, dass es nur Buchstaben, Zahlen und Unterstriche enthält, um Probleme bei der Verwendung als URL zu vermeiden), den Status „Entwurf“ und den Typ des Beitrags (z.B. „Beitrag“ oder „Seite“).

Schließlich wird die ID der neu erstellten Beitragskopie zurückgegeben.

Mit duplicate($post_id); lässt sich jetzt ein einzelner Beitrag innerhalb WordPress duplizieren. Metafelder und Taxonomien werden nicht berücksichtigt.

Beitrag mit Metafeldern duplizieren

function duplicate($post_id)
{
    // Ruft den Titel des Beitrags ab
    $title = get_the_title($post_id);

    // Ruft den Beitrag mithilfe seiner ID ab
    $old = get_post($post_id);

    $post = [
        'post_title' => $title, // Titel des neuen Beitrags
        'post_name' => sanitize_title($title), // Name des neuen Beitrags (keine Sonderzeichen oder Leerzeichen)
        'post_status' => 'draft', // Status des neuen Beitrags (Entwurf)
        'post_type' => $old->post_type, // Typ des neuen Beitrags (gleich wie beim alten Beitrag)
        'post_content' => $old->post_content, // Inhalt des neuen Beitrags (gleich wie beim alten Beitrag)
    ];

    // Erstellt den neuen Beitrag in der Datenbank
    $new = wp_insert_post($post);

    // Ruft benutzerdefinierte Daten des alten Beitrags ab
    $data = get_post_custom($post_id);

    // Fügt benutzerdefinierte Daten des alten Beitrags dem neuen Beitrag hinzu
    foreach ($data as $key => $values) {
        if (is_array($values)) {
            foreach ($values as $value) {
                update_post_meta($new, $key, maybe_unserialize($value));
            }
        } else {
            update_post_meta($new, $key, maybe_unserialize($values));
        }
    }
    
    // Gibt die ID des neuen Beitrags zurück
    return $new;
}Code-Sprache: PHP (php)

Die Funktion verwendet die WordPress-Funktionen get_post_custom und add_post_meta, um die benutzerdefinierten Felder des ursprünglichen Beitrags abzurufen und sie dem neu erstellten Beitrag hinzuzufügen. Sie geht dabei alle benutzerdefinierten Felder durch und fügt sie einzeln hinzu, indem sie die add_post_meta-Funktion für jedes Feld aufruft. Die maybe_unserialize-Funktion wird verwendet, um sicherzustellen, dass die Daten, die hinzugefügt werden, in der korrekten Form sind.

Beitrag mit Metafeldern und Taxonomien duplizieren

function duplicate($post_id)
{
    // Ruft den Titel des Beitrags ab
    $title = get_the_title($post_id);

    // Ruft den Beitrag mithilfe seiner ID ab
    $old = get_post($post_id);

    $post = [
        'post_title' => $title, // Titel des neuen Beitrags
        'post_name' => sanitize_title($title), // Name des neuen Beitrags (keine Sonderzeichen oder Leerzeichen)
        'post_status' => 'draft', // Status des neuen Beitrags (Entwurf)
        'post_type' => $old->post_type, // Typ des neuen Beitrags (gleich wie beim alten Beitrag)
        'post_content' => $old->post_content, // Inhalt des neuen Beitrags (gleich wie beim alten Beitrag)
    ];

    // Erstellt den neuen Beitrag in der Datenbank
    $new = wp_insert_post($post);

    // Ruft benutzerdefinierte Daten des alten Beitrags ab
    $data = get_post_custom($post_id);

    // Fügt benutzerdefinierte Daten des alten Beitrags dem neuen Beitrag hinzu
    foreach ($data as $key => $values) {
        if (is_array($values)) {
            foreach ($values as $value) {
                update_post_meta($new, $key, maybe_unserialize($value));
            }
        } else {
            update_post_meta($new, $key, maybe_unserialize($values));
        }
    }

    // Ruft die Taxonomien des alten Beitrags ab
    $taxonomies = get_post_taxonomies($post_id);

    // Wenn der Beitrag Taxonomien hat, werden diese dem neuen Beitrag hinzugefügt
    if ($taxonomies) {
        foreach ($taxonomies as $taxonomy) {

            // Setzt die Taxonomien des alten Beitrags für den neuen Beitrag
            wp_set_object_terms(
                $new, // ID des neuen Beitrags
                wp_get_object_terms(
                    $post_id, // ID des alten Beitrags
                    $taxonomy, // Taxonomie
                    [
                        'fields' => 'ids', // Gibt die IDs der Taxonomie-Terme zurück
                    ]
                ),
                $taxonomy
            );
        }
    }

    // Gibt die ID des neuen Beitrags zurück
    return $new;
}Code-Sprache: PHP (php)

Die WordPress-Funktion get_post_taxonomies wird verwendet, um alle Taxonomien abzurufen, die mit dem ursprünglichen Beitrag verknüpft sind. Wenn es Taxonomien gibt, werden sie iteriert und die WordPress-Funktion wp_set_object_terms verwendet, um sie dem neu erstellten Beitrag hinzuzufügen. Dazu wird die wp_get_object_terms-Funktion verwendet, um die Begriffe der Taxonomien abzurufen, die dem ursprünglichen Beitrag zugeordnet sind.

Wann immer man also duplicate(); verwendet, wird der alles dupliziert und man benötigt kein Plugin mehr, welches dies für einen erledigt. WordPress fügt der URL des Duplikats immer eine Zahl hinzu, damit es keine Überschneidungen mit älteren Beiträgen gibt, die dieselbe URL besitzen.

Nützlich ist das, wenn man bspw. im Frontend ein Feature baut, um Inhalte zu duplizieren, bspw. für Portale oder Ähnliches. Sicher fallen dir einige Einsatzmöglichkeiten dafür ein. Jetzt weißt du auf jeden Fall, wie man mit PHP Inhalte in WordPress dupliziert.