如何不用插件複製WordPress的帖子、頁面和自定義帖子

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

這樣頁面也擁有了複製的功能

分享你的喜愛

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *