作為一個管理員、編輯甚至開發者,能夠在你的網站上一鍵複製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 );
這樣頁面也擁有了複製的功能