Spaces:
Sleeping
Sleeping
/** | |
* 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 | |
* @since 5.6.0 Added overriding of the "PUT" and "DELETE" methods with "POST". | |
* Added an "application/json" Accept header to all requests. | |
* @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 method = options.method; | |
var namespaceTrimmed, endpointTrimmed, apiRoot; | |
var headers, addNonceHeader, addAcceptHeader, 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 ); | |
addAcceptHeader = true; | |
headers = options.headers || {}; | |
for ( headerName in headers ) { | |
if ( ! headers.hasOwnProperty( headerName ) ) { | |
continue; | |
} | |
// If an 'X-WP-Nonce' or 'Accept' header (or any case-insensitive variation | |
// thereof) was specified, no need to add the header again. | |
switch ( headerName.toLowerCase() ) { | |
case 'x-wp-nonce': | |
addNonceHeader = false; | |
break; | |
case 'accept': | |
addAcceptHeader = false; | |
break; | |
} | |
} | |
if ( addNonceHeader ) { | |
// Do not mutate the original headers object, if any. | |
headers = $.extend( { | |
'X-WP-Nonce': wpApiSettings.nonce | |
}, headers ); | |
} | |
if ( addAcceptHeader ) { | |
headers = $.extend( { | |
'Accept': 'application/json, */*;q=0.1' | |
}, headers ); | |
} | |
if ( typeof method === 'string' ) { | |
method = method.toUpperCase(); | |
if ( 'PUT' === method || 'DELETE' === method ) { | |
headers = $.extend( { | |
'X-HTTP-Method-Override': method | |
}, headers ); | |
method = 'POST'; | |
} | |
} | |
// Do not mutate the original options object. | |
options = $.extend( {}, options, { | |
headers: headers, | |
url: url, | |
method: method | |
} ); | |
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 ); | |