‘Header bereits gesendet’ Fehler beim Umleiten von add_submenu_page () Callback

Dies ist ein sehr häufiges Problem, aber alle Antworten, die ich lese, beziehen sich nicht auf das, was in meinem Fall passiert.

Ich schreibe ein benutzerdefiniertes Plugin, das Daten liest und schreibt / aktualisiert in eine benutzerdefinierte databasetabelle (es ist sehr einfach).

Wenn ein Update vorgenommen wird, möchte ich jedoch auf die Hauptseite redirect und anschließend eine Benachrichtigung über den erfolgreichen Administrator auf der Seite anzeigen. wp_safe_redirect ich jedoch das Formular wp_safe_redirect und wp_safe_redirect versuche, wp_safe_redirect ich Folgendes:

Warnung: Header-Informationen können nicht geändert werden – Header, die bereits gesendet wurden (Ausgabe gestartet unter C: \ wamp64 \ www \ bellavou \ wp-includes \ format.php: 4593) in C: \ wamp64 \ www \ bellavou \ wp-includes \ pluggable. php auf Linie 1167

Ich habe keine Leerzeichen in meinen Plugin-Dateien, und mein Aufruf an die Weiterleitung im wpdb->update Aufruf sieht folgendermaßen aus:

 if($wpdb->update( 'wp_before_after', $bv_before_after_data, array( 'id' => $bv_id ), array( '%s', // value1 '%s', // value2 '%s', // value3 '%d', // value4 '%d', // value5 '%d', // value6 '%d', // value7 '%d', // value8 '%s', // value9 '%s', // value10 '%s', // value11 '%s', // value12 ), array( '%d' ) )) { // Success wp_safe_redirect('/wp-admin/admin.php?page=bv_before_afters_main&updated=1'); } else { // Error echo '

Could not be updated! (Maybe there was nothing to update?)

'; }

Wie kann ich das richtig bestellen, damit die Weiterleitung und der Admin-Hinweis korrekt funktionieren?

AKTUALISIEREN:

Meine Haupt-Plugin-Datei sieht so aus (mit den Includes zu anderen Seiten):

 // Create page in WP Admin function my_admin_menu() { add_menu_page( 'Before & After Photos', 'Before & Afters', 'edit_posts', 'bv_before_afters_main', 'bv_before_afters_main', 'dashicons-format-gallery', 58 ); add_submenu_page( 'bv_before_afters_main', 'Add set', 'Add set', 'edit_posts', 'bv_before_afters_add', 'bv_before_afters_add' ); add_submenu_page( 'bv_before_afters_main', 'Edit set', 'Edit set', 'edit_posts', 'bv_before_afters_edit', 'bv_before_afters_edit' ); } add_action( 'admin_menu', 'my_admin_menu' ); // Apply stylesheets function bv_before_afters_styles(){ wp_enqueue_style( 'bv_before_after_styles', plugins_url( '/bv_before_afters.css', __FILE__ ) ); } add_action('admin_print_styles', 'bv_before_afters_styles'); // Display the main page function bv_before_afters_main(){ include_once plugin_dir_path( __FILE__ ).'/views/view_all.php'; } // Display the edit page function bv_before_afters_edit(){ include_once plugin_dir_path( __FILE__ ).'/views/edit.php'; } // Display the add page function bv_before_afters_add(){ include_once plugin_dir_path( __FILE__ ).'/views/add.php'; } 

(Der Umleitungscode ist in der edit.php )

Solutions Collecting From Web of "‘Header bereits gesendet’ Fehler beim Umleiten von add_submenu_page () Callback"

Hintergrund

Der berüchtigte ” Headers sent sent ” -Fehler führt zu einem hässlichen Kopf, wenn versucht wird, die HTTP-Header für die Antwort des Servers zu ändern, nachdem sie bereits an den Browser gesendet wurden – das heißt, wenn der Server nur den Body generiert der Antwort.

Dies geschieht häufig auf zwei Arten:

  • Der Code druckt die Dinge zu früh, bevor WordPress die Header-Erstellung abgeschlossen hat – dies drückt die HTTP-Antwort auf den Browser und zwingt die HTTP-Header dazu, in diesem process ausgetriggers zu werden. Alle Versuche von WordPress oder von Code von Dritt-Anbieter, die normalerweise die Header richtig ändern würden, werden anschließend den Fehler erzeugen.
  • Code versucht, HTTP-Header zu spät zu ändern, nachdem WordPress sie bereits gesendet und HTML gerendert hat.

Problem- und Lösungsübersicht

In diesem Fall ist das Problem das letztere. Dies liegt daran, dass die function wp_safe_redirect() funktioniert, indem ein HTTP-Status-Header mit 300 Byte festgelegt wird. Da die Callback-functionsargumente für add_menu_page() und add_submenu_page() zum Drucken von benutzerdefiniertem Markup verwendet werden, nachdem die Seitenleiste des Dashboards und die schwebende Symbolleiste bereits generiert wurden, sind die Callbacks in WordPress zu spät, um die wp_safe_redirect() -function zu verwenden. Wie in den Kommentaren beschrieben, besteht die Lösung darin, die $wpdb->update() und wp_safe_redirect() außerhalb Ihrer view views/edit.php Ansichtsvorlage zu verschieben und sie an eine Aktion ” views/edit.php “, die vor dem Senden der HTTP-Header erfolgt (bevor HTML an den Browser gesendet wird).


Lösung des Problems

Betrachtet man die Aktionsreferenz für die typische Admin-Seitenanforderung , ist es vernünftig anzunehmen, dass die Aktion 'send_headers' die absolute 'send_headers' ist, dass HTTP-Header zuverlässig geändert werden können. Ihr gewünschtes Ergebnis könnte also erreicht werden, indem Sie dieser oder einer anderen function eine function $wpdb->update() die Ihre Weiterleitungslogik enthält. Sie müssen jedoch manuell überprüfen, welche $wpdb->update() angezeigt wird, um sicherzustellen, dass Sie nur das $wpdb->update() und anschließende Weiterleitung für Ihre views/edit.php Vorlage.

Praktischerweise bietet WordPress eine Verknüpfung für diese kontextabhängige functionalität mit der Aktion 'load-{page hook}' , die für jede geladene Admin-Seite dynamisch ausgetriggers wird. Während Ihr Aufruf von add_submenu_page() den {page hook} -Wert add_submenu_page() der benötigt wird, um eine Aktion zur Ausführung zu laden, wenn Ihre benutzerdefinierten Vorlagen geladen werden, können Seiten-Hooks im Format {parent page slug}_page_{child page slug} . Wenn wir die Werte aus Ihrem Code nehmen, erhalten wir 'load-bv_before_afters_main_page_bv_before_afters_edit' Aktion 'load-bv_before_afters_main_page_bv_before_afters_edit' , die nur beim Laden Ihrer views/edit.php Vorlage ausgeführt wird.

Das letzte Problem wird zur Frage, ob $wpdb->update() einen Fehler in Ihrer Vorlage views/edit.php um festzustellen, ob die Fehlermeldung angezeigt werden soll oder nicht. Dies kann mit Hilfe von globalen Variablen oder einer benutzerdefinierten Aktion erfolgen. Eine bessere Lösung besteht jedoch darin, eine function anzuhängen, die Ihren Fehler an die Aktion 'admin_notices' die genau aus diesem Grund existiert. 'admin_notices' wird ausgetriggers, kurz bevor WordPress Ihre benutzerdefinierte Ansichtsvorlage rendert, und stellt sicher, dass Ihre Fehlermeldung oben auf der Seite 'admin_notices' wird.

Hinweis

Die $wpdb->update() -Methode gibt die Anzahl der Zeilen aktualisiert oder false wenn ein Fehler aufgetreten ist – das bedeutet, dass eine erfolgreiche Aktualisierungsabfrage keine Zeilen ändern und 0 , was Ihre if() Bedingung false als false auswerten wird zeige deine Fehlermeldung an. Wenn Sie den Fehler nur anzeigen möchten, wenn der Aufruf tatsächlich fehlschlägt, sollten Sie den $wpdb->update() anhand des Identitätsvergleichsoperators !== mit dem Wert false vergleichen.


Implementierung

Kombiniert man alles oben, könnte eine Lösung wie folgt aussehen. Hier habe ich ein extra Array verwendet, um die Seiten-Slugs für Ihre Admin-Seiten zu halten, um eine einfache Referenz zu erhalten, um keine Tipperrors zu vermeiden und die Slugs bei Bedarf einfacher zu ändern.

Der gesamte Teil der von Ihnen ursprünglich geposteten views/edit.php Datei befindet sich jetzt im views/edit.php sowie in jeder anderen Geschäftslogik, die zur Bearbeitung des Bearbeitungsformulars verwendet wird.

Plugin-Datei:

 $bv_admin_page_slugs = [ 'main' => 'bv_before_afters_main', 'edit' => 'bv_before_afters_edit', 'add' => 'bv_before_afters_add' ]; add_action( 'admin_menu', 'bv_register_admin_pages' ); // Create page in WP Admin function bv_register_admin_pages() { add_menu_page( 'Before & After Photos', 'Before & Afters', 'edit_posts', $bv_admin_page_slugs['main'], 'bv_before_afters_main', 'dashicons-format-gallery', 58 ); add_submenu_page( $bv_admin_page_slugs['main'], 'Add set', 'Add set', 'edit_posts', $bv_admin_page_slugs['add'], 'bv_before_afters_add' ); add_submenu_page( $bv_admin_page_slugs['main'], 'Edit set', 'Edit set', 'edit_posts', $bv_admin_page_slugs['edit'], 'bv_before_afters_edit' ); } // Process the update/redirect logic whenever the the custom edit page is visited add_action( 'load-' . $bv_admin_page_slugs['main'] . '_page_' . $bv_admin_page_slugs['edit'], 'bv_update_before_after' ); // Performs a redirect on a successful update, adds an error message otherwise function bv_update_before_after() { // Don't process an edit if one was not submitted if( /* (An edit was NOT submitted) */ ) return; $result = $wpdb->update( /* (Your Arguments) */ ); if( $result !== false ) { wp_safe_redirect('/wp-admin/admin.php?page=' . $bv_admin_page_slugs['main'] . '&updated=1'); exit; } else { // Tell WordPress to print the error when it usually prints errors add_action( 'admin_notices', function() { echo '

Could not be updated!

'; } ); } } // Apply stylesheets function bv_before_afters_styles(){ wp_enqueue_style( 'bv_before_after_styles', plugins_url( '/bv_before_afters.css', __FILE__ ) ); } add_action('admin_print_styles', 'bv_before_afters_styles'); // Display the main page function bv_before_afters_main(){ include_once plugin_dir_path( __FILE__ ).'/views/view_all.php'; } // Display the edit page function bv_before_afters_edit(){ include_once plugin_dir_path( __FILE__ ).'/views/edit.php'; } // Display the add page function bv_before_afters_add(){ include_once plugin_dir_path( __FILE__ ).'/views/add.php'; }