2

我制作了带有 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价值。$_POSTdie()

但为什么会失败?

第二种形式有不同的名称,不同的随机数名称,一切。ajax 工作,但随机数失败,我不知道为什么:\

任何帮助表示赞赏。

4

0 回答 0