web-dev-qa-db-ja.com

管理領域でカスタム投稿タイプのアーカイブを使用しているかどうかを確認する方法

カスタム投稿タイプの管理ページで実行されているクエリを変更しようとしています。このページは/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']);
        }
    }
}
2
joeljoeljoel

/wp-admin/admin.phpファイルに基づいて、3つの可能性があります。

方法1

利用可能なグローバル$pagenowおよび$typenowがあります。

    global $pagenow, $typenow;
    if( 'my_venue' === $typenow && 'edit.php' === $pagenow )
    {
        // ...
    }

方法2

それから現在のスクリーンがあり、これも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 )
    {
        // ...
    }
} );

方法3

それから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に関する多くの質問と回答で使用しているのを見たことがあると思います;-)

3
birgire