我制作了带有 2 个表单和两个单独的 nonce 字段的选项页面,以及我使用 AJAX 保存的其他输入字段。
问题是,每次我通过 AJAX 保存并调用我的函数来保存选项时,我都会得到在 nonce 失败时发生的“Busted”值。
布局部分如下所示:
<?php
$form_html = json_decode( get_option('form_html', '') );
$out = '';
$out .= '<form id="page_layout_options" class="page_layout_options" method="post" action="#">';
if (isset($form_html) && $form_html != '') {
$out .= $form_html;
} else{
$out .= '
<table class="form-table">
<tbody>
<tr>
<td class="title">
<h4>'.esc_html__('Front page layout', 'mytheme').'</h4>
</td>
<td class="module_select">
<select name="page_element_module" id="page_element">
<option value="posts3_left">'.esc_html__('3 posts 2 left', 'mytheme').'</option>
<option value="posts3_right">'.esc_html__('3 posts 2 right', 'mytheme').'</option>
<option value="posts2">'.esc_html__('2 posts', 'mytheme').'</option>
<option value="single_post">'.esc_html__('Single post', 'mytheme').'</option>
<option value="gallery">'.esc_html__('Gallery', 'mytheme').'</option>
<option value="poll">'.esc_html__('Poll', 'mytheme').'</option>
<option value="image">'.esc_html__('Image', 'mytheme').'</option>
</select>
<div id="add_layout" class="add_layout button">'.esc_html__('Add module', 'mytheme').'</div>
<div class="layout_draggable"></div>
<div class="button save_layout hidden">'.esc_html__('Save layout', 'mytheme').'</div>
<div class="button clear_layout hidden">'.esc_html__('Clear layout', 'mytheme').'</div>
</td>
<td class="page_select">
</td>
</tr>
</tbody>
</table>
<input type="submit" class="submit button button-primary disabled" value="'.esc_html__('Save', 'mytheme').'"><span class="spinner"></span><span class="saved_options"></span>
'.wp_nonce_field( 'page_layout_nonce', 'ajaxnonce', true, false ).'
<input type="hidden" name="layout" value="" class="hidden_layout_input">
<input type="hidden" name="offset" value="" class="hidden_offset_input">
<input type="hidden" name="gallery_no" value="" class="gallery_no">
<input type="hidden" name="image_no" value="" class="image_no">
<input type="hidden" name="poll_no" value="" class="poll_no">
<input type="hidden" name="form_html" value="" class="form_html">';
}
$out .= '</form>
</div>';
echo $out;
echo '<div id="tab_2" class="hidden"><p>'.esc_html__('Choose page layout for category page.', 'mytheme').'</p>';
$cat_form_html = json_decode( get_option('cat_form_html', '') );
$cat_out = '';
$cat_out .= '<form id="cat_page_layout_options" class="cat_page_layout_options" method="post" action="#">';
if (isset($cat_form_html) && $cat_form_html != '') {
$cat_out .= $cat_form_html;
} else{
$cat_out .= '
<table class="form-table">
<tbody>
<tr>
<td class="title">
<h4>'.esc_html__('Category page layout', 'mytheme').'</h4>
</td>
<td class="module_select">
<select name="page_element_module" id="cat_page_element">
<option value="posts3_left">'.esc_html__('3 posts 2 left', 'mytheme').'</option>
<option value="posts3_right">'.esc_html__('3 posts 2 right', 'mytheme').'</option>
<option value="posts2">'.esc_html__('2 posts', 'mytheme').'</option>
<option value="single_post">'.esc_html__('Single post', 'mytheme').'</option>
</select>
<div id="add_cat_layout" class="add_cat_layout button">'.esc_html__('Add module', 'mytheme').'</div>
<div class="cat_layout_draggable"></div>
<div class="button save_cat_layout hidden">'.esc_html__('Save layout', 'mytheme').'</div>
<div class="button clear_cat_layout hidden">'.esc_html__('Clear layout', 'mytheme').'</div>
</td>
</tr>
</tbody>
</table>
<input type="submit" class="submit button button-primary disabled" value="'.esc_html__('Save', 'mytheme').'"><span class="spinner"></span><span class="saved_options"></span>
'.wp_nonce_field( 'cat_page_layout_nonce', 'cat_ajaxnonce', true, false ).'
<input type="hidden" name="cat_layout" value="" class="hidden_cat_layout_input">
<input type="hidden" name="cat_offset" value="" class="hidden_cat_offset_input">
<input type="hidden" name="cat_form_html" value="" class="cat_form_html">';
}
$cat_out .= '</form>
</div>';
echo $cat_out;
它基本上是布局的下拉列表,我可以设置它们并将它们保存到我的选项中。这仅在我第一次设置时才有效。它可以节省,一切都很好。但是如果我想修改它,我的 nonce 会失败。保存函数(对于第一种形式)如下所示:
<?php
add_action( 'wp_ajax_mytheme_page_layout_options', 'mytheme_page_layout_options' );
add_action( 'wp_ajax_nopriv_mytheme_page_layout_options', 'mytheme_page_layout_options' );
if (!function_exists('mytheme_page_layout_options')) {
function mytheme_page_layout_options() {
if (!current_user_can('manage_options')){
die ('You can\'t change this!');
}
if ( !isset( $_POST['ajaxnonce'] ) || /*check_admin_referer( 'page_layout_nonce' )*/ !wp_verify_nonce( $_POST['ajaxnonce'], 'page_layout_nonce' ) ){
die ($_POST['ajaxnonce']);
}
if ( isset($_POST['layout']) ) {
update_option('layout', stripslashes( $_POST['layout'] ) );
$layout = stripslashes( $_POST['layout'] );
}
if ( isset($_POST['offset']) ) {
update_option('offset', stripslashes( $_POST['offset'] ) );
$offset = stripslashes( $_POST['offset'] );
}
if ( isset($_POST['gallery_no']) ) {
update_option('gallery_no', $_POST['gallery_no'] );
$gallery_no = $_POST['gallery_no'];
} else{
$gallery_no = 0;
}
if ( isset($_POST['image_no']) ) {
update_option('image_no', $_POST['image_no'] );
$image_no = $_POST['image_no'];
} else{
$image_no = 0;
}
if ( isset($_POST['poll_no']) ) {
update_option('poll_no', $_POST['poll_no'] );
$poll_no = $_POST['poll_no'];
} else{
$poll_no = 0;
}
if ( isset($_POST['form_html']) ) {
update_option('form_html', stripslashes( $_POST['form_html'] ) );
$form_html = stripslashes( $_POST['layout'] );
}
for ($i=$gallery_no; $i > 0; $i--) {
if ( isset($_POST["gallery_$i"]) ) {
update_option("gallery_$i", $_POST["gallery_$i"]);
}
}
for ($j=$image_no; $j > 0; $j--) {
if ( isset($_POST["image_$j"]) ) {
update_option("image_$j", $_POST["image_$j"]);
}
}
for ($k=$poll_no; $k > 0; $k--) {
if ( isset($_POST["poll_$k"]) ) {
update_option("poll_$k", $_POST["poll_$k"]);
}
}
die();
}
}
现在在我的网络选项卡中,admin-ajax.php
我可以正确看到所有$_POST
值
我知道它失败了,因为在我的预览中我从(你可以看到我把它放在我的)中得到了ajaxnonce
价值。$_POST
die()
但为什么会失败?
第二种形式有不同的名称,不同的随机数名称,一切。ajax 工作,但随机数失败,我不知道为什么:\
任何帮助表示赞赏。