[Решено!] 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 и его нововведениями!

Заметки к вопросу:
Kama 7.7 лет назад

А как проверяешь-то? Там вроде все банально и просто...

FensterTeam 7.7 лет назад

Так вот и было вроде все просто. Но только по ссыли в одном моменте - все супер, а с этого куска - не идет
Вот проверка :

 $nonce = esc_attr( $_REQUEST['_wpnonce'] );

		if ( !wp_verify_nonce( $nonce, 'fenq_edit_question') ){
		 die('Go get a life script!');
		}else{
campusboy 7.7 лет назад

А что var_dump показывает?

FensterTeam 7.7 лет назад

Дамп чего ?

campusboy 7.7 лет назад

var_dump( esc_attr( $_REQUEST['_wpnonce'] ) ):
Что показывает? Что внутри надо посмотреть, дабы понять

FensterTeam 7.7 лет назад

Дам чего ?

FensterTeam 7.7 лет назад

Так, до сути дошли. Его тупо не тащит. Дает string(0)

FensterTeam 7.7 лет назад

amp; - вот это в url'е мешается. Прямо перед нонсом.

campusboy 7.7 лет назад

А для чего вообще для nonce использовать esc_attr? Значение nonce совпадает или не совпадает. Оно никуда не записывается, нигде не выводится, боятся ведь нечего. А сравнение идёт по белому списку. Совпало или нет. Я бы убрал esc_attr.

Kama 7.7 лет назад

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'], хотя нонс при этом не меняется вроде бы, но все же...

FensterTeam 7.7 лет назад

Проблемы начинаются после wp_redirect.

FensterTeam 7.7 лет назад

не работает именно при связке wp_redirect и wp_nonce_url

Kama 7.7 лет назад

В общем, разобрался. Странно что я сразу на это внимания не обратил. Дополнил описание wp_nonce_url()

Результат функции wp_nonce_url() предназначен для вывода его на экран, и не подойдет для использования его где-то еще, например, в функции wp_redirect(). Потому что перед выводом, функция фильтрует результат с помощью esc_html(), так некоторые символы URL могут оказаться «испорченными».

П.С. Спасибо за вопрос и за решение и вообще за поднятие этой темы. Кому-то это точно может пригодится и может сэкономить время.

FensterTeam 7.7 лет назад

Не за что. Вот допишу свой плагин - скину )mosking