2

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 は機能しますが、ナンスが失敗し、理由がわかりません :\

どんな助けでも大歓迎です。

4

0 に答える 0