カスタムbulk_action


17

カスタムバルクアクションをカスタム投稿タイプに追加したいと思います。フィルターbulk_actions-screenidに出くわしました。その文書によれば、希望通りにできます。しかし、約2時間のデバッグの後// This filter can currently only be used to remove actions.、class-wp-list-table.phpの278行に次のコメントが見つかりました-すばらしい!

jQueryを使用してオプションとしてアクションを挿入することでハッキングできると考えました

/**
 * 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
}

これは動作します。これで、アクションが一括アクションメニューに表示されます。admin_init必要な処理を実行するためにロジックを追加できると仮定していましたが、create_invoice決して投稿されていないようです。私が間違っていることはありますか?

===更新===

load-*フックを使用するようにコードを更新しました。users.phpに一括アクションを適用create_invoiceすると、リクエストが通過します。ただし、edit.php create_invoiceでは印刷されません。

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
この答えが将来誰かを助けるかもしれません。これを行う方法を次に示します。WordPressカスタムバルクアクションを追加する
-Ayoub

前のコメントのリンクが変更されました。あなたはまだここで記事を読むことができます
形態的

1
これはワードプレスで間もなく修正されるようです。チケットcore.trac.wordpress.org/ticket/16031は、16年10月末に閉鎖されました。
デニスドレイパー

回答:


2

最新のメジャーリリースでは、この質問の人気を考慮して、この質問に対する新しい回答が必要だと思います。

WordPress 4.7(2016年12月リリース)以降、JavaScriptを使用せずにカスタムバルクアクションを追加することが可能です。

フィルタbulk_actions-{$screen}bulk_actions-edit-pageページの概要など)で、カスタムバルクアクションを追加できるようになりました。さらに、handle_bulk_actions-{$screen}(たとえばhandle_bulk_actions-edit-page)という新しいアクションを使用すると、アクションの実行を処理できます。

これはすべて、このブログ投稿でかなりよく説明されています。たとえば、ページの概要で選択したアイテムのタイトルをメールで送信する一括アクションを追加するとします。次のようにできます。

バルクアクションドロップダウンにアクションを追加し、それにハンドラー関数を追加する小さな例の場合。

一括操作をドロップダウンに追加します。

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' );

一括アクションのハンドラーを追加します。

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 );

このハンドラーアクションは私には機能しません。WordPress 4.7.2を使用しています。これについて何か助けていただければ幸いです。 add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
マリアダニエルディーパック

@MariaDanielDeepakが機能しないのは何ですか?私にとっては4.7.2で問題なく動作しています。考慮すべきいくつかの事項:(1)コールバックは管理edit-page画面の「ページ」の概要用です(一部は画面IDです)(2)ページが選択されていない場合、アクションは実行されません(つまり、ページの空のセットに一括アクション)
engelen

コメントありがとうございます。WordPress フォーラムで機能していないものの完全な説明を追加しました。
マリアダニエルディーパック

9

このbulk_actions-*アクションのハンドラーを追加するのは難しいため、このフィルターではカスタムバルクアクションを追加できません。コーデックスを更新しました。

load-*代わりにアクションを使用することをお勧めしadmin_initます。check_ajax_referrer()やcurrent_user_can()などのすべてのセキュリティチェックを行う必要があることに注意してください。


ありがとう!load-*フックが働いているように見えます。また、コーデックスを更新し、tracチケットを再度開いてくれてありがとう。
v0idless

1
私は時期尚早に答えを受け入れたかもしれません。load-*フックを使用するようにコードを更新しました。users.phpに一括アクションを適用create_invoiceすると、リクエストが通過します。ただし、edit.php create_invoiceでは印刷されません。
v0idless

exit;echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu

1
私はより良いアクションフックがあると思いよりload-*admin_action_*admin_action_create_invoiceあなたのケースでは)。load-*フックの直後に、カスタムバルクアクションがトリガーされたときにのみ呼び出されます。
ファビアンクアトラヴォー14

0

オブジェクトが定義されているbulk_actions場合、フィルターを使用する必要がありますWP_Screen。このような:

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' );
    }
}    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.