2 つのフォームと 2 つの個別のナンス フィールド、および 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;
これは基本的にレイアウトのドロップダウンで、設定してオプションに保存できます。これは、初めてセットアップしたときにのみ機能します。それは保存され、すべて問題ありません。しかし、それを変更したい場合、ナンスは失敗します。保存関数 (最初のフォームの場合) は次のようになります。
<?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()
)。
しかし、なぜ失敗するのでしょうか。
2 番目の形式には、別の名前、別の nonce 名、すべてがあります。ajax は機能しますが、ナンスが失敗し、理由がわかりません :\
どんな助けでも大歓迎です。