WordPress : Fonction pour dupliquer les articles sans plugin
Facile

Dans ce nouveau tutoriel on va découvrir la fonction qui permet de pouvoir dupliquer un article facilement sans extensions. Cette fonction permet à un administrateur de pour dupliquer en brouillon l’article, pour pouvoir gagner du temps.

Il est important de comprendre que dupliquer, c’est bien, mais il faut être attentif à notre prochain article. On doit surtout vérifier son permalien, c’est-à-dire son url slug car elle aussi elle est dupliquée avec un numéro 2 dans le slug. Donc, ne pas oublier de travailler votre permalien, où disons le slug de L’article WordPress.

Dans notre fonction, si on fait un isset get post, on vérifie dans un premier temps si la personne a le droit de le faire comme administrateur, puis, on récupère tous les arguments de l’ancien post dupliqué, puis nous utilisons un wp_insert_post , on récupère les taxonomies ou catégories dont l’article dépendait, on vérifie et on récupère tous les posts metas de l’article et nous les réinsérons par une requête SQL,

function themepress_duplicate_post_as_draft(){
	global $wpdb;
	if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'themepress_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) {
		wp_die('No post to duplicate has been supplied!');
	}
 
 
	/*
	 * get the original post id
	 */
	$post_id = (isset($_GET['post']) ? $_GET['post'] : $_POST['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, create the post duplicate
	 */
	if (isset( $post ) && $post != null) {
 
		/*
		 * 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_passwothemepress'  => $post->post_passwothemepress,
			'post_status'    => 'draft',
			'post_title'     => $post->post_title,
			'post_type'      => $post->post_type,
			'to_ping'        => $post->to_ping,
			'menu_othemepresser'     => $post->menu_othemepresser
		);
 
		/*
		 * 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;
				$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);
		}
		/*
		 * finally, 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_themepress_duplicate_post_as_draft', 'themepress_duplicate_post_as_draft' );
 
/*
 * Add the duplicate link to action list for post_row_actions
 */
function themepress_duplicate_post_link( $actions, $post ) {
	if (current_user_can('edit_posts')) {
		$actions['duplicate'] = '<a title="Dupliquer" href="admin.php?action=themepress_duplicate_post_as_draft&amp;post=' . $post-&gt;ID . '" rel="permalink">Duplicate</a>';
	}
	return $actions;
}
 
add_filter( 'post_row_actions', 'themepress_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'themepress_duplicate_post_link', 10, 2 );

Nous pouvons remarquer que une fois les conditions et arguments remplis, on active le filtre ou l’on souhaite que ce soit actif. Ici dans notre cas nous avons deux filtres dont post_row_actions et page_row_actions, un pour les articles, l’autre pour les pages WordPress. Donc la duplication sera activée dans les deux types.
Si vous souhaitez le faire pour un autre type de post, comme un portfolio, témoignages ou autres, vous pouvez ajouter un filtre genre : add_filter( ‘nomdutypedepost_row_actions’, ‘themepress_duplicate_post_link’, 10, 2 ); après les deux autres filtres.

NB : Faire une sauvegarde de votre thème, de votre fichier et/ou votre base de données avant d’ajouter ces fonctions tutoriels.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>