作为一个管理员、编辑甚至开发者,能够在你的网站上一键复制WordPress帖子、页面和其他帖子类型真的很有用。此外,你不应该每次都需要重新输入标签、类别、元字段和其他相关选项来发布。
在这篇博文中,我们将在你的网站上添加一个小的代码段,这样你将能够通过一次点击来复制任何帖子类型。这个方法适用于所有WordPress主题。
在每个帖子上添加一个链接按钮来复制它
要复制WordPress的帖子,首先让我们在每个帖子标题下添加一个链接按钮,这样当它被点击时,帖子就会被复制。
进入你的主题的function.php文件,在它的末尾添加以下代码。
add_filter( 'post_row_actions', 'jupiterx_add_duplicate_post_button', 10, 2 );
function jupiterx_add_duplicate_post_button( $actions, $post ) {
$args = [
'jupiterx-to-duplicate' => $post->ID,
'jupiterx-duplicate-posts' => wp_create_nonce( 'jupiterx-duplicate-nonce' ),
];
if ( 'post' !== $post->post_type ) {
$args['post_type'] = $post->post_type;
}
$url = add_query_arg( $args, admin_url( 'edit.php' ) );
$actions['duplicate_post'] = "<a href='{$url}'>Duplicate</a>";
return $actions;
}
通过添加这段代码,如果你导航到编辑帖子界面,你会在每个帖子下看到以下按钮。
如果你现在点击这个按钮,页面将简单地重新加载。
在下一节中,我们将为这个按钮添加功能,以便它能复制相关的帖子。
为按钮添加功能
点击按钮后,我们会得到帖子的信息,包括标签、类别、元字段和属于该帖子的其他一切。然后我们将使用这些信息创建一个新的帖子,完成这一过程。
在你的主题中的function.php文件末尾复制并添加以下代码,也就是你之前添加代码段的地方。
add_action( 'admin_init', 'jupiterx_create_duplicate_button_functionality' );
function jupiterx_create_duplicate_button_functionality() {
if ( ! isset( $_GET['jupiterx-duplicate-posts'] ) ) {
return;
}
check_ajax_referer( 'jupiterx-duplicate-nonce', 'jupiterx-duplicate-posts', true );
$post_id = absint( $_GET['jupiterx-to-duplicate'] );
$post = get_post( $post_id );
if ( ! $post ) {
wp_die( 'We could not find any post to duplicate it.' );
}
// Create post array exactly like post that was clicked.
$args = [
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
'post_author' => wp_get_current_user()->ID,
'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 . ' Duplicated',
'post_type' => $post->post_type,
'to_ping' => $post->to_ping,
'menu_order' => $post->menu_order
];
$duplicated_post = wp_insert_post( $args );
// Copy taxonomies.
$taxonomies = get_object_taxonomies( get_post_type( $post ) );
if( $taxonomies ) {
foreach ( $taxonomies as $taxonomy ) {
$post_terms = wp_get_object_terms( $post_id, $taxonomy, [ 'fields' => 'slugs' ] );
wp_set_object_terms( $duplicated_post, $post_terms, $taxonomy, false );
}
}
// Copy meta fields.
$post_meta = get_post_custom( $post_id );
if( $post_meta ) {
foreach ( $post_meta as $meta_key => $meta_values ) {
update_post_meta( $duplicated_post, $meta_key, $meta_values[0] );
}
}
$args = [];
if ( 'post' !== $post->post_type ) {
$args['post_type'] = $post->post_type;
}
$url = add_query_arg( $args, admin_url( 'edit.php' ) );
wp_safe_redirect( $url );
exit;
}
现在,如果你按下复制链接,相关的帖子将被复制,并在其标题上添加 “Duplicated “一词,这样你就会知道哪一个是原始帖子。
在下面的图片中,你可以看到帖子已经被复制了。
现在我们已经成功地为帖子添加了复制帖子的功能。但是,其他的帖子类型,如 “页面”‘、”产品 “等,又该如何处理?
让我们在第3步解决这个问题。
为任何帖子类型添加复制功能
要把这个功能添加到任何一种帖子类型中,你需要知道帖子类型的slug。例如,WooCommerce产品的帖子类型是 “product”。
在你了解了帖子类型的slug后,你需要将这行代码添加到你已经添加到function.php文件的第一个代码段中。
为了给帖子添加这个功能,我们添加了以下代码。
add_filter( 'post_row_actions', 'jupiterx_add_duplicate_post_button', 10, 2 );
为了将其添加到页面,我们只需要添加以下一行,因为我们已经知道页面的slug是 “page”。
add_filter( 'page_row_actions', 'jupiterx_add_duplicate_post_button', 10, 2 );
这样页面也拥有了复制的功能