acorn
acorn copied to clipboard
route() returns incorrect URLs when request is not handled by index.php
Version
v4.3.0
What did you expect to happen?
I expected route() to return correct URLs whenever used.
What actually happens?
When used outside of the frontend or console route() prefixes the URLs with whatever .php file WordPress handled the request via.
So http://localhost/my-route becomes http://localhost/wp/wp-admin/admin-post.php/my-route etc.
The issue can be solved by calling Illuminate\Support\Facades\URL::forceRootUrl(home_url()) during boot but I am not sure about possible caveats.
Steps to reproduce
- Add
Route::get('/test')->name('test');toroutes/web.php - Add
add_action('admin_post_nopriv_route_test', function() { echo route('test'); });tofunctions.php - Open
/wp-admin/admin-post.php?action=route_testas appropriate for your local environment
System info
Pop!_OS 22.04 LTS
Log output
No response
Please confirm this isn't a support request.
Yes
Just to be clear, the bug is that Laravel routes don't work within the wp-admin?
Getting the URL of a Laravel route is broken in wp-admin and possibly other places that do not use index.php as the entrypoint.
Got any examples of what other places that could possibly be?
Acorn is typically booted via the after_setup_theme hook 🤔
wp-cron.php for example.
And wp-admin includes both admin-post.php and admin-ajax.php which are frequently used by the frontend. So thinking of it as only affecting wp-admin can be misleading.
If I understand it all correctly the root cause is that WordPress doesn't use a single file as its entry point, which confuses this function https://github.com/symfony/symfony/blob/44395abfcb2c859b26e0c6880c74dadd94da1038/src/Symfony/Component/HttpFoundation/Request.php#L1776.