使用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

整体代码看似比较复杂,但是好在逻辑还是比较清晰的,相关的说明我已经在代码中进行了标注,帮助大家简单的理解每个部分的内容是用来做什么的。

总结

整体来说,插件的功能更加丰富,可能代码方面更加全面,使用或者后期维护成本比较低;代码方式则是满足那些不喜欢装插件的朋友后。不过如果你能理解代码版本的含义,那么基于这个版本进行扩展,可能就是多了几个判断,额外增加一些内容的检测而已,有动手能力的朋友推荐代码方式,提高自己的技术。如果懒得折腾,插件则会更加高效、方便、省事。