[Решено!] wp_save_reidrect / wp_redirect + wp_nonce_url (wp_nonce)
Проблема:
Пишу плагин. Вроде не нуб в коде и wordpress. Возникла странная проблема. Кусок кода:
$nonce_url = wp_nonce_url('/wp-admin/admin.php?page=fenquestingedit', 'fenq_edit_question') . "&fenq_id=" . $wpdb->insert_id; wp_redirect($nonce_url); exit;
При проверке на странице-адресате, nonce фэйлится.
Решение:
Оказалось все просто. Запихиваем в переменную нонс, создаваемый функцией wp_create_nonce и все. А далее конструируем url сами, без wp_nonce_url.
Код для моего случая:
$nonce = wp_create_nonce('fenq_edit_question'); $nonce_url = '/wp-admin/admin.php?page=fenquestingedit&_wpnonce=' . $nonce . "&fenq_id=" . $wpdb->insert_id;
Kama, прошу внести в описание функции wp_nonce_url заметку касательно данного случая. Я то не новичок, а вот если кто попадет в эту ловушку - поможет.
P.S. Ошибка вызвана обновлением wordpress 4.1 и его нововведениями!
Так вот и было вроде все просто. Но только по ссыли в одном моменте - все супер, а с этого куска - не идет
Вот проверка :
$nonce = esc_attr( $_REQUEST['_wpnonce'] ); if ( !wp_verify_nonce( $nonce, 'fenq_edit_question') ){ die('Go get a life script!'); }else{
А что var_dump показывает?
Дамп чего ?
var_dump( esc_attr( $_REQUEST['_wpnonce'] ) ):
Что показывает? Что внутри надо посмотреть, дабы понять
Дам чего ?
Так, до сути дошли. Его тупо не тащит. Дает string(0)
amp; - вот это в url'е мешается. Прямо перед нонсом.
А для чего вообще для nonce использовать esc_attr? Значение nonce совпадает или не совпадает. Оно никуда не записывается, нигде не выводится, боятся ведь нечего. А сравнение идёт по белому списку. Совпало или нет. Я бы убрал esc_attr.
Kama, прошу внести в описание функции wp_nonce_url заметку касательно данного случая.
Я если честно не понял проблему данного случая. Например, вот код тут запускал:
$nonce_url = wp_nonce_url('/wp-admin/admin.php?page=fenquestingedit', 'fenq_edit_question') . "&fenq_id=65"; echo $nonce_url; //> /wp-admin/admin.php?page=fenquestingedit&_wpnonce=2750bbebff&fenq_id=65
Как видим, параметр _wpnonce создается - все ок!
При получении надо проверить так:
if( wp_verify_nonce( $_GET['_wpnonce'], 'fenq_edit_question' ) ) echo "Проверка пройдена"; else echo "Проверка не пройдена";
П.С. campusboy правильно заметил что не надо эскейпить $_REQUEST['_wpnonce'], хотя нонс при этом не меняется вроде бы, но все же...
Проблемы начинаются после wp_redirect.
не работает именно при связке wp_redirect и wp_nonce_url
В общем, разобрался. Странно что я сразу на это внимания не обратил. Дополнил описание wp_nonce_url()
Результат функции wp_nonce_url() предназначен для вывода его на экран, и не подойдет для использования его где-то еще, например, в функции wp_redirect(). Потому что перед выводом, функция фильтрует результат с помощью esc_html(), так некоторые символы URL могут оказаться «испорченными».
П.С. Спасибо за вопрос и за решение и вообще за поднятие этой темы. Кому-то это точно может пригодится и может сэкономить время.
Не за что. Вот допишу свой плагин - скину )
А как проверяешь-то? Там вроде все банально и просто...