- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
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
. 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.
paged=1
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.
Để nhận được bài viết mới vui lòng đăng ký kênh kiến thức WordPress từ A-Z ở Form bên dưới. Bạn cũng có thể nhận được sự trợ giúp trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype