Duplicar entradas y páginas

Duplicar entradas y páginas

Un código extenso y explicado para poder dar la opción desde el dashboard de duplicar entradas, páginas y contenidos personalizados.

// Añadir el enlace duplicado a la lista de acciones para post_row_actions para "post" y tipos de post personalizados
add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
// Para el tipo de entrada "página"
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="Duplicar este elemento" rel="permalink">Duplicar</a>';

	return $actions;
}

/*
 * La función crea un duplicado del mensaje como borrador y lo redirige a la pantalla de edición del mensaje.
 */
add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );

function rd_duplicate_post_as_draft(){

	// Comprobar si se ha proporcionado el ID del puesto y la acción
	if ( empty( $_GET[ 'post' ] ) ) {
		wp_die( 'Ningún post para duplicar' );
	}

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

	// Obtiene el ID del post original
	$post_id = absint( $_GET[ 'post' ] );

	// Obtiene todos los datos del post original
	$post = get_post( $post_id );

	/*
	 * Si no quieres que el usuario actual sea el autor de la nueva entrada, cambia las siguientes líneas por esto: $new_post_author = $post->post_author;
	 */
	$current_user = wp_get_current_user();
	$new_post_author = $current_user->ID;

	// Si los datos del post existen (seguro que sí, pero por si acaso), crea el duplicado del post
	if ( $post ) {

		// Nuevo array de datos del post
		$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
		);

		// Inserta el post mediante la función wp_insert_post()
		$new_post_id = wp_insert_post( $args );

		/*
		 * Obtener todos los términos de entrada actuales y establecerlos en el nuevo borrador de entrada
		 */
		$taxonomies = get_object_taxonomies( get_post_type( $post ) ); // devuelve un array de nombres de taxonomía para el tipo de entrada, 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 );
			}
		}

		// duplicar todos los metadatos
		$post_meta = get_post_meta( $post_id );
		if( $post_meta ) {

			foreach ( $post_meta as $meta_key => $meta_values ) {

				if( '_wp_old_slug' == $meta_key ) { // no hacer nada con esta meta key
					continue;
				}

				foreach ( $meta_values as $meta_value ) {
					add_post_meta( $new_post_id, $meta_key, $meta_value );
				}
			}
		}

		// Finalmente, redirigir a la pantalla de edición de mensajes para el nuevo proyecto
		// wp_safe_redirect(
		// 	add_query_arg(
		// 		array(
		// 			'action' => 'edit',
		// 			'post' => $new_post_id
		// 		),
		// 		admin_url( 'post.php' )
		// 	)
		// );
		// exit;
		// o podemos redirigir a todos los mensajes con un mensaje
		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( 'Falló la creación del contenido, no se pudo encontrar el contenido original.' );
	}

}

/*
 * En caso de que decidamos añadir avisos de administración
 */
add_action( 'admin_notices', 'rudr_duplication_admin_notice' );

function rudr_duplication_admin_notice() {

	// Obtener la pantalla actual
	$screen = get_current_screen();

	if ( 'edit' !== $screen->base ) {
		return;
	}

    // Comprueba si se han actualizado los ajustes
    if ( isset( $_GET[ 'saved' ] ) && 'post_duplication_created' == $_GET[ 'saved' ] ) {

		 echo '<div class="notice notice-success is-dismissible"><p>Se ha creado la copia del contenido</p></div>';
		 
    }
}

¿Te ha gustado este código? Coméntalo con códigosWP:

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio