TRANG CHỦ
TIN TỨC GIỚI THIỆU LIÊN HỆ TƯ VẤN GIẢI PHÁP
Wordpress 5 phút đọc

Sao chép bài viết trong WordPress không cần Plugin

Tối ưu quy trình quản trị: Sao chép bài viết WordPress không cần Plugin Trong môi trường quản trị WordPress, tính năng sao chép (duplicate) sản phẩm đã được WooCommerce tích hợp sẵn, giúp tiết kiệm đáng kể thời gian khi cần tạo các sản phẩm mới có cấu trúc tương đồng. Tuy nhiên, đối với các bài viết (posts) hoặc trang (pages) thông thường, WordPress không hỗ trợ sẵn chức năng này. Thay vì cài đặt thêm các plugin cồng...

Biên tập Cao Văn Lương
Sao chép bài viết trong WordPress không cần Plugin

Tối ưu quy trình quản trị: Sao chép bài viết WordPress không cần Plugin

Trong môi trường quản trị WordPress, tính năng sao chép (duplicate) sản phẩm đã được WooCommerce tích hợp sẵn, giúp tiết kiệm đáng kể thời gian khi cần tạo các sản phẩm mới có cấu trúc tương đồng. Tuy nhiên, đối với các bài viết (posts) hoặc trang (pages) thông thường, WordPress không hỗ trợ sẵn chức năng này. Thay vì cài đặt thêm các plugin cồng kềnh làm ảnh hưởng đến hiệu năng website, bạn hoàn toàn có thể tự triển khai tính năng này bằng cách can thiệp trực tiếp vào file functions.php.

Bài viết này, STAR WAR Digital Solutions sẽ hướng dẫn bạn cách tùy biến mã nguồn để thêm nút "Sao chép" vào bảng quản trị một cách chuyên nghiệp và tối ưu nhất.

Bước 1: Thêm nút "Sao chép" vào danh sách bài viết

Để thêm tùy chọn "Sao chép" vào các hành động (actions) như Sửa, Xóa, Xem, bạn hãy mở file functions.php trong theme đang sử dụng và thêm đoạn mã sau vào cuối tệp:

add_filter( 'post_row_actions', 'duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'duplicate_post_link', 10, 2 );

function duplicate_post_link( $actions, $post ) {
   if( ! current_user_can( 'edit_posts' )) {
         return $actions;
   }
   $url = wp_nonce_url(
         add_query_arg(
               array(
                    'action' => 'duplicate_post_as_draft',
                    'post' => $post->ID,
               ),
               'admin.php'
        ),basename(__FILE__),
        'duplicate_nonce'
   );

   $actions[ 'duplicate' ] = '<a href="' . $url . '" title="Sao chép bài viết" rel="permalink">Sao chép</a>';
   return $actions;
}

Bước 2: Xử lý logic sao chép dữ liệu

Sau khi đã có nút bấm, chúng ta cần định nghĩa hàm thực thi việc sao chép nội dung, bao gồm cả các thông số meta và taxonomy (danh mục, thẻ). Tiếp tục dán đoạn mã này ngay bên dưới đoạn mã ở Bước 1:

add_action( 'admin_action_duplicate_post_as_draft', 'duplicate_post_as_draft' );
function duplicate_post_as_draft(){
     if ( empty( $_GET[ 'post' ] ) ) {
          wp_die( 'Không tìm thấy bài viết để sao chép.' );
     }
     if ( ! isset( $_GET[ 'duplicate_nonce' ] ) || ! wp_verify_nonce( $_GET[ 'duplicate_nonce' ], basename( __FILE__ ) ) ) {
          return;
     }
     $post_id = absint( $_GET[ 'post' ] );
     $post = get_post( $post_id );
     $current_user = wp_get_current_user();
     $new_post_author = $current_user->ID;

     if ( $post ) {
        $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_status' => 'draft',
            'post_title' => $post->post_title.' - Bản Sao',
            'post_type' => $post->post_type
        );
        $new_post_id = wp_insert_post( $args );
        $taxonomies = get_object_taxonomies( get_post_type( $post ) );
        if( $taxonomies ) {
            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 );
            }
        }

        $post_meta = get_post_meta( $post_id );
        if( $post_meta ) {
           foreach ( $post_meta as $meta_key => $meta_values ) {
           if( '_wp_old_slug' == $meta_key ) continue;
           foreach ( $meta_values as $meta_value ) {
                 add_post_meta( $new_post_id, $meta_key, $meta_value );
           }
        }
     }

     wp_safe_redirect(
         add_query_arg(
              array(
                  'post_type' => ( 'post' !== get_post_type( $post ) ? get_post_type( $post ) : false ),
                  'saved' => 'post_duplication_created'
              ),
              admin_url( 'edit.php' )
          )
     );
     exit;
   } else {
       wp_die( 'Lỗi: Không thể tìm thấy bài viết gốc.' );
   }
}

Bước 3: Hiển thị thông báo xác nhận

Để trải nghiệm quản trị chuyên nghiệp hơn, bạn nên thêm một thông báo xác nhận khi quá trình sao chép hoàn tất:

add_action( 'admin_notices', 'post_duplication_admin_notice' );
function post_duplication_admin_notice() {
     $screen = get_current_screen();
     if ( 'edit' !== $screen->base ) return;
     if ( isset( $_GET[ 'saved' ] ) && 'post_duplication_created' == $_GET[ 'saved' ] ) {
        echo '<div class="notice notice-success is-dismissible"><p>Bài viết đã được sao chép thành công.</p></div>';
     }
}

Lời kết

Việc tối ưu hóa các tính năng bằng code thuần giúp website của bạn nhẹ hơn, giảm thiểu xung đột plugin và tăng cường tính bảo mật. Tại STAR WAR Digital Solutions, chúng tôi luôn ưu tiên các giải pháp kỹ thuật tinh gọn để tối đa hóa hiệu suất vận hành cho doanh nghiệp. Nếu bạn cần tư vấn thêm về giải pháp tùy biến WordPress chuyên sâu, hãy liên hệ với đội ngũ kỹ thuật của chúng tôi để được hỗ trợ.

STAR WAR DIGITAL SOLUTIONS

STAR WAR sẵn sàng đồng hành cùng doanh nghiệp

Thiết kế website chuyên nghiệp, ERP theo ngành và giải pháp số theo nhu cầu thực tế.

Đội ngũ STAR WAR tư vấn cấu trúc, giao diện và phương án triển khai phù hợp với mục tiêu kinh doanh của từng doanh nghiệp.