Hàng loạt tùy chỉnh


17

Tôi muốn thêm một hành động hàng loạt tùy chỉnh vào một loại bài tùy chỉnh. Tôi đã đi qua bộ lọc bulk_actions-screenid, mà theo tài liệu của nó , sẽ làm chính xác như tôi muốn . Tuy nhiên, sau khoảng hai giờ gỡ lỗi, tôi đã tìm thấy nhận xét sau đây // This filter can currently only be used to remove actions.về dòng 278 của class-wp-list-table.php - thật tuyệt!

Tôi hình dung mình có thể hack nó bằng cách sử dụng jQuery để thực hiện hành động như một tùy chọn

/**
 * Hack to add a custom bulk action. 
 */
public function admin_footer() {
    if($_GET['post_type'] != self::POST_TYPE) return;
    ?> 
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
        });
    </script>
    <?php
}

Những công việc này. Các hành động bây giờ xuất hiện trong menu hành động hàng loạt. Tôi đã theo giả định sau đó tôi có thể thêm một số logic vào admin_initđể thực hiện xử lý cần thiết - tuy nhiên, có vẻ như nó create_invoicekhông bao giờ được đăng. Có điều gì đó tôi đang làm sai?

=== CẬP NHẬT ===

Tôi đã cập nhật mã để sử dụng load-*hook. Khi tôi áp dụng hành động hàng loạt trên users.php - tôi thấy create_invoiceđược chuyển qua yêu cầu. Tuy nhiên, trên edit.php create_invoicekhông bao giờ được in.

function a39x2_admin_footer() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action2']");
        });
    </script>
    <?php
}
add_action('admin_footer', 'a39x2_admin_footer');


function a39x2_load() {
    echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
}
add_action('load-edit.php', 'a39x2_load');
add_action('load-users.php', 'a39x2_load');

1
Có thể câu trả lời này sẽ giúp ai đó trong tương lai. Đây là một cách để làm điều đó: Thêm một hành động hàng loạt tùy chỉnh WordPress
Ayoub

Các liên kết trong bình luận trước đã thay đổi. Bạn vẫn có thể đọc bài viết ở đây .
thái

1
Có vẻ như điều này sẽ được sửa trong wordpress sớm. Vé core.trac.wordpress.org/ticket/16031 vừa đóng cửa vào cuối tháng 10/2016.
Denise Draper

Câu trả lời:


2

Tôi nghĩ rằng bản phát hành lớn mới nhất đảm bảo một câu trả lời mới cho câu hỏi này, xem xét mức độ phổ biến của câu hỏi này.

Kể từ WordPress 4.7 (phát hành tháng 12 năm 2016), có thể thêm các hành động hàng loạt tùy chỉnh mà không cần sử dụng JavaScript.

Bộ lọc bulk_actions-{$screen}(ví dụ: bulk_actions-edit-pagecho tổng quan về trang) hiện cho phép bạn thêm các hành động hàng loạt tùy chỉnh. Hơn nữa, một hành động mới gọi là handle_bulk_actions-{$screen}(ví dụ handle_bulk_actions-edit-page) cho phép bạn xử lý việc thực hiện hành động.

Điều này được giải thích khá tốt trong bài viết trên blog này . Ví dụ: giả sử chúng tôi muốn thêm một hành động hàng loạt để gửi email tiêu đề của các mục đã chọn trên tổng quan của trang. Chúng ta có thể làm như thế này:

Đối với một ví dụ nhỏ, trong đó chúng ta thêm một hành động vào danh sách thả xuống hàng loạt hành động và thêm chức năng xử lý cho nó.

Thêm hành động hàng loạt vào danh sách thả xuống:

function wpse29822_page_bulk_actions( $actions ) {
    // Add custom bulk action
    $actions['my-action-handle'] = __( 'My Custom Bulk Action' );
    return $actions;
}
add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' );

Thêm một trình xử lý cho hành động hàng loạt:

function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) {
    // Check whether action that user wants to perform is our custom action
    if ( $doaction == 'my-action-handle' ) {
        // Do stuff
    }
    return $redirect_to;
}
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );

Hành động xử lý này không làm việc cho tôi. Tôi đang sử dụng WordPress 4.7.2. Tôi sẽ đánh giá cao sự giúp đỡ nào về điều này. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak

Điều gì không hoạt động @MariaDanielDeepak? Nó hoạt động tốt trên 4.7.2 đối với tôi. Một số điều cần xem xét: (1) Cuộc gọi lại dành cho tổng quan về "Trang" trong quản trị viên (vì edit-pagephần này là id màn hình của nó) (2) Hành động sẽ không được thực hiện nếu không có trang nào được chọn (nghĩa là cố gắng thực hiện hành động hàng loạt trên một tập các trang trống)
engelen

Tôi đánh giá cao nhận xét của bạn. Tôi đã thêm lời giải thích đầy đủ về những gì không hoạt động trong diễn đàn WordPress .
Maria Daniel Deepak

9

Bộ bulk_actions-*lọc không cho phép bạn thêm các hành động hàng loạt tùy chỉnh một cách chính xác bởi vì thật khó để thêm trình xử lý cho hành động đó. Đã cập nhật Codex.

Tôi sẽ đề nghị sử dụng load-*hành động thay vì admin_init. Lưu ý rằng bạn phải thực hiện tất cả các kiểm tra bảo mật như check_ajax_Vferrer () và current_user_can ().


Cảm ơn! Các load-*móc dường như đang làm việc. Ngoài ra, cảm ơn bạn đã cập nhật codex và mở lại vé trac.
v0idless

1
Tôi có thể đã sớm chấp nhận câu trả lời. Tôi đã cập nhật mã để sử dụng load-*hook. Khi tôi áp dụng hành động hàng loạt trên users.php - tôi thấy create_invoiceđược chuyển qua yêu cầu. Tuy nhiên, trên edit.php create_invoicekhông bao giờ được in.
v0idless

Hãy thử thêm một exit;cuộc gọi sauecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu

1
Tôi nghĩ rằng có một móc hành động tốt hơn load-*: admin_action_*( admin_action_create_invoicetrong trường hợp của bạn). Nó được gọi ngay sau load-*hook và chỉ khi kích hoạt hành động hàng loạt tùy chỉnh.
Fabien Quatravaux

0

Bạn phải sử dụng bulk_actionscác bộ lọc khi WP_Screenđối tượng được xác định. như thế này:

add_action( 'current_screen', 'custom_bulk_actions' );
function custom_bulk_actions() {
    if( current_user_can( 'administrator' ) {
        add_filter( 'bulk_actions-edit-post'       , 'register_custom_bulk_actions' );
        add_filter( 'handle_bulk_actions-edit-post', 'custom_bulk_action_handler', 10, 3 );
        add_action( 'admin_notices'                , 'custom_bulk_action_admin_notice' );
    }
}    
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.