web-dev-qa-db-fra.com

Comment vérifier si je suis sur une archive de type publication personnalisée dans la zone d'administration

J'essaie de modifier la requête exécutée sur la page d'administration de mon type de publication personnalisée. Cette page: /wp-admin/edit.php?post_type=my_venue. En règle générale, je voudrais utiliser is_admin() && is_post_type_archive('my_venue') pour vérifier si je suis sur la bonne page avant de modifier la requête. Cependant, j'ai enregistré mon type de message avec 'archive' => false, donc maintenant is_post_type_archive() renvoie toujours false.

Quel est le meilleur moyen de modifier la requête uniquement pour cette page?

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

Voici trois possibilités, basées sur le fichier /wp-admin/admin.php:

Méthode n ° 1

Les $pagenow et $typenow globaux sont disponibles:

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

Méthode n ° 2

Ensuite, il y a l'écran actuel, également défini dans le fichier admin.php avec set_current_screen();

    $screen = get_current_screen();
    if( is_a( $screen, '\WP_Screen') && 'edit-myvenue' === $screen->id );
    {
        // ...
    }

où nous utilisons la propriété id de l'objet \WP_Screen.

Si nous parcourons la classe \WP_Screen, nous trouvons le hook current_screen, qui pourrait être utilisé à la place:

add_action( 'current_screen', function( \WP_Screen $s )
{
    if( 'edit-myvenue' === $s->id )
    {
        // ...
    }
} );

Méthode n ° 3

Ensuite, il y a le hook load-edit.php, disponible avant le hook pre_get_posts:

add_action( 'load-edit.php', function()
{
    // Check for the post type here.
} );

Dans ce cas, le hook général est load-$pagenow. Pas besoin de la is_admin() vérifier ici.

Remarque

Si vous ciblez la requête principale, vous devez alors ajouter $query->is_main_query() check également dans votre rappel pre_get_posts.

Rappelez-vous également de valider la partie $_GET['my_venue_ids'], elle pourrait même ne pas exister dans le tableau $_GET.

Rien de nouveau ici! Je pense que nous avons tous vu ces méthodes, d'une manière ou d'une autre, utilisées dans de nombreuses questions et réponses ici sur WPSE ;-)

3
birgire