Wie führe ich eine Abfrage nur auf einer bestimmten Admin-Seite durch?

Ich mache eine Seite für Einstellungs-API mit Codestar Framework, und Laden von Feldern mit ihren filterbaren konfigurieren – Frage bezieht sich nicht auf Codestar . In einem solchen Dropdown-Feld muss ich alle Posts eines benutzerdefinierten Post-Typs laden, die innerhalb von 30 Tagen hinzugefügt werden. Um die Dinge schön und sauber zu machen, habe ich eine benutzerdefinierte function gemacht:

 'cpt', 'post_status' => 'publish', 'posts_per_page' => -1, 'date_query' => array( array( 'after' => '30 days ago', 'inclusive' => true, ), ) ) ); $posts_this_month = array(); if( $latest_posts->have_posts() ) : while( $latest_posts->have_posts() ) : $latest_posts->the_post(); $validity_type = get_post_meta( get_the_ID(), "{$project_prefix}validity_type", true ); if( $validity_type && 'validity date' === $validity_type ) { $validity = get_post_meta( get_the_ID(), "{$project_prefix}validity", true ); $tag = days_until( $validity ) .' days left'; //custom function } else if( $validity_type && 'validity stock' === $validity_type ) { $tag = 'Stock'; } else { $tag = '...'; } $posts_this_month[get_the_ID()] = get_the_title() .' ['. $tag .']'; endwhile; endif; wp_reset_postdata(); return $posts_this_month; } 

Frage ist nicht einmal mit der function.

Ich möchte die Abfrage nur auf dieser speziellen top_level_custom-settings-api-Seite durchführen . Die function wird bei jedem Laden der Seite von admin geladen. Ich habe versucht, get_current_screen() aber diese function gibt mir keinen fatalen Fehler.

Bearbeiten

Nein @bongger, daran habe ich mich erinnert. Ich habe deinen Code folgendermaßen ausprobiert:

 add_action('current_screen', 'current_screen_callback'); function current_screen_callback($screen) { if( is_object($screen) && $screen->id == 'top_level_custom-settings-api' ) { add_action( 'admin_init', 'pre_get_active_posts_of_30_days' ); } } 

Der Code funktioniert zwar gut, aber er kontrolliert nicht, ob meine function nur auf dieser Seite geladen wird. Ich habe die Abfrage auf anderen Seiten überprüft, die Abfrage ist auch da. Und ich habe versucht, die Bedingung zu etwas falsch zu ändern, wie $screen->id == 'top_level_-api' , es funktioniert immer noch so. 🙁

Ich fürchte, ich weiß, dass ich hinter den Kulissen nur einen Mangel habe und Dinge filtere. Würde mich freuen, auch dafür eine gute Lektüre zu haben.

Solutions Collecting From Web of "Wie führe ich eine Abfrage nur auf einer bestimmten Admin-Seite durch?"

Es lohnt sich, darauf hinzuweisen, dass die Verwendung von admin_init innerhalb des Filters admin_init zu spät ist, da admin_init bereits ausgetriggers wurde.

Stattdessen tun:

 add_action('current_screen', 'current_screen_callback'); function current_screen_callback($screen) { if( is_object($screen) && $screen->id === 'top_level_custom-settings-api' ) { add_filter('top_level_screen', '__return_true'); } } 

An anderer Stelle in Ihrem top_level_page_callback Callback, der für die Ausführung der Abfrage zuständig ist:

 function top_level_page_callback() { $active_posts = null; if ( ($is_top_level = apply_filters('top_level_screen', false)) ) { $active_posts = pre_get_active_posts_of_30_days(); } //etc... } 

Das ist ein Weg, es zu tun …

Oder Sie könnten verwenden, add_action('load-top_level_custom-settings-api', 'callback');

Anders als der current_screen Hook, wo hast du sonst versucht, pre_get_active_posts_of_30_days() ? Weil Sie es in einem globalen Bereich irgendeiner Art aufgerufen haben müssen, damit es auf allen Seiten und nicht nur auf der Zielseite läuft.

Tu das einfach

 /** * Make sure to do WP_Query (or whatever) only on specific admin page. */ // save current page slug $current_page_slug = ''; // get current page slug global $pagenow; if ($pagenow === 'admin.php' && isset($_GET['page'])) { $current_page_slug = $_GET['page']; } // we are not inside our 'specific_page_slug' page? go back if ($current_page_slug !== 'specific_page_slug') { return; // or do whatever } // here we are inside our 'specific_page_slug' page // so now you can do wp_query or whatever