Ich versuche, die Abfrage zu ändern, die auf der Admin-Seite meines benutzerdefinierten Beitragstyps ausgeführt wird. Diese Seite: /wp-admin/edit.php?post_type=my_venue. Normalerweise würde ich is_admin() && is_post_type_archive('my_venue')
verwenden, um zu überprüfen, ob ich auf der richtigen Seite bin, bevor ich die Abfrage ändere. Ich habe jedoch meinen Beitragstyp bei 'archive' => false
registriert, daher gibt is_post_type_archive()
immer false zurück.
Wie kann die Abfrage nur für diese Seite am besten geändert werden?
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']);
}
}
}
Basierend auf der /wp-admin/admin.php
-Datei gibt es drei Möglichkeiten:
Es gibt den globalen $pagenow
und den $typenow
:
global $pagenow, $typenow;
if( 'my_venue' === $typenow && 'edit.php' === $pagenow )
{
// ...
}
Dann gibt es den aktuellen Bildschirm, der auch in der admin.php
-Datei mit set_current_screen()
eingestellt ist.
$screen = get_current_screen();
if( is_a( $screen, '\WP_Screen') && 'edit-myvenue' === $screen->id );
{
// ...
}
hier verwenden wir die Eigenschaft id
des Objekts \WP_Screen
.
Wenn wir die Klasse \WP_Screen
durchgehen, finden wir den Hook current_screen
, der stattdessen verwendet werden könnte:
add_action( 'current_screen', function( \WP_Screen $s )
{
if( 'edit-myvenue' === $s->id )
{
// ...
}
} );
Dann gibt es den load-edit.php
-Hook, der vor dem pre_get_posts
-Hook verfügbar ist:
add_action( 'load-edit.php', function()
{
// Check for the post type here.
} );
In diesem Fall lautet der allgemeine Haken load-$pagenow
. Hier ist die Prüfung is_admin()
nicht erforderlich.
Wenn Sie auf die Hauptabfrage abzielen, sollten Sie $query->is_main_query()
check auch in Ihrem pre_get_posts
callback hinzufügen.
Denken Sie auch daran, den Teil $_GET['my_venue_ids']
zu validieren, da er möglicherweise nicht einmal im Array $_GET
vorhanden ist.
Hier gibt es nichts Neues! Ich denke, wir haben alle diese Methoden auf die eine oder andere Weise gesehen, die in vielen Fragen und Antworten hier auf WPSE verwendet wurden ;-)