カスタム投稿タイプの管理ページで実行されているクエリを変更しようとしています。このページは/wp-admin/edit.php?post_type=my_venueです。通常、私はis_admin() && is_post_type_archive('my_venue')
を使用して、クエリを変更する前に自分が正しいページにいるかどうかを確認します。ただし、投稿タイプを'archive' => false
に登録したので、is_post_type_archive()
は常にfalseを返します。
このページ専用のクエリを変更するための最良の方法は何ですか?
register_post_type(
'my_venue',
[
'has_archive' => false,
]
);
add_action('pre_get_posts', 'my_venue_filters');
function my_venue_filters($query) {
if (is_admin() && is_post_type_archive('my_venue')) {
if (!empty($_GET['my_venue_ids'])) {
$query->set('post__in', $_GET['my_venue_ids']);
}
}
}
/wp-admin/admin.php
ファイルに基づいて、3つの可能性があります。
利用可能なグローバル$pagenow
および$typenow
があります。
global $pagenow, $typenow;
if( 'my_venue' === $typenow && 'edit.php' === $pagenow )
{
// ...
}
それから現在のスクリーンがあり、これもset_current_screen()
でadmin.php
ファイルに設定されています。
$screen = get_current_screen();
if( is_a( $screen, '\WP_Screen') && 'edit-myvenue' === $screen->id );
{
// ...
}
\WP_Screen
オブジェクトのid
プロパティを使用します。
\WP_Screen
クラスを読み飛ばすと、代わりにcurrent_screen
フックが見つかります。
add_action( 'current_screen', function( \WP_Screen $s )
{
if( 'edit-myvenue' === $s->id )
{
// ...
}
} );
それからload-edit.php
フックがあります、それはpre_get_posts
フックの前に利用可能です:
add_action( 'load-edit.php', function()
{
// Check for the post type here.
} );
この場合、一般的なフックはload-$pagenow
です。ここでis_admin()
をチェックする必要はありません。
メインのクエリをターゲットにしている場合は、pre_get_posts
コールバック内に$query->is_main_query()
checkを追加する必要があります。
また、$_GET['my_venue_ids']
部分を検証することを忘れないでください。$_GET
配列にも存在しない可能性があります。
ここで新しい何もない!私たちは皆、これらの方法を何らかの方法で、WPSEに関する多くの質問と回答で使用しているのを見たことがあると思います;-)