Soms kom je in een situatie terecht waarin je een nieuw bericht of pagina wil maken die identiek is aan een bestaand bericht of pagina van je site.

Als het om een lang bericht of pagina gaat en veel media bevat, dan is het opnieuw toevoegen van die content al snel een moeizaam proces. Ook als je veel berichten publiceert die erg op elkaar lijken, dan is het vrij frustrerend om al deze content handmatig opnieuw te schrijven en alle mediabestanden opnieuw aan deze berichten of pagina’s toe te voegen.

Een optie kan zijn om het bestaande bericht (om de leesbaarheid te bevorderen gebruiken we ‘bericht’ om te verwijzen naar zowel berichten als pagina’s) te openen in een nieuw browservenster en het nieuwe bericht in een andere om tussen deze twee te wisselen terwijl je je content kopieert en plakt. Tenslotte maken recente (post-Gutenberg) versies van WordPress je dit vrij gemakkelijk, met de ‘Copy All Content’-functionaliteit.

Maar als je dit steeds opnieuw moet doen dan bestaat het risico dat je fouten maakt. Wat als je per ongeluk het oorspronkelijke bericht bewerkt en de content vervangt die je al op je site hebt gepubliceerd? Of als je een groot aantal berichten wil kopiëren en je het overzicht kwijtraakt en niet meer weet welke je wel en niet hebt aangemaakt?

Dit kan op den duur voor veel kopzorgen zorgen.

Het kan gelukkig eenvoudiger. Er zijn een aantal gratis plugins beschikbaar waarmee je je berichten en pagina’s kan dupliceren, zodat je ze kan bewerken en aanpassen om nieuwe berichten te maken die vrijwel identiek zijn aan je bestaande content.

In dit bericht laten we je een aantal methodes zien die je kan gebruiken om dit te doen en geven we je een aantal plugins die wij hiervoor het meest geschikt achten.

Maar eerst laten we je zien hoe je een pagina of bericht in WordPress op de semi-handmatige manier kan dupliceren, zonder plugin. Met deze methode moet je kopiëren en plakken, maar WordPress maakt het eenvoudig om dit te doen. Als je dus maar één bericht hoeft te kopiëren, dan is dit een stuk sneller dan door eerst een plugin te installeren en deze te gebruiken.

Een pagina of bericht dupliceren in WordPress, de semi-handmatige manier

Deze methode kan sneller zijn als je maar één bericht hebt dat je wil dupliceren, omdat je de tijd bespaart die het kost om een plugin te installeren. Als je een groot aantal berichten moet dupliceren, dan raad ik je echter aan om dit gedeelte over te slaan: het gaat veel sneller, en bovendien veel accurater, als je een plugin gebruikt.

Voor iedereen die slechts één bericht of pagina moet dupliceren, dit is hoe je het doet.

Begin door je bestaande bericht of pagina te openen. Zorg ervoor dat je geen individueel blok hebt geselecteerd door ergens buiten een blok (binnen je bericht) te klikken of het Document-tab te selecteren in het bewerkingsvenster aan de rechterkant van je scherm. Als je namelijk een blok hebt geselecteerd, dan kopieert WordPress simpelweg de inhoud van dat blok en niet die van het hele document.

Klik nu op de ellips in de rechterbovenhoek van het bewerkingsscherm (de drie verticale stippen).

De optie om alle content te kopiëren in WordPress
De optie om alle content te kopiëren in WordPress

Nu komt er een menu. Onderaan dit menu zie je een optie met Copy All Content. Klik erop en je krijgt een bericht dat je content is gekopieerd.

Maak nu je nieuwe bericht aan. Geef je bericht een titel en klik vervolgens op het eerste lege blok dat voor je klaar staat in het bewerkingsscherm. Gebruik de sneltoetsen op je toetsenbord om te plakken (Ctrl + V op een PC, Cmd + V op een Mac of selecteer Paste in het snelmenu dat verschijnt).

De inhoud van je oudere bericht verschijnt nu in je nieuwe bericht. Magie! (Oké, misschien ook niet.)

Nu kan je dat bericht bewerken en er een nieuw bericht van maken. Dit is iets dat ik sterk adviseer – het heeft niet veel zin om blogberichten te hebben die exacte duplicaten van elkaar zijn. Het verwart niet alleen bezoekers, maar het is ook slecht voor SEO.

Maar wat als je meerdere kopieën van je bericht wil maken? Lees dan verder…

Een pagina of bericht dupliceren in WordPress met een plugin

Veruit de snelste, gemakkelijkste en meest betrouwbare manier om berichten te kopiëren is door een plugin te gebruiken. Hiermee bespaar je tijd, vermijd je menselijke fouten en kan je elk gewenst berichttype kopiëren. Onze ervaring met het dupliceren van posten beperkt zich voornamelijk met aangepaste berichttypes. Het is niet echt gebruikelijk om twee vrijwel identieke blogposts tegen te komen, maar het is bijvoorbeeld heel gebruikelijk voor producten in een online winkel.

Hier zijn dus enkele plugins die het proces van het dupliceren van berichten eenvoudig maken. Daarnaast geven we ook richtlijnen om ze te gebruiken.

WooCommerce

Je vraagt je misschien af waarom ik WooCommerce in deze sectie heb opgenomen. Het is immers een e-commerce plugin, en geen plugin om berichten mee te kopiëren.

Het is echter wel van belang om te weten dat je met WooCommerce, zonder hulp van een extra plugin, eenvoudig producten kan dupliceren. Dus voordat je begint met je zoektocht naar een plugin om producten mee te dupliceren, gebruik gewoon de features die gratis met WooCommerce worden geleverd.

Als je naar het hoofdscherm van Producten gaat in WooCommerce en met je muis over een product beweegt, dan zie je een Duplicate-link onder die post.

De optie om producten te dupliceren in WooCommerce
De optie om producten te dupliceren in WooCommerce

Klik simpelweg op de Duplicate-link en er zal een nieuw product worden aangemaakt. Je wordt vervolgens rechtstreeks naar het bewerkingsvenster van het nieuwe product gestuurd zodat je wijzigingen kan aanbrengen en vervolgens het product kan publiceren.

Het is vermeldenswaard dat de slug van het nieuwe product de slug van het oude product zal zijn waaraan -copy is toegevoegd, dus als je de titel van het nieuwe product verandert, moet je ook de slug veranderen.

Een gedupliceerd product bewerken
Een gedupliceerd product bewerken

De plugin Duplicate Post

Duplicate Post is de populaire plugin voor het dupliceren van berichten, met meer dan 3 miljoen downloads.

Zodra je deze hebt geactiveerd, wordt een Clone-link toegevoegd aan elk bericht in het Posts-hoofdscherm in de WordPress admin.

De plugin Duplicate Post
De plugin Duplicate Post

Klik op de Clone-link onder het bericht dat je wil dupliceren en er zal een nieuw (concept)bericht voor je worden aangemaakt met dezelfde titel en inhoud.

Je kan vervolgens het nieuwe bericht bewerken en het een nieuwe titel geven (iets wat ik ten zeerste zou adviseren – met WordPress kan je titels dupliceren, maar het is niet goed voor de gebruikerservaring).

Ook voegt de plugin een Clone-link toe aan pagina’s en aangepaste berichttypen (mits je deze functie inschakelt binnen de instellingen).

Duplicate Page

De plugin Duplicate Page is meer dan 900.000 keer gedownload en het alternatief voor de Duplicate Post plugin die we hierboven bespraken.

Nadat je de plugin hebt geïnstalleerd, ga je naar de Berichten of Pagina’s admin-scherm, of het admin-scherm voor je aangepaste berichttypes. Daar vind je de link Duplicate This onder elk bericht. Dit is de mijne met een aangepast berichttype:

De plugin Duplicate Page
De plugin Duplicate Page

Klik op de link en je krijgt een nieuw bericht (of pagina, of bericht van je aangepaste berichttype) met dezelfde inhoud en titel als het oorspronkelijke bericht, met een conceptstatus. Bewerk deze en verander de slug voordat je het publiceert.

Opmerking: als je WooCommerce gebruikt, dan wordt de Duplicate This-link van deze plugin niet weergegeven in de productenpagina. WooCommerce heft deze functie op met zijn eigen Duplicate-link die ik eerder in dit bericht beschreef.

Berichten of pagina’s in bulk dupliceren

Met de plugins die ik net heb besproken kan je een-voor-een berichten dupliceren. Maar wat als je alle berichten op je site wil dupliceren, of alle berichten uit een aangepast berichttype? Of misschien wel alle berichten die je dit jaar hebt gepubliceerd?

Met de plugin WP Bulk Post Duplicator kan je dat doen. In plaats van dat de plugin een link toevoegt aan elk afzonderlijk bericht, krijg je een instellingenscherm waarmee je berichten in bulk kan dupliceren volgens door jou ingestelde criteria.

Opmerking: deze plugin is op moment van schrijven al twee jaar niet bijgewerkt, dus we raden aan om deze in een testomgeving te installeren en te testen voordat je hem op een live-site gebruikt. Op onze site werkte hij zonder problemen.

Nadat je de plugin hebt geïnstalleerd, ga dan naar Settings > WP Bulk Post Duplicator om naar het instellingenscherm van de plugin te gaan.

Begin met het selecteren van de berichttypen die je wil publiceren, tezamen met de berichtstatussen. Als je dus post en published selecteert, dan dupliceert de plugin al je gepubliceerde berichten. Als je in plaats daarvan posts en draft selecteert, dan dupliceert de plugin al je conceptberichten.

Instellingen Duplicate Settings - berichttype en status
Instellingen Duplicate Settings – berichttype en status

Scrol naar beneden en selecteer het jaar van de berichten die je wil publiceren (dit is optioneel). Je kan daar ook de status van de nieuw aangemaakte berichten specificeren. Als je hier niets mee doet, dan wordt deze standaard als Concept ingesteld.

Instellingen Bulk Duplicate - jaar en publicatiestatus
Instellingen Bulk Duplicate – jaar en publicatiestatus

Klik op de knop Duplicate en de plugin zal je berichten dupliceren. Hier kan je zien dat al mijn pagina’s zijn gedupliceerd, met 12 bestaande gepubliceerde pagina’s en 12 nieuwe conceptpagina’s. Nu moet ik nog alle pagina’s doornemen en ze bewerken voordat ik ze publiceer. Dit kost natuurlijk tijd, maar toch een stuk minder dankzij deze plugin.

Je eigen plugin schrijven om berichten te dupliceren

Wat als je geen externe plugin wil gebruiken om berichten te dupliceren en liever je eigen plugin codeert?

Geen probleem. Volg gewoon deze stappen om je eigen duplicatieplugin te schrijven.

1. De plugin instellen

We beginnen met het instellen van de plugin. Voeg een nieuw bestand toe aan de map wp-content/plugins en voeg deze commentaartekst toe (je kan de jouwe bewerken om de auteursnaam weer te geven):

<?php
/*
Plugin Name: Kinsta Duplicate posts and pages
Plugin URI: https://kinsta.com
Description: Plugin to accompany kinsta posst on duplicating posts in WordPress. Allows for duplication of posts and pages.
Version: 1.0
Author: Rachel McCollin
Author URI: https://rachelmccollin.com
TextDomain: kinsta
License: GPLv2
*/

2. De functie creëeren

Voeg nu de functie toe die de berichten dupliceert en hook deze aan een actiehook. Deze actiehook bestaat nog niet, maar maak je geen zorgen, deze maken we ook.

function kinsta_duplicate_post(){
}
add_action( 'admin_action_kinsta_duplicate_post', 'kinsta_duplicate_post' );

Laten we nu de actie maken, die deel uitmaakt van een functie om de duplicatielink toe te voegen aan de overzichtspagina’s van berichten en pagina’s.

function kinsta_duplicate_post_link( $actions, $post ) {
 if ( current_user_can( 'edit_posts') ) {
  $actions['duplicate'] = 'Duplicate';
 }
 return $actions;
}
add_filter( 'post_row_actions', 'kinsta_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'kinsta_duplicate_post_link', 10, 2);

Deze voegt de link toe waarmee je kan dupliceren, ook al wordt er momenteel nog niets gedupliceerd.

3. Duplicatiefunctionaliteit toevoegen

Nu is het tijd om de code voor duplicatie toe te voegen. De rest van de code gaat in de lege functie kinsta_duplicate_post().

Laten we eerst controleren of een geldig bericht is geselecteerd en controleren op een nonce, voor de veiligheid:

global $wpdb;

// Die if post not selected
if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'kinsta_duplicate_post' == $_REQUEST['action'] ) ) ) {
 wp_die( __( 'Please select a post to duplicate.', 'kinsta' ) );
}

// Verify nonce
if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
 return;
}

Nu moeten we de ID van het te dupliceren bericht ophalen, samen met de gegevens:

// Get id of post to be duplicated and data from it
$post_id = ( isset( $_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
$post = get_post( $post_id );

We kunnen deze gebruiken om een reeks argumenten te definiëren en een nieuw bericht in de database in te voegen, met behulp van wp_insert_post (). Maar we moeten eerst een conditional statement toevoegen om te controleren of het bericht niet null is:

if ( isset( $post ) && $post != null ) {

}

Voeg dit toe aan de conditional statement:

// args for new post
$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,
 'post_type'      => $post->post_type,
 'to_ping'        => $post->to_ping,
 'menu_order'     => $post->menu_order
);

// insert the new post
$new_post_id = wp_insert_post( $args );

Nu halen we de taxonomieën uit het oude bericht op en voegen we deze toe aan de nieuwe:

// add taxonomy terms to the new post

// identify taxonomies that apply to the post type
$taxonomies = get_object_taxonomies( $post->post_type );

// add the taxonomy terms to the new post
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 );
}

Vervolgens halen we eventuele extra bericht-metagegevens op met een SQL-query:

// use SQL queries to duplicate postmeta
$post_metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
if ( count( $post_metas )!=0 ) {
 
$sql_query = "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) ";
 
foreach ( $post_metas as $post_meta ) {
  $meta_key = $post_metas->meta_key;
  if( $meta_key == '_wp_old_slug' ) continue;
  $meta_value = addslashes( $post_metas->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 );

}

Ten slotte controleren we welk berichttype het bericht is en verwijzen we door naar de relevante overzichtspagina.

// redirect to admin screen depending on post type
$posttype = get_post_type( $post_id );
wp_redirect( admin_url( 'edit.php?post_type=' . $posttype ) );

Nu voegen we buiten de accolades van de  if ( isset( $post ) && $post != null ) controle een foutmelding toe:

else {
 // display an error message if the post id of the post to be duplicated can't be found
 wp_die( __( 'Post cannot be found. Please select a post to duplicate.', 'kinsta' ) );
}

Dat is alles!

De volledige plugin

Hier is de volledige code voor de plugin:

<?php

/* Plugin Name: Kinsta Duplicate posts and pages

Plugin URI: https://kinsta.com
Description: Plugin to accompany kinsta posst on duplicating posts in WordPress. Allows for duplication of posts and pages. Version: 1.0 Author: Rachel McCollin
Author URI: https://rachelmccollin.com
TextDomain: kinsta
License: GPLv2
*/

/********************************************************************
kinsta_duplicate_post() - duplicates the selected post
*********************************************************************/

function kinsta_duplicate_post(){

global $wpdb;

// Die if post not selected
if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'kinsta_duplicate_post' == $_REQUEST['action'] ) ) ) {

wp_die( __( 'Please select a post to duplicate.', 'kinsta' ) );
}

// Verify nonce
if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
return;
}

// Get id of post to be duplicated and data from it
$post_id = ( isset( $_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
$post = get_post( $post_id );

// duplicate the post
if ( isset( $post ) && $post != null ) {

// args for new post
$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,
'post_type'      => $post->post_type,
'to_ping'        => $post->to_ping,
'menu_order'     => $post->menu_order
);

// insert the new post
$new_post_id = wp_insert_post( $args );

// add taxonomy terms to the new post

// identify taxonomies that apply to the post type
$taxonomies = get_object_taxonomies( $post->post_type );

// add the taxonomy terms to the new post
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 );

}

// use SQL queries to duplicate postmeta
$post_metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");

if ( count( $post_metas )!=0 ) {
 
 $sql_query = "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) ";

 foreach ( $post_metas as $post_meta ) {

  $meta_key = $post_metas->meta_key;
  if( $meta_key == '_wp_old_slug' ) continue;
  $meta_value = addslashes( $post_metas->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 admin screen depending on post type
 $posttype = get_post_type( $post_id );
 wp_redirect( admin_url( 'edit.php?post_type=' . $posttype ) );

 } else {

  // display an error message if the post id of the post to be duplicated can't be found
  wp_die( __( 'Post cannot be found. Please select a post to duplicate.', 'kinsta' ) );
 }

}
add_action( 'admin_action_kinsta_duplicate_post', 'kinsta_duplicate_post' );

// Add the duplicate link to action list for post_row_actions
function kinsta_duplicate_post_link( $actions, $post ) {

 if ( current_user_can( 'edit_posts') ) {
  $actions['duplicate'] = 'Duplicate';
 }

 return $actions;

}
add_filter( 'post_row_actions', 'kinsta_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'kinsta_duplicate_post_link', 10, 2);

Je kan de volledige plugin ook op github vinden.

Gefeliciteerd! Je hebt je eigen plugin gemaakt om berichten en pagina’s op je WordPress-site te dupliceren.

Vermelding: Deze code was gedeeltelijk geschreven met verwijzing naar een bericht op de Hostinger blog.

Samenvatting

Je kan veel tijd besparen door een plugin te gebruiken voor het dupliceren van berichten en pagina’s in plaats van dit handmatig te doen. Bovendien loop je geen risico op menselijke fouten bij het kopiëren van content.

Als je slechts een bericht hoeft te kopiëren, dan is de functie ‘Copy All Content’ van WordPress waarschijnlijk het snelt, maar als je meer dan een bericht wil dupliceren, dan biedt een plugin uitkomst. Als je een van de bovenstaande plugins gebruikt, of je eigen hebt geschreven, dan kan je zoveel berichten, pagina’s of aangepast berichttypes zo vaak dupliceren als je wilt.

Als je het op deze manier doet, dan bespaar je tijd en (nog belangrijk), loop je niet het risico dat je het originele bericht per ongeluk bewerkt in plaats van het te dupliceren bericht.