WordPress管理者リストテーブル:カスタムフィルターを追加
公開: 2021-02-26WordPress Adminのページと投稿に関するほとんどの情報は、テーブルにまとめられています。 WordPressを使用する人なら誰でもこれらに精通しているでしょう。 それらはうまく機能し、特定のページまたは投稿情報の「クイック編集」を実行したり、投稿またはページが公開された日付などを表示したりすることができます。 さらに、各テーブルの上部に表示されるドロップダウンメニューを選択して、これらのテーブルをフィルタリングできることに気付いたかもしれません。
ただし、フィルターはほんの一握りです。 では、管理者にフィルターボックスがない値をフィルター処理する場合はどうしますか? 幸い、WordPressでは独自のフィルターを追加できます。 その方法を見ていきます。
カスタムフィルターを使用する理由
では、WordPressでAdminテーブルを整理するためにカスタムフィルターが必要なのはなぜですか? 多数の投稿者と多数の投稿があるサイトがあると想像してみてください。
変更なしで、Adminテーブルから投稿の作成者を表示できます。 現在できないことは、投稿を作成者で並べ替えることです。 特定の作成者によって作成されたすべての投稿を簡単に表示できるようにする場合、これは明らかに重要な制限です。 すべての投稿者のドロップダウンメニューを表示して、リストから1つを選択できると便利です。 それは本当に物事をスピードアップすることができます。
これをどのように構築できるかを見てみましょう。
カスタムフィルターの作成
独自のフィルターを作成するために、WordPressにはrestrict_manage_posts
フックとpre_get_posts
フックが用意されています。
strict_manage_postsはwp-admin/includes/class-wp-posts-list-table.php
restrict_manage_posts
の557行目あたりに導入されており、管理テーブルリストの上に[フィルター]ボタンが作成される前に起動します。
カスタム関数を使用して、通常どおりrestrict_manage_posts
フックにリンクします(これについて詳しくは、こちらをご覧ください)。 アクティブなテーマのメインフォルダーに移動し、お気に入りのエディターでfunctions.php
ファイルを開きます。 ファイルの内容の最後に、以下のコードを挿入します。
function my_author_filter(){ $screen = get_current_screen(); global $post_type; if( $screen->id == 'edit-post' ){ $my_args = array( 'show_option_all' => 'All Authors', 'orderby' => 'display_name', 'order' => 'ASC', 'name' => 'authors_admin_filter', 'who' => 'authors', 'include_selected' => true ); if(isset($_GET['authors_admin_filter'])){ $my_args['selected'] = (int)sanitize_text_field($_GET['authors_admin_filter']); } wp_dropdown_users($my_args); } } add_action('restrict_manage_posts','my_author_filter');
使用した主な条件はif( $screen->id == 'edit-post')
です。 ここでは、現在の画面IDを返すget_current_screen()
WordPress関数を使用しました。
この場合、管理画面IDは「edit-post」です。 つまり、投稿管理画面が表示されていることを確認します。 たとえば、これを使用するページ管理画面に適用する場合はif( $screen->id == 'edit-page'
、またはカスタム投稿タイプで作業している場合、 edit-{post_type}
は次のようになります。正しいifステートメント。
注:各管理画面に対応するIDを確認するには、管理画面の参照に関する公式ドキュメントを確認してください。
以下のコードでは、作成者がすでに選択されているかどうかを確認し、選択されている場合は、選択した値を適用します。

if(isset($_GET['authors_admin_filter'])){ $my_args['selected'] = (int)sanitize_text_field($_GET['authors_admin_filter']); }
最後に、 wp_dropdown_users
WordPress関数を使用して、前に定義した引数に従って作成者のドロップダウンリストを生成します。
次に、 show_option_all
引数に「show-all」オプションを表示するテキストを選択しました。 「すべての作成者」の文字列を選択しました。 'name'引数に、ドロップダウンリストの目的の名前を入力します。 後でこの値を使用して、投稿リストの結果をフィルタリングします。

'who'引数では、クエリするユーザーのタイプ(この場合は'authors')を定義します。 'include_selected'引数を使用して、選択したユーザーIDをドロップダウンリストに含めるかどうかを選択します。
この時点で、管理者の投稿画面を更新すると、他の組み込みのフィルターメニューの横に作成者のドロップダウンメニューが表示されます。

値を選択して「フィルター」を押すと、ページのリロード時に値が選択されたままになりますが、結果は変更されません。 次のステップでは、投稿リストをフィルタリングして、選択した作成者にリンクされている投稿のみを表示するために必要な変更を加えます。
結果のフィルタリング
繰り返しになりますが、 pre_get_posts
フィルターが機能します。 このフックについては、WordPress Admin Search:ExtendingtheResultsの記事で確認しました。 実際のクエリを実行する前に、これを再度使用して、ポスト管理画面で作成されるクエリ変数オブジェクトを変更します。 functions.php
.phpに次の行を挿入します。
function my_author_filter_results($query){ $screen = get_current_screen(); global $post_type; if ( $screen->id == 'edit-post' ) { if(isset($_GET['authors_admin_filter'])){ $author_id = sanitize_text_field($_GET['authors_admin_filter']); if($author_id != 0){ $query->query_vars['author'] = $author_id; } } } } add_action('pre_get_posts','my_author_filter_results');
以前と同様に、主な条件は、管理者の投稿画面にいることを確認するためにここでも必要です。
$author_id = sanitize_text_field($_GET['authors_admin_filter']);
選択した作成者IDを$author_id
変数に保持します。 この後、作成者IDが0でない場合(すべての作成者が選択されている場合)、クエリの作成者パラメーターに$author_id
値を渡します。
以上です。 これで、表示される投稿は、選択した作成者/ユーザーIDに属する投稿のみになります。

結論
管理画面でのカスタムフィルタリングにより、管理者ユーザーがコンテンツを簡単に検索できるようになります。これは、投稿やページが多い場合に非常に役立ちます。 そしてもちろん、これはAdminテーブルでフィルターを使用する1つの可能な方法にすぎません。 便利な方法はたくさんあります。ここで概説した手法が、独自のフィルターの作成に役立つことを願っています。
たとえば、過去30日間に作成された投稿を表示するオプションを備えたドロップダウンフィルターメニューを作成したり、分類法で投稿を並べ替えるフィルターを作成したりできます。 query_varsリストは、可能なオプションをブレインストーミングするのに役立ちます。
この素晴らしい機能を楽しんでください!
関連項目
WordPress管理者リストテーブル:カスタムフィルターを追加
WordPressカスタムフィールド入門