Home WordpressWordPress cơ bản Thêm Bulk Action trên trang quản lý bài viết WordPress

Thêm Bulk Action trên trang quản lý bài viết WordPress

by admincp

Trong phiên bản 4.6 bạn có thể khó khăn khi thêm bulk action sủ dụng trong trang WordPress admin. Từ phiên bản 4.7 trở đi wordpress có thêm hook để giúp developer lập trình wordpress dễ dàng hơn :

add_action('bulk_actions-{screen_id}', 'my_bulk_action');

Ví dụ, mình sẽ sử dụng cho post & page , các biến được đặt tên tương ứng.

add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' );

Thêm bulk action trên trang quản lý bài đăng WordPress

Tạo hook

function register_my_bulk_actions($bulk_actions) {
  $bulk_actions['my_bulk_action'] = __( 'My Bulk Action', 'domain');
  $bulk_actions['my_other_bulk_action'] = __( 'My Other Bulk Action', 'domain');
  return $bulk_actions;
}

Bạn có thể thêm 1 hay nhiều hơn một tác vụ hàng loạt trong hàm này, bạn chỉ cần bổ sung thêm vào mảng $bulk_actions.

Screen Ids

Bạn có thể tìm screen Id của trang admin bằng đoạn mã này:

$screen = get_current_screen();
var_dump($screen);

Bảng sau đây sẽ liệt kê id của một số trang trong quản trị:

Media Library upload
Comments chỉnh sửa-comments
Tags chỉnh sửa-post_tag
Plugins plugins
Liên kết Liên kết-manager
Người dùng người dùng
Bài viết chỉnh sửa-bài đăng
Trang chỉnh sửa trang
Chỉnh sửa trang web: Themes trang web chủ đề mạng
Themes themes mạng
Người dùng người dùng mạng
Chỉnh sửa trang web: Người dùng trang web sử dụng mạng
Sites trang web mạng

Tạo hàm callback

Tham khảo đoạn code dưới đây:

add_filter( 'handle_bulk_actions-edit-post', 'my_bulk_action_handler', 10, 3 );
function my_bulk_action_handler( $redirect_to, $action_name, $post_ids ) { 
  if ( 'my_bulk_action' === $action_name ) { 
    foreach ( $post_ids as $post_id ) { 
      $post = get_post($post_id); 
      // process $post wp_update_post($post); 
    } 
    $redirect_to = add_query_arg( 'bulk_posts_processed', count( $post_ids ), $redirect_to ); 
    return $redirect_to; 
  } 
  elseif ( 'my_other_bulk_action' === $action_name ) { 
    foreach ( $post_ids as $post_id ) { 
      $post_meta = get_post_meta( $post_id ); 
      // process $post_meta update_post_meta( $post_meta ); 
    } 
    $redirect_to = add_query_arg( 'other_bulk_posts_precessed', count( $post_ids ), $redirect_to );
    return $redirect_to; 
  } 
  
  else 
    return $redirect_to; }

Như đã đề cập ở trên, bạn có thể tạo thêm nhiều hành động nhưng chỉ có 1 hàm sử lý chung duy nhất. Vì vậy, trước tiên bạn cần phải kiểm tra tác vụ nào đã được chọn (dòng 4 và 13).

Tiếp theo, các posts được xử lý trong vòng lặp foreach (dòng 5 và 14). Trong đó bạn có thể nạp các bài đăng với hàm get_post hoặc post meta với get_post_meta() và xử lý dữ liệu. Các dữ liệu thay đổi sẽ được cập nhật lại trong  cơ sở dữ liệu với wp_update_post() hoặc update_post_meta() .

Biến $redirect_to được sử dụng để xác định URL trình duyệt sẽ chuyển hướng sau khi bulk action được hoàn thành, trong trường hợp của chúng ta là .../wp-admin/edit.php
paged=1
. Mình không muốn thay đổi vị trí nhưng để sử dụng biến và truyền một giá trị cho các trang được chuyển hướng đến.
Với hàm add_query_arg() chúng ta sẽ thêm 1 tham số cho URL để quy định số lượng bài viết cần xử lý: /wp-admin/edit.php
paged=1&bulk_posts_processed=1
.

Hiển thị thông báo thành công

Sau khi hoàn thành xử lý tất cả các bài đăng, lúc này bạn có thể hiển thị một thông báo trên trang quản trị bằng cách sử dụng admin_notices() . Tham số thứ hai chứa chuỗi văn bản mà chúng ta đã xác định trong bộ lọc bulk_actions-{screen-id} :

function my_bulk_action_admin_notice() { 
  if ( ! empty( $_REQUEST['bulk_posts_processed'] ) ) { 
    $posts_count = intval( $_REQUEST['bulk_posts_processed'] ); 
	printf( '' . _n( 'Processed %s post.', 'Processed %s posts.', $posts_count, 'domain' ) . ' ', $posts_count ); 
  }
}

Chúc các bạn thành công.

Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ với bạn bè bằng cách nhấn nút chia sẻ ở bên dưới. Theo dõi chúng tôi trên TwitterFacebook

You may also like

Leave a Comment