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

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

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

给TA打赏
共{{data.count}}人
人已打赏
WordPress教程

给WooCommerce的运费(Shipping Method)增加自定义描述字段

2022-4-8 11:01:21

WordPress教程

使用WP Super Cache予取予求地刷新指定页面静态缓存

2022-4-8 14:00:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索