Я видел пару дискуссий о том, как заставить Wordpress создать уникальный одноразовый номер для последующих запросов Ajax, но на самом деле я не могу заставить Wordpress сделать это - каждый раз, когда я запрашиваю то, что я считаю новым nonce, я получаю тот же nonce обратно из Wordpress. Я понимаю концепцию nonce_life WP и даже настраиваю ее на что-то другое, но это мне не помогло.
Я не генерирую одноразовый номер в объекте JS в заголовке посредством локализации - я делаю это на своей странице отображения. Я могу заставить свою страницу обрабатывать Ajax-запрос, но когда я запрашиваю новый одноразовый номер из WP в обратном вызове, я получаю тот же одноразовый номер обратно и не знаю, что делаю неправильно ... В конечном итоге я хочу Расширьте это так, чтобы на странице могло быть несколько элементов, каждый с возможностью добавления / удаления - поэтому мне нужно решение, которое позволит несколько последующих запросов Ajax с одной страницы.
(И я должен сказать, что я поместил всю эту функциональность в плагин, поэтому интерфейсная «страница отображения» на самом деле является функцией, включенной в плагин ...)
functions.php: локализуйте, но я не создаю здесь одноразовый номер
wp_localize_script('myjs', 'ajaxVars', array('ajaxurl' => 'admin-ajax.php')));
Вызов JS:
$("#myelement").click(function(e) {
e.preventDefault();
post_id = $(this).data("data-post-id");
user_id = $(this).data("data-user-id");
nonce = $(this).data("data-nonce");
$.ajax({
type: "POST",
dataType: "json",
url: ajaxVars.ajaxurl,
data: {
action: "myfaves",
post_id: post_id,
user_id: user_id,
nonce: nonce
},
success: function(response) {
if(response.type == "success") {
nonce = response.newNonce;
... other stuff
}
}
});
});
Получение PHP:
function myFaves() {
$ajaxNonce = 'myplugin_myaction_nonce_' . $postID;
if (!wp_verify_nonce($_POST['nonce'], $ajaxNonce))
exit('Sorry!');
// Get various POST vars and do some other stuff...
// Prep JSON response & generate new, unique nonce
$newNonce = wp_create_nonce('myplugin_myaction_nonce_' . $postID . '_'
. str_replace('.', '', gettimeofday(true)));
$response['newNonce'] = $newNonce;
// Also let the page process itself if there is no JS/Ajax capability
} else {
header("Location: " . $_SERVER["HTTP_REFERER"];
}
die();
}
Функция отображения внешнего интерфейса PHP, среди которых:
$nonce = wp_create_nonce('myplugin_myaction_nonce_' . $post->ID);
$link = admin_url('admin-ajax.php?action=myfaves&post_id=' . $post->ID
. '&user_id=' . $user_ID
. '&nonce=' . $nonce);
echo '<a id="myelement" data-post-id="' . $post->ID
. '" data-user-id="' . $user_ID
. '" data-nonce="' . $nonce
. '" href="' . $link . '">My Link</a>';
На данный момент я был бы очень благодарен за любые подсказки или указатели в получении WP для регенерации уникального одноразового номера для каждого нового запроса Ajax ...
ОБНОВЛЕНИЕ: я решил свою проблему. Приведенные выше фрагменты кода верны, однако я изменил создание $ newNonce в обратном вызове PHP, добавив строку микросекунд, чтобы обеспечить ее уникальность при последующих запросах Ajax.
Ответы:
Вот очень длинный ответ на мой собственный вопрос, который выходит за рамки простого решения вопроса о создании уникальных одноразовых номеров для последующих запросов Ajax. Это функция «Добавить в избранное», которая была сделана общей для целей ответа (моя функция позволяет пользователям добавлять идентификаторы сообщений с вложениями фотографий в список избранных, но это может применяться к множеству других функций, которые зависят от Ajax). Я закодировал это как отдельный плагин, и некоторые элементы отсутствуют, но этого должно быть достаточно, чтобы представить суть, если вы хотите воспроизвести эту функцию. Он будет работать с отдельным сообщением / страницей, но он также будет работать в списках сообщений (например, вы можете добавлять / удалять элементы в избранном, встроенном через Ajax, и каждое сообщение будет иметь свой уникальный одноразовый номер для каждого запроса Ajax). Имейте в виду, что там
scripts.php
Favorites.js (много отладочных материалов, которые можно удалить)
Функции (внешний интерфейс и действие Ajax)
Чтобы вывести ссылку «Добавить / Удалить избранное», просто вызовите ее на странице / в сообщении через:
Функция внешнего интерфейса:
Функция действия Ajax:
источник
Я действительно должен подвергнуть сомнению причины получения нового одноразового номера для каждого запроса AJAX. Срок действия исходного одноразового номера истекает, но его можно использовать несколько раз, пока он не истечет. Получение javascript через ajax отрицательно сказывается на цели, особенно в случае ошибки. (Цель одноразовых сообщений - небольшая безопасность для связи действия с пользователем в течение определенного периода времени.)
Я не должен упоминать другие ответы, но я новичок и не могу комментировать выше, поэтому в отношении опубликованного «решения» вы получаете новый nonce каждый раз, но не используете его в запросе. Конечно, было бы сложно получить одинаковые микросекунды каждый раз, чтобы соответствовать каждому новому одноразовому номеру, созданному таким образом. Код PHP проверяет исходный одноразовый номер, а javascript предоставляет исходный одноразовый номер ... так что он работает (потому что срок его действия еще не истек).
источник
check_ajax_referer
возвращает -1, а это не то, что нам нужно!