WordPress:投稿一覧の「一括操作」に公開・非公開を切り替える項目を追加する方法

WordPress:投稿一覧の「一括操作」に公開・非公開を切り替える項目を追加する方法

管理画面の各種一覧ページにある「一括操作」内に独自の項目を追加する方法と項目選択時に行う処理を追加する方法の備忘録です。
ここでは投稿一覧の「一括操作」内に「公開・非公開切り替え」という項目を追加して、複数記事の投稿ステータスをまとめて公開・非公開切り替えできるようにします。

記事の投稿ステータスをまとめて行うこと自体はデフォルトでも「一括操作」内の「編集」を使えば可能で、具体的な手順としては下記になります。

  1. 対象の記事にチェックを入れる。
  2. 「一括操作」のドロップダウンから「編集」を選択
  3. ドロップダウン横の「適用」ボタンをクリック
  4. 一括編集項目が表示されるので、その中の「ステータス」内の項目を任意で選択
  5. 「更新」ボタンをクリック

このようにデフォルトの手順でもそこまで面倒とまではいかないですが、複数記事の投稿ステータスを頻繁に公開または非公開に切り替えるクライアントからもう少し楽できないかという要望があり、その際に行なったカスタマイズになります。

「一括操作」部分のカスタマイズは主に2種類のフィルターを使用し、ドロップダウンへの項目追加はbulk_actions-{$this->screen->id}を、追加項目選択時の処理はhandle_bulk_actions-{$screen}を使用します。
フィルター名にある{$this->screen->id}{$screen}にはそれぞれ適用したいスクリーンIDを指定し、今回は投稿一覧に適用するのでedit-postを指定します。

上記を踏まえ、実装にはfunctions.phpへ下記のように記述します。
コード下部のadmin_noticesは、記事ステータスが更新された際にページ上部に「○件の投稿ステータスを切り替えました。」というメッセージを表示させるための記述になります。

functions.php

add_filter( 'bulk_actions-edit-post', 'add_bulk_actions' );
function add_bulk_actions( $actions ) {
  $actions['switch_post_status'] = __( '公開・非公開切り替え' );
  return $actions;
}

add_filter( 'handle_bulk_actions-edit-post', 'add_bulk_action_handler', 10, 3 );
function add_bulk_action_handler( $redirect_url, $doaction, $post_ids ) {
  if ( $doaction !== 'switch_post_status' ) {
    return $redirect_url;
  }

  $redirect_url = remove_query_arg( 'switch_status', $redirect_url );

  if ( $doaction == 'switch_post_status' ) {
    $count = 0;
    foreach ( $post_ids as $post_id ) {
      $post_status = get_post_status( $post_id );
      if ( $post_status == 'publish' ) {
        wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );
        $count++;
      } elseif ( $post_status == 'private' ) {
        wp_update_post( array( 'ID' => $post_id, 'post_status' => 'publish' ) );
        $count++;
      }
    }
    if ( $count ) {
      $redirect_url = add_query_arg( 'switch_status', $count, $redirect_url );
    }
  }

  return $redirect_url;
}

add_action( 'admin_notices', 'add_bulk_action_notices' );
function add_bulk_action_notices() {
  if ( ! empty( $_REQUEST['switch_status'] ) ) {
    $notices_text = intval( $_REQUEST['switch_status'] ) . '件の投稿ステータスを切り替えました。';
    echo '<div class="updated notice is-dismissible"><p>' . $notices_text . '</p><button type="button" class="notice-dismiss"><span class="screen-reader-text">この通知を非表示にする</span></button></div>';
  }
}

記述後に投稿一覧の「一括操作」を確認すると「公開・非公開切り替え」という項目が新たに追加されており、対象記事にチェックした状態で実行すれば投稿ステータスが公開または非公開だった場合に投稿ステータスが切り替わる(公開だった場合は非公開に、非公開だった場合は公開に)のを確認できます。

先述したように、デフォルト機能で複数記事の投稿ステータスを切り替えたい場合は5手順で且つ公開・非公開それぞれで行う必要があったので合計10手順必要でしたが、これであれば「対象記事にチェック → ドロップダウンから「公開・非公開切り替え」を選択 → 「適用」ボタンをクリック」と3手順で複数記事の公開・非公開をまとめて切り替えることが可能になります。


今回は「一括操作」のカスタマイズを投稿一覧へ適用する形で紹介しましたが、フィルター名を変更すれば他の一覧にも適用させることができます。
他ページへ適用させるためのフィルター名については下記で紹介しています。

Close the search window,
please press close button or esc key.