rest_url( string $path = '', string $scheme = 'rest' ): string
- Since
- 4.4.0
- Source
wp-includes/rest-api.php:599
Builds a full REST API URL by combining a route with the site's REST base and passed through get_rest_url(). The returned string is not escaped, so wrap it in esc_url() or esc_url_raw() before printing or storing it. On multisite, it always targets the current site because it calls get_rest_url() with a null site ID; use get_rest_url() directly when you need a different site's REST URL.
Description
Note: The returned URL is NOT escaped.
Compatibility
- WordPress
- since 4.4.0
- PHP
- 7.4–8.6-dev
- 6.7.7
- 6.8.8
- 6.9.7
- 7.0.4
- 7.1.0
Present in every tracked release (6.7.7 to 7.1.0), and compiles on PHP 7.4 through 8.6-dev.
Parameters
$pathstringoptional- REST route. Default empty.Default:
'' $schemestringoptional- Sanitization scheme. Default 'rest'.Default:
'rest'
Return value
string- Full URL to the endpoint.
Code examples
Every example is editable and runs in a real WordPress booted in your browser by WordPress Playground. Press Run, then edit the code: clicking away re-runs it. Nothing is sent anywhere until you do.
Get the REST API URL for a specific post
Build a link to the wp/v2/posts endpoint for one of the baseline posts.
$post_id = 2;
$endpoint = sprintf( 'wp/v2/posts/%d', $post_id );
echo esc_html( rest_url( $endpoint ) );rest_url() does not escape its return value, so esc_html() or esc_url() is added here before printing.
Pass the REST root URL to a script for client-side API requests
Register the core wp-api-request script and localize it with the REST root so front-end JavaScript can call the API.
add_action( 'wp_enqueue_scripts', function() {
wp_enqueue_script( 'wp-api-request' );
wp_localize_script( 'wp-api-request', 'wpApiSettings', array(
'root' => esc_url_raw( rest_url() ),
'nonce' => wp_create_nonce( 'wp_rest' ),
) );
} );
add_action( 'wp_footer', function() {
printf( '<p>REST root: %s</p>', esc_html( rest_url() ) );
} );esc_url_raw() is used here because the value is being written into a JavaScript settings object rather than printed as HTML.
Common problems and fixes · 3
- Why do I have to escape the output of rest_url()?
- Why does rest_url() return the wrong site's URL on a multisite network?
- What does the $scheme argument in rest_url() actually control?
Why do I have to escape the output of rest_url()?
Why does rest_url() return the wrong site's URL on a multisite network?
What does the $scheme argument in rest_url() actually control?
Alternatives and related functions
get_rest_url- When you need a REST URL for a specific multisite blog ID rather than the current site.
home_url- When you need the site's front-end home URL instead of a REST API endpoint.
admin_url- When the link should point to a wp-admin page rather than the REST API.
rest_get_route_for_post- When you only need the REST route for a post object to build a link, without assembling the full URL yourself.
Performance profile
How much work a call to rest_url() does, and what it touches: the algorithmic scaling, the Zend instruction count per call across PHP versions, the hooks it hands control to, and the core code that calls it. Measured from the compiled opcodes, not a stopwatch, so every number is identical on any machine running the same PHP version, and every function in core is ranked by cost.
- Cost class
- Moderate
- Scaling
- Constant
- Instructions
- 8
- Plugin surface
- None
- Called by
- 50
Reads stored settings via get_option(), cached per request but not free on a cold cache.
No loop in the body: the same number of instructions runs whatever you pass in.
Executed per call on PHP 8.5. The body compiles to 8.
Nothing here hands control to plugin code.
50 places in core call this, so the cost is paid more often than your own code shows.
What it touches
- optionoption read or write
get_option()one call below rest_url() - hookthird-party callbacks
apply_filters()one call below rest_url()
Further down the call graph this can also reach cache, serialize, query and transient. Those are the worst case, several calls deep and usually down an error path, not what a normal call pays.
What one call costs · 1 distinct outcome
One number would be a lie: the work depends on which branch runs. These are every distinct cost rest_url() can have, taken from its control-flow graph on PHP 8.5.
| When | Instructions | Calls it makes |
|---|---|---|
| always | 8 | get_rest_url() |
Across PHP versions
Compiles the same on PHP 7.4, 8.1, 8.2, 8.3, 8.4, 8.5 and 8.6-dev: 8 instructions, 8 executed per call, 0 branches. The work does not change between versions.
An instruction is not a fixed amount of time, so a matching count is not necessarily the same speed; what it rules out is a difference in the work itself.
Uses · 1
- get_rest_url()Retrieves the URL to a REST endpoint on a site.
Used by · 50
- WP_REST_Abilities_V1_Categories_Controller::get_items()Retrieves all ability categories.
- WP_REST_Abilities_V1_Categories_Controller::prepare_item_for_response()Prepares an ability category for response.
- WP_REST_Abilities_V1_List_Controller::get_items()Retrieves all abilities.
- WP_REST_Abilities_V1_List_Controller::prepare_item_for_response()Prepares an ability for response.
- WP_REST_Application_Passwords_Controller::prepare_links()Prepares links for the request.
- WP_REST_Attachments_Controller::create_item()Creates a single attachment.
- WP_REST_Attachments_Controller::create_item_from_url()Sideloads an external image from a URL into the media library.
- WP_REST_Attachments_Controller::edit_media_item()Applies edits to a media item and creates a new attachment record.
- WP_REST_Attachments_Controller::prepare_links()Prepares attachment links for the request.
- WP_REST_Block_Directory_Controller::prepare_links()Generates a list of links to include in the response for the plugin.
- WP_REST_Block_Types_Controller::prepare_links()Prepares links for the request.
- WP_REST_Comments_Controller::create_item()Creates a comment.
Show all 50
- WP_REST_Comments_Controller::get_items()Retrieves a list of comment items.
- WP_REST_Comments_Controller::prepare_links()Prepares links for the request.
- WP_REST_Font_Collections_Controller::get_items()Gets the font collections available.
- WP_REST_Font_Collections_Controller::prepare_links()Prepares links for the request.
- WP_REST_Font_Faces_Controller::prepare_links()Prepares links for the request.
- WP_REST_Font_Families_Controller::prepare_font_face_links()Prepares child font face links for the request.
- WP_REST_Global_Styles_Controller::get_theme_item()Returns the given theme global styles config.
- WP_REST_Global_Styles_Controller::prepare_links()Prepares links for the request.
- WP_REST_Global_Styles_Revisions_Controller::get_items()Returns paginated revisions of the given global styles config custom post type.
- WP_REST_Menu_Items_Controller::create_item()Creates a single nav menu item.
- WP_REST_Menu_Items_Controller::get_schema_links()Retrieves Link Description Objects that should be added to the Schema for the nav menu items collection.
- WP_REST_Menu_Items_Controller::prepare_links()Prepares links for the request.
- WP_REST_Menu_Locations_Controller::prepare_links()Prepares links for the request.
- WP_REST_Menus_Controller::create_item()Creates a single term in a taxonomy.
- WP_REST_Menus_Controller::prepare_links()Prepares links for the request.
- WP_REST_Navigation_Fallback_Controller::prepare_links()Prepares the links for the request.
- WP_REST_Plugins_Controller::create_item()Uploads a plugin and optionally activates it.
- WP_REST_Plugins_Controller::prepare_links()Prepares links for the request.
- WP_REST_Post_Search_Handler::prepare_item_links()Prepares links for the search result of a given ID.
- WP_REST_Post_Statuses_Controller::prepare_item_for_response()Prepares a post status object for serialization.
- WP_REST_Post_Types_Controller::prepare_links()Prepares links for the request.
- WP_REST_Posts_Controller::create_item()Creates a single post.
- WP_REST_Posts_Controller::get_items()Retrieves a collection of posts.
- WP_REST_Posts_Controller::get_schema_links()Retrieves Link Description Objects that should be added to the Schema for the posts collection.
- WP_REST_Posts_Controller::prepare_links()Prepares links for the request.
- WP_REST_Request::from_url()Retrieves a WP_REST_Request object from a full URL.
- WP_REST_Revisions_Controller::get_items()Gets a collection of revisions.
- WP_REST_Revisions_Controller::prepare_item_for_response()Prepares the revision for the REST response.
- WP_REST_Search_Controller::get_items()Retrieves a collection of search results.
- WP_REST_Search_Controller::prepare_item_for_response()Prepares a single search result for response.
- WP_REST_Server::add_active_theme_link_to_index()Adds a link to the active theme for users who have proper permissions.
- WP_REST_Server::add_image_to_index()Exposes an image through the WordPress REST API.
- WP_REST_Server::get_data_for_route()Retrieves publicly-visible data for the route.
- WP_REST_Server::get_namespace_index()Retrieves the index for a namespace.
- WP_REST_Sidebars_Controller::prepare_links()Prepares links for the sidebar.
- WP_REST_Taxonomies_Controller::prepare_links()Prepares links for the request.
- WP_REST_Template_Autosaves_Controller::prepare_links()Prepares links for the request.
- WP_REST_Template_Revisions_Controller::prepare_links()Prepares links for the request.
Source code
function rest_url( $path = '', $scheme = 'rest' ) { return get_rest_url( null, $path, $scheme );}Changelog
Introduced in 4.4.0. Unchanged from 6.7.7 through 7.1.0.
Signature, return type and hooks compared across 5 parsed releases.
About this page
- Parsed data
- Generated from the wordpress-develop 7.1.0 tag, from
src/wp-includes/rest-api.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it. - Corrections
- Something wrong on this page? Report it and it gets fixed in the next regeneration.