WordPress教程

WordPress后台开发,无插件增加一键复制文章页面功能

阿里云

这次要实现的功能是在 WordPress 后台的文章列表中,添加一键复制文章的按钮。完整地复制一篇文章,除了要复制文章内容外,还要复制文章所有的分类信息和关联字段,这是复制功能的核心。另外要实现这个功能还要带上一些后台的交互,为了避免不小心点到这个按钮徒增不必要的数据,还需要做个二次确认框,效果是这样的。

先要通过 post_row_actions 钩子增加一个”Duplicate”按钮(其实是个链接)

  1. function brain1981_duplicate_post_link( $actions, $post ) {
  2. 	if (current_user_can('edit_posts')) {
  3. 		$actions['duplicate'] = '<a href="###" data-url="'. wp_nonce_url('admin.php?action=brain1981_duplicate_post&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate it" rel="permalink" class="duplicate-trigger">Duplicate</a>';
  4. 	}
  5. 	return $actions;
  6. }
  7. add_filter('post_row_actions', 'brain1981_duplicate_post_link', 30, 2 );
也想出现在这里?联系我们
创客主机

点击这个按钮弹出确认框,用 JS 实现,代码通过 admin_footer 钩子插入。

  1. function brain1981_add_duplicate_script() {
  2. 	$screen = get_current_screen();
  3. 	$parent_base = $screen->parent_base;
  4. 	if ( $parent_base=='edit' ) {
  5. 		echo '<script>jQuery(function(){jQuery(".duplicate-trigger").on("click",function(){ var url=jQuery(this).data("url"); if(window.confirm("duplicate it?")) location.href=url; })})</script>';
  6. 	}
  7. }
  8. add_filter('admin_footer', 'brain1981_add_duplicate_script');

接下来就是核心,复制文章和所有的字段、分类信息

  1. function brain1981_duplicate_post(){
  2. 	global $wpdb;
  3. 	if ( !( isset($_REQUEST['post']) && isset($_REQUEST['action']) && $_REQUEST['action']=='brain1981_duplicate_post' ) ) {
  4. 		wp_die('Error!');
  5. 	}
  6.  
  7. 	//secure check
  8. 	if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) )
  9. 		return;
  10.  
  11. 	//需要复制的文章
  12. 	$post_id = absint( $_REQUEST['post'] );
  13. 	$post = get_post( $post_id );
  14.  
  15. 	//指派作者为当前复制者
  16. 	$current_user = wp_get_current_user();
  17. 	$post_author = $current_user->ID;
  18.  
  19. 	//不改变作者
  20. 	$post_author=$post->post_author;
  21.  
  22. 	if (isset( $post ) && $post != null) {
  23. 		//建立文章数据
  24. 		$args = array(
  25. 			'ping_status'    => $post->ping_status,
  26. 			'post_author'    => $post_author,
  27. 			'post_content'   => $post->post_content,
  28. 			'post_excerpt'   => $post->post_excerpt,
  29. 			'post_name'      => $post->post_name,
  30. 			'post_parent'    => $post->post_parent,
  31. 			'post_password'  => $post->post_password,
  32. 			'post_title'     => $post->post_title,
  33. 			'post_type'      => $post->post_type,
  34. 			'to_ping'        => $post->to_ping,
  35. 			'menu_order'     => $post->menu_order,
  36. 			'comment_status' => $post->comment_status,
  37. 			'post_status'    => 'draft'
  38. 		);
  39. 		//建立文章
  40. 		$new_post_id = wp_insert_post( $args ); 
  41.  
  42. 		//复制文章分类数据
  43. 		$taxonomyArr = get_object_taxonomies($post->post_type);
  44. 		foreach ($taxonomyArr as $taxonomy) {
  45. 			$post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs'));
  46. 			wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false);
  47. 		}
  48.  
  49. 		//SQL查询复制文章自定义字段CPM
  50. 		$post_meta_data = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
  51. 		if (count($post_meta_data)!=0) {
  52. 			$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
  53. 			foreach ($post_meta_data as $meta_info) {
  54. 				$meta_key = $meta_info->meta_key;
  55. 				if( $meta_key == '_wp_old_slug' ) continue;
  56. 				$meta_value = addslashes($meta_info->meta_value);
  57. 				$sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'";
  58. 			}
  59. 			$sql_query.= implode(" UNION ALL ", $sql_query_sel);
  60. 			$wpdb->query($sql_query);
  61. 		}
  62.  
  63. 		//如果有必要,可在复制完成后直接跳转到新的post编辑页面
  64. 		wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
  65. 		exit;
  66. 	} else {
  67. 		wp_die('Can not find the original post: ' . $post_id);
  68. 	}
  69. }
  70. add_action( 'admin_action_brain1981_duplicate_post', 'brain1981_duplicate_post' );

这样整个功能就完成了,不过目前只能复制文章和自定义文章,如果需要在页面列表也实现同样功能,再增加这个钩子即可:

  1. add_filter('page_row_actions', 'brain1981_duplicate_post_link', 30, 2);

WordPress 后台开发,无插件增加一键复制文章页面功能

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

收藏
(0)

发表回复

热销模板

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

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