Pourquoi dupliquer une page WordPress ?
Il serait nettement plus simple de pouvoir parfois dupliquer une page pour ne pas repartir à 0, non ?
Vous construisez un joli site web WordPress ou vous publiez régulièrement des articles. Vous avez travaillé sur votre modèle de page, afin de donner envie à vos internautes de lire leur contenu. C’est parfait ! Seulement voilà, selon le thème que vous utilisez, il peut s’avérer assez laborieux de reproduire pour chaque page ou chaque article, votre mise en page.
Fort heureusement, il existe diverses solutions, qu’il s’agisse d’extension, de fonction d’extension, ou bien tout simplement de snippets à intégrer sur votre site !
Mais tout d’abord, la petite histoire de « Duplicate Post » !
Il y a déjà bien longtemps, il existait une extension gratuite qui permettait de dupliquer une page, un article, ou n’importe quel Custom Post Type, et qui s’appelait tout simplement « Duplicate Post ». Cette petite extension gratuite a eu tant de succès sur le répertoire des extensions gratuites de WordPress, qu’à un certain moment, elle a été racheté par la compagnie Yoast SEO, qui l’a rebaptisé « Yoast Duplicate Post« , qui compte aujourd’hui plus de 4 millions d’utilisateurs.
J’en profite pour mentionner ici qu’en tant que spécialiste du référencement naturel (Organic SEO), Yoast a eu la bonne idée de ne pas modifier l’URL de l’extension sur le répertoire des extensions gratuites de WordPress. Donc, si vous regardez bien, l’url est https://fr.wordpress.org/plugins/duplicate-post/, et non https://fr.wordpress.org/plugins/yoast-duplicate-post/.
Pourquoi ? Et bien tout simplement pour ne pas nuire à leur référencement !
Mais, OUPS !, je m’égare, car c’est une autre histoire, mais si le référencement SEO vous intéresse, je vous invite à lire cet article.
Les autres solutions, en dehors de « Yoast Duplicate Post »
Effectivement, compte tenu de l’importance de cette fonctionnalité, il existe aujourd’hui des dizaines de solutions pour dupliquer une page.
Les extensions
Pour commencer, notons qu’en faisant une recherche sur le répertoire des extensions gratuites de WordPress, vous en trouverez toute une ribambelle ! Pourquoi ?
Et bien il est clair que tout le monde est intéressé par cette fonctionnalité, et donc, en offrant une solution gratuite, nombre de compagnies et de développeur peuvent par le biais de leur petite extension, vous proposer d’autres extensions …payantes, bien sûr !
Les Page Builders
Elementor
À l’origine, c’est l’add-on de Elementor, Essential Add-ons, qui avait créé cette fonction au sein même de leur extension. Puis, Elementor et d’autres extensions liées à ce Page Builder se sont mise à le proposer la duplication, mais d’une manière différente, puisqu’il s’agit là de dupliquer du contenu, et non une page au complet. Là est la nuance. À ma connaissance, seul Essential Add-ons permet de dupliquer une page ou un article en cliquant sur le lien « EA Duplicator », sous le titre de la page.
Pour en revenir à Elementor, en faisant un click droit de souris sur un widget, il suffit de faire « Copier« , puis ensuite d’aller dans une autre page, et de faire également un click droit de souris, puis de faire “Paste”. Suite à quoi, Elementor vous demandera de faire un “Ctrl+V” pour finaliser.
Important:
À noter que vous pouvez copier un widget, ou en sélectionner plusieurs pour les copier tous en même temps.
Gutenberg
Pour duplique une page avec Gutenberg, vous n’avez pas besoin d’installer un plugin. Il vous suffit simplement de suivre les étapes suivantes :
- Ouvrez la page que vous souhaitez copier.
- Cliquez sur les trois points en haut de l’article.
- Cliquez sur « Copier tout le contenu » dans la section Outils.
4. Créez un nouvel article ou une nouvelle page.
5. Collez le contenu de votre presse-papier en faisant “Ctrl+V” ou un click droit de souris en sélectionnant « Paste » dans une page vide.
WP Bakery
Avec WP Bakery, le principe est similaire aux autres Page Builder. Tout est expliqué dans cette video !
Une fonction à intégrer pour ceux qui savent intégrer du code
Cette méthode a plusieurs avantages:
- Ajouter le strict minimum de code pour faire ce dont on a besoin
- Éviter la publicité dans l’admin produite par les extensions gratuites
Il y a 3 manières d’intégrer une fonction:
- Copier la fonction dans le fichier function.php de votre thème enfant
- Utiliser une extension permettant d’ajouter des snippets, telle que Code Snippets ou WPCode, qui sont les 2 plus utilisées.
- Si vous utilisez Elementor, vous pourrez créer un « Custom Code«
Et voici le code à intégrer:
/**
* @snippet Duplicate posts and pages without plugins
* @author Misha Rudrastyh
* @url https://rudrastyh.com/wordpress/duplicate-post.html
*/
// Add the duplicate link to action list for post_row_actions
// for "post" and custom post types
add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
// for "page" post type
add_filter( 'page_row_actions', 'rd_duplicate_post_link', 10, 2 );
function rd_duplicate_post_link( $actions, $post ) {
if( ! current_user_can( 'edit_posts' ) ) {
return $actions;
}
$url = wp_nonce_url(
add_query_arg(
array(
'action' => 'rd_duplicate_post_as_draft',
'post' => $post->ID,
),
'admin.php'
),
basename(__FILE__),
'duplicate_nonce'
);
$actions[ 'duplicate' ] = '<a href="' . $url . '" title="Duplicate this item" rel="permalink">Duplicate</a>';
return $actions;
}
/*
* Function creates post duplicate as a draft and redirects then to the edit post screen
*/
add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );
function rd_duplicate_post_as_draft(){
// check if post ID has been provided and action
if ( empty( $_GET[ 'post' ] ) ) {
wp_die( 'No post to duplicate has been provided!' );
}
// Nonce verification
if ( ! isset( $_GET[ 'duplicate_nonce' ] ) || ! wp_verify_nonce( $_GET[ 'duplicate_nonce' ], basename( __FILE__ ) ) ) {
return;
}
// Get the original post id
$post_id = absint( $_GET[ 'post' ] );
// And all the original post data then
$post = get_post( $post_id );
/*
* if you don't want current user to be the new post author,
* then change next couple of lines to this: $new_post_author = $post->post_author;
*/
$current_user = wp_get_current_user();
$new_post_author = $current_user->ID;
// if post data exists (I am sure it is, but just in a case), create the post duplicate
if ( $post ) {
// new post data array
$args = array(
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
'post_author' => $new_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 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( get_post_type( $post ) ); // returns array of taxonomy names for post type, ex array("category", "post_tag");
if( $taxonomies ) {
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
$post_meta = get_post_meta( $post_id );
if( $post_meta ) {
foreach ( $post_meta as $meta_key => $meta_values ) {
if( '_wp_old_slug' == $meta_key ) { // do nothing for this meta key
continue;
}
foreach ( $meta_values as $meta_value ) {
add_post_meta( $new_post_id, $meta_key, $meta_value );
}
}
}
// finally, redirect to the edit post screen for the new draft
// wp_safe_redirect(
// add_query_arg(
// array(
// 'action' => 'edit',
// 'post' => $new_post_id
// ),
// admin_url( 'post.php' )
// )
// );
// exit;
// or we can redirect to all posts with a message
wp_safe_redirect(
add_query_arg(
array(
'post_type' => ( 'post' !== get_post_type( $post ) ? get_post_type( $post ) : false ),
'saved' => 'post_duplication_created' // just a custom slug here
),
admin_url( 'edit.php' )
)
);
exit;
} else {
wp_die( 'Post creation failed, could not find original post.' );
}
}
/*
* In case we decided to add admin notices
*/
add_action( 'admin_notices', 'rudr_duplication_admin_notice' );
function rudr_duplication_admin_notice() {
// Get the current screen
$screen = get_current_screen();
if ( 'edit' !== $screen->base ) {
return;
}
//Checks if settings updated
if ( isset( $_GET[ 'saved' ] ) && 'post_duplication_created' == $_GET[ 'saved' ] ) {
echo '<div class="notice notice-success is-dismissible"><p>Post copy created.</p></div>';
}
}
Conclusion
Voici donc bien des manières d’assurer un gain de temps et mettre vos énergies du côté créatif du design de site web !