WordPressの管理画面で投稿(ページ)の表示件数はデフォルトで20件です。
一覧の設定(表示オプション)から件数を変更することができますが、変更はユーザーごと・各投稿タイプごとに保存されるため、全ユーザー&投稿タイプ一括で変更したい場合は手間がかかります。
そこで今回はadd_filter(‘edit_[post_type]_per_page’)を使って、管理画面の投稿表示件数の初期値を変更します。
結論のコードだけ見たい方はすべての投稿タイプで、ユーザーの設定値を確認して一括変更するコードへ
add_filter(‘edit_[post_type]_per_page’)を使ういろいろな方法とその問題
ユーザーの設定値が反映されない例
add_filter(‘edit_posts_per_page’)を使うとすべての投稿タイプの一覧表示件数を変更できますが、これを使って設定変更するとユーザーの設定値が何であってもPHPで指定した値でしか表示できません。
add_filter('edit_posts_per_page', function ($posts_per_page){return 100;});
ユーザーの設定値の有無を判定する(ただし投稿タイプが限定される)
get_user_option(‘edit_[post_type]_per_page’) でユーザーの設定値があるかどうかを確認すれば、ユーザーの設定値が存在しないときだけPHPで指定した値を適用することができます。
ただし、このままでは投稿タイプごとに edit_post_per_page , edit_page_per_page, … と何度も書かなければなりません。
add_filter('edit_post_per_page',function ($posts_per_page){
//ユーザーの設定値があるか確認
$n = (int)get_user_option('edit_post_per_page');
if(empty($n)||$n<1){
//ユーザー設定値がなければ50を返す
$posts_per_page = 50;
}
//ユーザーの設定値が存在するなら変更なし
return $posts_per_page;
});
参考:https://twitter.com/xakuro_com/status/1577599931493539840
すべての投稿タイプで、ユーザーの設定値を確認して一括変更するコード
「現在どの投稿タイプの一覧ページであるか」を確認し、edit_***_per_pageの*** に現在の投稿タイプslugが入るようにコードを変更します。
各投稿タイプの一覧ページを表示する際に以下のような処理を行います。
- 現在が管理画面の記事一覧ページだったら
- 現在の投稿タイプslugの確認
- 現在の投稿タイプにユーザーによる一覧表示件数設定あるかを確認
- ユーザーの設定値がなければ、指定した値を返す
add_action('admin_init', 'change_admin_post_per_page');
function change_admin_post_per_page(){
global $pagenow;
if (is_admin() && ($pagenow === 'edit.php')){
//現在が管理画面の記事一覧ページであれば、現在の投稿タイプを取得
$current_post_type = 'post';
if(!empty($_GET["post_type"])){
$current_post_type = $_GET["post_type"];
}
//add_filter('edit_[post_type]_per_page')を使う
add_filter('edit_'.$current_post_type.'_per_page',function ($posts_per_page) use ($current_post_type){
//ユーザーの設定値があるか確認
$n = (int)get_user_option('edit_'.$current_post_type.'_per_page');
if(empty($n)||$n<1){
//ユーザー設定値がなければ50を返す
$posts_per_page = 50;
}
//ユーザーの設定値が存在するなら変更なし
return $posts_per_page;
});
}
}
タクソノミー(カテゴリー)の一覧ページの件数も変更したい場合のコード
edit_posts_per_page を利用した場合タクソノミーの一覧ページの表示件数も変更されるので、edit_***_per_pageを使った方法でもタクソノミーも対象にしたいかもしれません。
その場合は以下のようになります。
add_action('admin_init', 'change_admin_post_per_page');
function change_admin_post_per_page(){
global $pagenow;
if (is_admin() && ($pagenow === 'edit.php' || $pagenow === 'edit-tags.php')) {
$current_page = 'post';
if(!empty($_GET["post_type"])){
$current_page = $_GET["post_type"];
}
if(!empty($_GET["taxonomy"])){
$current_page = $_GET["taxonomy"];
}
add_filter('edit_'.$current_page.'_per_page',function ($posts_per_page) use ($current_page){
$n = (int)get_user_option('edit_'.$current_page.'_per_page');
if(empty($n)||$n<1){
$posts_per_page = 50;
}
return $posts_per_page;
});
}
}
備考
- 2023/03
- コードを関数にしてadmin_initで実行するように変更しました。アドバイスありがとうございました!
コメント