WordPress教程

通过代码给WordPress文章/页面添加一键复制功能

阿里云

WordPress 默认没有复制这个功能的,比如两篇文章和页面内容相似,在原有基础上稍作修改就可以,通过复制就方便多了。当我们需要大部分相同的格式、标签、分类、自定义字段、SEO 数据等时,我们需要复制页面或文章功能。在本教程中,我们将学习如何在 WordPress 中复制页面或文章。我们可以使用插件或不使用插件来做到这一点。在此方法中,我们将创建复制 WordPress 页面或文章的功能。我们将在 functions.php 文件中添加一个代码片段。

添加功能

  1. /*
  2. * Function creates post duplicate as a draft and redirects then to the edit post screen
  3. */
  4. function duplicate_post_or_page(){
  5. 	global $wpdb;
  6. 	if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'duplicate_post_or_page' == $_REQUEST['action'] ) ) ) {
  7. 		wp_die('No post to duplicate has been supplied!');
  8. 	}
  9.  
  10. 	/*
  11. 	 * Nonce verification
  12. 	 */
  13. 	if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) )
  14. 		return;
  15.  
  16. 	/*
  17. 	 * get the original post id
  18. 	 */
  19. 	$post_id = (isset($_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
  20. 	/*
  21. 	 * and all the original post data then
  22. 	 */
  23. 	$post = get_post( $post_id );
  24.  
  25. 	/*
  26. 	 * if you don't want current user to be the new post author,
  27. 	 * then change next couple of lines to this: $new_post_author = $post->post_author;
  28. 	 */
  29. 	$current_user = wp_get_current_user();
  30. 	$post_author = $current_user->ID;
  31.  
  32. 	/*
  33. 	 * if post data exists, create the post duplicate
  34. 	 */
  35. 	if (isset( $post ) && $post != null) {
  36.  
  37. 		/*
  38. 		 * new post data array
  39. 		 */
  40. 		$args = array(
  41. 			'comment_status' => $post->comment_status,
  42. 			'ping_status'    => $post->ping_status,
  43. 			'post_author'    => $post_author,
  44. 			'post_content'   => $post->post_content,
  45. 			'post_excerpt'   => $post->post_excerpt,
  46. 			'post_name'      => $post->post_name,
  47. 			'post_parent'    => $post->post_parent,
  48. 			'post_password'  => $post->post_password,
  49. 			'post_status'    => 'draft',
  50. 			'post_title'     => $post->post_title,
  51. 			'post_type'      => $post->post_type,
  52. 			'to_ping'        => $post->to_ping,
  53. 			'menu_order'     => $post->menu_order
  54. 		);
  55.  
  56. 		/*
  57. 		 * insert the post by wp_insert_post() function
  58. 		 */
  59. 		$new_post_id = wp_insert_post( $args );
  60.  
  61. 		/*
  62. 		 * get all current post terms ad set them to the new post draft
  63. 		 */
  64. 		$taxonomies = get_object_taxonomies($post->post_type); 
  65. 		foreach ($taxonomies as $taxonomy) {
  66. 			$post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs'));
  67. 			wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false);
  68. 		}
  69.  
  70. 		/*
  71. 		 * duplicate all post meta just in two SQL queries
  72. 		 */
  73. 		$post_meta = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
  74. 		if (count($post_meta)!=0) {
  75. 			$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
  76. 			foreach ($post_meta as $meta_info) {
  77. 				$meta_key = $meta_info->meta_key;
  78. 				if( $meta_key == '_wp_old_slug' ) continue;
  79. 				$meta_value = addslashes($meta_info->meta_value);
  80. 				$sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'";
  81. 			}
  82. 			$sql_query.= implode(" UNION ALL ", $sql_query_sel);
  83. 			$wpdb->query($sql_query);
  84. 		}
  85.  
  86.  
  87. 		/*
  88. 		 * finally, redirect to the edit post screen for the new draft
  89. 		 */
  90. 		wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
  91. 		exit;
  92. 	} else {
  93. 		wp_die('Post creation failed, could not find original post: ' . $post_id);
  94. 	}
  95. }
  96. add_action( 'admin_action_duplicate_post_or_page', 'duplicate_post_or_page' );
也想出现在这里?联系我们
创客主机

上面的代码将创建一个具有相同内容(如标签、分类、自定义字段等)的文章。因此,将此代码添加到主题的 functions.php 文件中并保存。

添加链接

上面我们制作了复制 WordPress 文章或页面的功能,并将新文章作为具有相同数据的草稿。而下面的代码将在列表页面上一个新的动作,运行上面的功能。因此,在主题的 functions.php 文件中添加以下代码并保存。

  1. /*
  2.  * Add the duplicate link to the action list for post_row_actions
  3.  */
  4. function duplicate_post_link( $actions, $post ) {
  5. 	if (current_user_can('edit_posts')) {
  6. 		$actions['duplicate'] = '<a href="'%20.%20wp_nonce_url('admin.php?action=duplicate_post_or_page&post='%20.%20%24post->ID,%20basename(__FILE__),%20'duplicate_nonce'%20)%20.%20'" title="Duplicate this item" rel="permalink">Duplicate</a>';
  7. 	}
  8. 	return $actions;
  9. }
  10.  
  11. add_filter( 'post_row_actions', 'duplicate_post_link', 10, 2 );

在主题的 functions.php 文件中添加两个代码块后,您将在帖子列表页面上看到一个新的操作链接。标签将是 Duplicate,您可以更改为克隆或复制。

现在您可以通过单击复制操作链接来克隆您的 WordPress 文章。它将创建具有相同内容的新文章,并将您重定向到编辑帖子页面。您可以在此处发布或起草。

但是,如果您还想复制 WordPress 页面怎么办?

别担心!您不需要为此创建额外的功能。我们将使用与上述相同的功能,并将仅添加一个过滤器挂钩线来运行上述页面并显示页面的重复链接。
在页面列表添加复制链接

在添加了上面【 在文章列表添加复制链接 】的代码基础上,只需再将下面的代码添加到主题的 functions.php 文件中,就可以为页面显示相同的复制链接。

  1. add_filter('page_row_actions', 'duplicate_post_link', 10, 2);

效果如下所示:

在本教程中,我们介绍了使用插件或代码实现文章/页面一键复制的功能,希望对大家有所帮助。如果您有任何问题,请在下面评论。

通过代码给 WordPress 文章/页面添加一键复制功能

已有 422 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!