@@ -143,33 +143,37 @@ protected function enableHttpsInConsole(): void
143
143
*/
144
144
protected function registerWordPressRoute (): void
145
145
{
146
- Route::any ('{any?} ' , fn () => tap (response ('' ), function (Response $ response ) {
147
- foreach (headers_list () as $ header ) {
148
- [$ header , $ value ] = preg_split ("/:\s{0,1}/ " , $ header , 2 );
146
+ Route::any ('{any?} ' , fn (Request $ request ) => tap (
147
+ response ('' ),
148
+ function (Response $ response ) use ($ request ) {
149
+ foreach (headers_list () as $ header ) {
150
+ [$ header , $ value ] = preg_split ("/:\s{0,1}/ " , $ header , 2 );
149
151
150
- if (! headers_sent ()) {
151
- header_remove ($ header );
152
- }
152
+ if (! headers_sent ()) {
153
+ header_remove ($ header );
154
+ }
153
155
154
- $ response ->header ($ header , $ value , $ header !== 'Set-Cookie ' );
155
- }
156
+ $ response ->header ($ header , $ value , $ header !== 'Set-Cookie ' );
157
+ }
156
158
157
- if ($ this ->hasDebugModeEnabled ()) {
158
- $ response ->header ('X-Powered-By ' , $ this ->version ());
159
- }
159
+ if ($ this ->hasDebugModeEnabled ()) {
160
+ $ response ->header ('X-Powered-By ' , $ this ->version ());
161
+ }
160
162
161
- $ response ->setStatusCode (http_response_code ());
163
+ $ response ->setStatusCode (http_response_code ());
162
164
163
- $ content = '' ;
165
+ // Get the output buffer contents from our shutdown handler
166
+ $ content = $ request ->request ->get ('wp_ob_content ' );
164
167
165
- $ levels = ob_get_level ();
168
+ $ levels = ob_get_level ();
166
169
167
- for ($ i = 0 ; $ i < $ levels ; $ i ++) {
168
- $ content .= ob_get_clean ();
169
- }
170
+ for ($ i = 0 ; $ i < $ levels ; $ i ++) {
171
+ $ content .= ob_get_contents ();
172
+ }
170
173
171
- $ response ->setContent ($ content );
172
- }))
174
+ $ response ->setContent ($ content );
175
+ })
176
+ )
173
177
->where ('any ' , '.* ' )
174
178
->name ('wordpress ' );
175
179
}
@@ -220,9 +224,23 @@ protected function registerRequestHandler(
220
224
221
225
$ route ->middleware ('wordpress ' );
222
226
227
+ // We need to save our start level as there might be higher level output buffer handlers due to caching plugins.
228
+ $ startLevel = ob_get_level ();
223
229
ob_start ();
224
230
225
231
remove_action ('shutdown ' , 'wp_ob_end_flush_all ' , 1 );
232
+ add_action ('shutdown ' , function () use ($ request , $ startLevel ) {
233
+ // Clean buffer only until our start level, keep possible higher level buffers to their handlers
234
+ $ levels = ob_get_level () - $ startLevel ;
235
+ $ content = '' ;
236
+
237
+ for ($ i = 0 ; $ i < $ levels ; $ i ++) {
238
+ $ content .= ob_get_clean ();
239
+ }
240
+
241
+ // Save content onto request to have it available in the Response handler
242
+ $ request ->request ->set ('wp_ob_content ' , $ content );
243
+ }, 1 );
226
244
add_action ('shutdown ' , fn () => $ this ->handleRequest ($ request ), 100 );
227
245
}
228
246
0 commit comments