
WordPressの一括処理をカスタマイズする方法
WordPress管理画面の投稿一覧にある「一括処理」をカスタマイズして、新しい独自の処理を追加する方法をまとめます。
フィルターフックに処理を追加し、以下の流れの処理を追加します。
- 投稿一覧の一括処理プルダウンに項目を追加
- 適応ボタンを押下した際に処理を実行
- 一括処理実行結果の通知メッセージを表示
順番に見ていきます。
一括処理のプルダウンに項目を追加
functions.php に以下のコードを追加します。すると投稿一覧の一括処理項目に 一括処理のテスト という選択肢が追加されます。
// 一括処理プルダウン項目追加
add_filter( 'bulk_actions-edit-post', function( $actions ) {
$actions += array( 'bulk_test' => '一括処理のテスト' );
return $actions;
} );
bulk_actions-{screen_id}
をフックすることで一括処理項目をカスタマイズできます。{screen_id} は管理画面のIDで、今回は投稿一覧画面をカスタマイズするので、bulk_actions-edit-post
をフックします。
引数の $actions
が、プルダウンの項目に当たる連想配列です。詳細は以下のページにあります。
一括処理の作成
一括処理はフィルターフック(handle_bulk_actions-{screen_id}
) でカスタマイズできます。次のコードを functions.php に追加します。
// 一括処理部分
add_filter( 'handle_bulk_actions-edit-post', function( $redirect_to, $doaction, $post_ids ) {
// カスタマイズする処理以外の場合はそのまま返す
if ( $doaction !== 'bulk_test' ) {
return $redirect_to;
}
// チェックされた一括処理対象記事のループ
foreach ( $post_ids as $post_id ) {
//ここで任意の処理を実行
}
// リダイレクト先のURLを設定
$redirect_to = add_query_arg( 'bulk_test_count', count( $post_ids ), $redirect_to );
return $redirect_to;
}, 10, 3 );
$doaction
が一括処理のキーです。上で設定したプルダウンの連想配列のキー値がここに来ます。カスタマイズで追加したキーに一致する場合の処理を追加します。それ以外の場合は何もしません。
$post_ids
は、一括処理対象として選択された記事のIDです。ループして処理するなり、任意の処理を実行しましょう。
$redirect_to
は、処理の後にリダイレクトするURLです。ここでは処理件数をクエリ文字列のパラメータに設定しています。こうすることで、後述の通知メッセージ表示時に利用します。
戻り値として、リダイレクト先のURLを設定します。
一括処理実行結果の通知メッセージを表示
ここまでで、一括処理自体は完成していますが、処理結果をメッセージで表示したほうが良いでしょう。例えば記事の一括編集では、「xx件の投稿を更新しました。」という通知が表示されます。同じように更新処理結果を表示するようにしてみます。
実行結果の通知はフィルターフック(admin_notices
) でカスタマイズできます。次のコードを functions.php に追加します。
// 一括処理結果通知
add_action( 'admin_notices', function () {
if ( ! empty( $_REQUEST['bulk_test_count'] ) ) {
$cleared_count = intval( $_REQUEST['bulk_test_count'] );
echo "<div id='message' class='updated fade'>{$cleared_count}件のデータを一括処理しました。</div>";
}
} );
任意のクエリ文字列が設定されている場合のみ、表示用のdivタグを出力します。一括処理のリダイレクト先を指定する際に追加したクエリ文字列を判定に使うことで、処理結果(ここでは処理件数)を通知可能です。
処理結果は次のように表示されます。
まとめ
functions.php で各種フィルターフックにカスタマイズの処理を追加することで、一括処理を作成できました。
// 一括処理項目追加
add_filter( 'bulk_actions-edit-post', function( $actions ) {
$actions += array( 'bulk_test' => '一括処理のテスト' );
return $actions;
} );
// 一括処理部分
add_filter( 'handle_bulk_actions-edit-post', function( $redirect_to, $doaction, $post_ids ) {
// カスタマイズする処理以外の場合はそのまま返す
if ( $doaction !== 'bulk_test' ) {
return $redirect_to;
}
// チェックされた一括処理対象記事のループ
foreach ( $post_ids as $post_id ) {
//ここで任意の処理を実行
}
// リダイレクト先のURLを設定
$redirect_to = add_query_arg( 'bulk_test_count', count( $post_ids ), $redirect_to );
return $redirect_to;
}, 10, 3 );
// 一括処理結果通知
add_action( 'admin_notices', function () {
if ( ! empty( $_REQUEST['bulk_test_count'] ) ) {
$cleared_count = intval( $_REQUEST['bulk_test_count'] );
echo "<div id='message' class='updated fade'>{$cleared_count}件のデータを一括処理しました。</div>";
}
} );
以上。