You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.6 KiB
97 lines
2.6 KiB
/** |
|
* Thin jQuery.ajax wrapper for WP REST API requests. |
|
* |
|
* Currently only applies to requests that do not use the `wp-api.js` Backbone |
|
* client library, though this may change. Serves several purposes: |
|
* |
|
* - Allows overriding these requests as needed by customized WP installations. |
|
* - Sends the REST API nonce as a request header. |
|
* - Allows specifying only an endpoint namespace/path instead of a full URL. |
|
* |
|
* @since 4.9.0 |
|
* @output wp-includes/js/api-request.js |
|
*/ |
|
|
|
( function( $ ) { |
|
var wpApiSettings = window.wpApiSettings; |
|
|
|
function apiRequest( options ) { |
|
options = apiRequest.buildAjaxOptions( options ); |
|
return apiRequest.transport( options ); |
|
} |
|
|
|
apiRequest.buildAjaxOptions = function( options ) { |
|
var url = options.url; |
|
var path = options.path; |
|
var namespaceTrimmed, endpointTrimmed, apiRoot; |
|
var headers, addNonceHeader, headerName; |
|
|
|
if ( |
|
typeof options.namespace === 'string' && |
|
typeof options.endpoint === 'string' |
|
) { |
|
namespaceTrimmed = options.namespace.replace( /^\/|\/$/g, '' ); |
|
endpointTrimmed = options.endpoint.replace( /^\//, '' ); |
|
if ( endpointTrimmed ) { |
|
path = namespaceTrimmed + '/' + endpointTrimmed; |
|
} else { |
|
path = namespaceTrimmed; |
|
} |
|
} |
|
if ( typeof path === 'string' ) { |
|
apiRoot = wpApiSettings.root; |
|
path = path.replace( /^\//, '' ); |
|
|
|
// API root may already include query parameter prefix if site is |
|
// configured to use plain permalinks. |
|
if ( 'string' === typeof apiRoot && -1 !== apiRoot.indexOf( '?' ) ) { |
|
path = path.replace( '?', '&' ); |
|
} |
|
|
|
url = apiRoot + path; |
|
} |
|
|
|
// If ?_wpnonce=... is present, no need to add a nonce header. |
|
addNonceHeader = ! ( options.data && options.data._wpnonce ); |
|
|
|
headers = options.headers || {}; |
|
|
|
// If an 'X-WP-Nonce' header (or any case-insensitive variation |
|
// thereof) was specified, no need to add a nonce header. |
|
if ( addNonceHeader ) { |
|
for ( headerName in headers ) { |
|
if ( headers.hasOwnProperty( headerName ) ) { |
|
if ( headerName.toLowerCase() === 'x-wp-nonce' ) { |
|
addNonceHeader = false; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ( addNonceHeader ) { |
|
// Do not mutate the original headers object, if any. |
|
headers = $.extend( { |
|
'X-WP-Nonce': wpApiSettings.nonce |
|
}, headers ); |
|
} |
|
|
|
// Do not mutate the original options object. |
|
options = $.extend( {}, options, { |
|
headers: headers, |
|
url: url |
|
} ); |
|
|
|
delete options.path; |
|
delete options.namespace; |
|
delete options.endpoint; |
|
|
|
return options; |
|
}; |
|
|
|
apiRequest.transport = $.ajax; |
|
|
|
/** @namespace wp */ |
|
window.wp = window.wp || {}; |
|
window.wp.apiRequest = apiRequest; |
|
} )( jQuery );
|
|
|