Wie erzwinge ich einen Download im Adminbereich?

Ich mache eine Exportfunktion in meinem Plugin, aber ich kann keinen direkten Download erzwingen. Ich bekomme den Fehler:

Cannot modify header information - headers already sent

Irgendwann, bevor meine function ausgetriggers wird, hat WordPress bereits begonnen, im Hauptteil der Antwort zu drucken, damit ich die Header nicht ändern kann, wenn meine function erreicht. Gibt es eine Möglichkeit, wie ich das umgehen und meine Header hinzufügen kann, damit ich einen direkten Download erzwinge?

Ich habe versucht, alle Skripte auf admin_init de-registrieren, wenn die Worte “direct-download” in der URL gefunden werden, aber anscheinend ist das Skript nicht das Einzige, was WordPress in den Antworttext ausdruckt.

Gibt es einen Standard-Weg, um einen direkten Download im Admin-Bereich zu erreichen?

Das Plugin, an dem ich gerade arbeite, hat ein MVC-Format. Meine Export-Schaltfläche ist nur ein einfacher Link ( ), der zu meiner Aktionsmethode führt:

 public function exportRecordsToExcelAction() { // Get parameters // Get columns // Get records // Excel stuff header('Content-type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="Records.xlsx"'); $objWriter->save('php://output'); } 

Die headers already sent Fehler headers already sent , beziehen sich auf Zeile 958 von wp-includes/script-loader.php . Dies ist, wo WordPress beginnt, den Antworttext auszudrucken und meine Fähigkeit, die Header zu ändern. Es ist nicht der einzige Ort, an dem das so offensichtlich versucht, diese function zu umgehen, hilft nicht im Geringsten.

Die irritierend abstrahierte Architektur, mit der ich arbeite, ist die folgende.

Ordnerstruktur:

 pluginFolder setup admin_actions.php add_submenu_page() hooks app module Admin controllers AccountController.php 

Wie ich meine function in AccountController.php :

Wenn ich eine URL in den Plugin-Seiten ausführe, führt ein Objekt in einer Datei im pluginFolder zuerst eine function aus, die die Anfrage-URL analysiert und daraus den Controller-Namen und die Aktionsmethode ermittelt. Sobald sie geparst sind, haben wir den Methodennamen in einer Variablen $method und den Controllernamen in einer Variablen namens $controller . Dann instanziiert es das Controller-Objekt mit einer Factory-Methode wie $controller = self::getController($controller); : $controller = self::getController($controller); . Seit jetzt hat es das richtige Controller-Objekt und es kennt den Namen der Aktionsmethode, die es gerade macht: $controller->$method(); und die Aktionsmethode (meine function im ersten Code) wird ausgeführt.

Im Moment kann ich nicht sehen, wie es mir helfen würde, etwas zu ändern, da all dies ausgeführt wird, nachdem die Header bereits gesendet wurden. Vielleicht ist der einzige Weg, um einen Download zu erzwingen, dass ich diese MVC-Aktionsmethode dieses Mal überspringe und einfach eine reguläre function erstelle, die ausgeführt wird, wenn ich auf die Export-Schaltfläche klicke?

Solutions Collecting From Web of "Wie erzwinge ich einen Download im Adminbereich?"

Es ist, was ich dachte – Sie versuchen, die Datei aus dem Display-callback zu senden, zu welcher Zeit es zu spät ist. Suchen Sie nach dem Aufruf von add_*_page() , der den Menüeintrag in der Admin-Seitenleiste registriert. Der Rückgabewert dieses functionsaufrufs ist der Name des Hooks, mit dem Sie die Download-function anhängen können:

 $hook = add_submenu_page( $parent, $title, $menu_title, $cap, $menu_slug, $callback ); if ( $hook ) // Will be false if current user does not neccessary permissions add_action( "load-$hook", $download_callback );