web-dev-qa-db-ja.com

カスタムbulk_action

カスタム投稿タイプにカスタム一括アクションを追加したいです。私はフィルタbulk_actions-screenidに出くわしました、 その ドキュメンテーション に従って、私が望むように正確にやるでしょう。しかし、約2時間のデバッグの後、class-wp-list-table.phpの278行目に次のコメント// This filter can currently only be used to remove actions.が見つかりました。

私はオプションとしてアクションを注入するために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');
17
v0idless

この質問の人気を考えれば、最新のメジャーリリースでこの質問に対する新しい答えが正当化されると思います。

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

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

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

9
scribu

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' );
    }
}    
0
Themesfa