fix(auth): use restUrl for modal-login under plain permalinks

Local WP has empty permalink_structure so /wp-json/* 404s on Apache.
modal-auth fell back to /wp-json/aksrt/v1; prefer aksrtData.restUrl
(index.php?rest_route=/aksrt/v1) and join paths correctly.
This commit is contained in:
2026-07-25 11:02:32 +08:00
parent d3cae1f1cb
commit 7daaa03417
3 changed files with 57 additions and 4 deletions
+5 -1
View File
@@ -8,7 +8,11 @@
(function () {
'use strict';
var API_ROOT = (window.aksrtData && window.aksrtData.apiUrl) || '/wp-json/aksrt/v1';
var API_ROOT = (function () {
var d = window.aksrtData || {};
var raw = d.apiUrl || d.restUrl || d.rest_url || '/index.php?rest_route=/aksrt/v1';
return String(raw).replace(/\/$/, '');
})();
var NONCE = (window.aksrtData && window.aksrtData.restNonce) || '';
function initFollowButtons() {
+47 -2
View File
@@ -7,7 +7,30 @@
(function () {
'use strict';
var API_ROOT = (window.aksrtData && window.aksrtData.apiUrl) || '/wp-json/aksrt/v1';
/**
* Resolve REST root for aksrt/v1.
* Prefer aksrtData.restUrl (works with plain permalinks: index.php?rest_route=/aksrt/v1).
* Do not hardcode /wp-json when rewrite rules are off — that 404s on Apache.
*/
function resolveApiRoot() {
var d = window.aksrtData || {};
var raw = d.apiUrl || d.restUrl || d.rest_url || '';
if (!raw) {
raw = '/index.php?rest_route=/aksrt/v1';
}
raw = String(raw).trim();
// restUrl may be site root rest_url() without namespace in some localizes — ensure aksrt/v1.
if (/rest_route=\/?$/.test(raw) || /\/wp-json\/?$/.test(raw)) {
if (raw.indexOf('rest_route=') !== -1) {
raw = raw.replace(/rest_route=\/?$/, 'rest_route=/aksrt/v1');
} else {
raw = raw.replace(/\/?$/, '/') + 'aksrt/v1';
}
}
return raw.replace(/\/$/, '');
}
var API_ROOT = resolveApiRoot();
var NONCE = (window.aksrtData && window.aksrtData.restNonce) || '';
var modal = null;
@@ -310,17 +333,39 @@
headers['X-WP-Nonce'] = NONCE;
}
return fetch(API_ROOT + path, {
var url = joinRestPath(API_ROOT, path);
return fetch(url, {
method: 'POST',
headers: headers,
credentials: 'same-origin',
body: JSON.stringify(payload),
}).then(function (response) {
return response.json().then(function (data) {
return { ok: response.ok, data: data };
}).catch(function () {
return { ok: false, data: { message: '响应解析失败' } };
});
});
}
/**
* Join REST root + path for both pretty (/wp-json/aksrt/v1/x)
* and plain (?rest_route=/aksrt/v1/x) permalinks.
*/
function joinRestPath(root, path) {
path = String(path || '');
if (path.charAt(0) !== '/') {
path = '/' + path;
}
root = String(root || '').replace(/\/$/, '');
if (root.indexOf('rest_route=') !== -1) {
// e.g. https://host/index.php?rest_route=/aksrt/v1 + /auth/modal-login
return root + path;
}
return root + path;
}
function prefillLogin(value) {
var loginInput = document.getElementById('modal-login-user');
if (loginInput && value) {
+5 -1
View File
@@ -9,7 +9,11 @@
(function () {
'use strict';
var API_ROOT = (window.aksrtData && window.aksrtData.apiUrl) || '/wp-json/aksrt/v1';
var API_ROOT = (function () {
var d = window.aksrtData || {};
var raw = d.apiUrl || d.restUrl || d.rest_url || '/index.php?rest_route=/aksrt/v1';
return String(raw).replace(/\/$/, '');
})();
var NONCE = (window.aksrtData && window.aksrtData.restNonce) || '';
function getReportCategories() {