使用wordpress建站的朋友很多,需求也是各不相同,有些人每天发布的内容不一样,这比较正常,但是有些人每天可能发布的内容基本一致,修改的地方不会很多,那么就会存在每天重复做一件事情的麻烦情况,虽然我们可以通过复制黏贴内容来解决这种需求,但是更加效率的方法才是真的解决方式。
那么如何直接一键复制文章内容,包括标签分类这些呢?下面推荐两种,一种是通过插件解决,另外一种则是通过代码。
yoast duplicate post插件实现
简单的搜索了一下,相关插件还是挺多的,但是比较有名的就是一款名为:yoast duplicate post的插件,插件方面支持中文,设定方面也是非常丰富,下面是几张相关截图:
使用起来也是非常方便的,直接点击按钮即可跳转到相对应的页面了。
插件地址:https://wordpress.org/plugins/duplicate-post/
自定义代码实现
/* * function for post duplication. dups appear as drafts. user is redirected to the edit screen */ function rd_duplicate_post_as_draft() { global $wpdb; if ( ! ( isset( $_get['post'] ) || isset( $_post['post'] ) || ( isset( $_request['action'] ) && 'rd_duplicate_post_as_draft' == $_request['action'] ) ) ) { wp_die( 'no post to duplicate has been supplied!' ); } /* * nonce verification */ if ( ! isset( $_get['duplicate_nonce'] ) || ! wp_verify_nonce( $_get['duplicate_nonce'], basename( __file__ ) ) ) { return; } //获取文章id $post_id = ( isset( $_get['post'] ) ? absint( $_get['post'] ) : absint( $_post['post'] ) ); $post = get_post( $post_id ); //修改文章作者为当前用户 //如果你希望复制之后的文章作者依然为原始文章的作者 //请将$new_post_author = $current_user->id;修改为$new_post_author = $post->post_author;即可 $current_user = wp_get_current_user(); $new_post_author = $current_user->id; //判断文章需要复制的文章是否存在 if ( isset( $post ) && $post != null ) { //文章数据 $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, ); //插入文章 $new_post_id = wp_insert_post( $args ); //获取原始文章关联信息并且插入新的文章内 $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 ); } //通过两条sql语句来更新新文章的postmeta $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; if ( $meta_key === '_wp_old_slug' ) { continue; } $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 ); } //跳转到新文章页面 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_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' ); //后台文章列表页面文章栏目添加对应的按钮 function rd_duplicate_post_link( $actions, $post ) { if ( current_user_can( 'edit_posts' ) ) { $actions['duplicate'] = '<a href="' . wp_nonce_url( 'admin.php?action=rd_duplicate_post_as_draft&post=' . $post->id, basename( __file__ ), 'duplicate_nonce' ) . '" title="duplicate this item" rel="permalink">duplicate</a>'; } return $actions; } add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 ); |
上面的代码来源: https://www.hostinger.com/tutorials/how-to-duplicate-wordpress-page-or-post
整体代码看似比较复杂,但是好在逻辑还是比较清晰的,相关的说明我已经在代码中进行了标注,帮助大家简单的理解每个部分的内容是用来做什么的。
总结
整体来说,插件的功能更加丰富,可能代码方面更加全面,使用或者后期维护成本比较低;代码方式则是满足那些不喜欢装插件的朋友后。不过如果你能理解代码版本的含义,那么基于这个版本进行扩展,可能就是多了几个判断,额外增加一些内容的检测而已,有动手能力的朋友推荐代码方式,提高自己的技术。如果懒得折腾,插件则会更加高效、方便、省事。