web-dev-qa-db-ja.com

JSON - 権限制限エラー?

Webサイト上の投稿を絞り込むためのドロップダウンが2つあります。 2番目のドロップダウンは最初のものの選択に基づいて設定されます。

[CATEGORY] + [SUB-CATEGORY] = SEARCH

問題は、時折2番目のドロップダウンが表示されず、コンソールに次のように表示されることです。

POST: http://localhost/site/wp-admin/admin-ajax.php
{"html":"","error":"Permission error"}

それは実際にはどういう意味ですか?そして、どのようにしてそれを修正しますか?これはエラーを返すコードです。

add_action( 'wp_ajax_wpse158929_get_terms_for_cpt', 'wpse158929_get_terms_for_cpt' );
add_action( 'wp_ajax_nopriv_wpse158929_get_terms_for_cpt', 'wpse158929_get_terms_for_cpt' );

function wpse158929_get_terms_for_cpt() {
$ret = array( 'html' => '', 'error' => false );

if ( ! check_ajax_referer( 'wpse158929_get_terms_for_cpt_submit_', 'nonce', false /*die*/ ) ) {
$ret['error'] = __( 'Permission error', 'wpfm' );
} else {
$post_type = isset( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : '';
$taxonomy = isset( $_REQUEST['taxonomy'] ) ? $_REQUEST['taxonomy'] : '';
$current_selected = isset( $_REQUEST['current_selected'] ) ? $_REQUEST['current_selected'] : '';

if ( ! $post_type || ! $taxonomy ) {
    $ret['error'] = __( 'Params error', 'wpfm' );
} else {
    global $wpdb;
    $sql = $wpdb->prepare( 'SELECT t.slug FROM ' . $wpdb->terms . ' t'
        . ' JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tt.term_id = t.term_id'
        . ' JOIN ' . $wpdb->term_relationships . ' AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id'
        . ' JOIN ' . $wpdb->posts . ' AS p ON p.ID = tr.object_id'
        . ' WHERE tt.taxonomy = %s AND p.post_type = %s AND p.post_status = %s'
        . ' GROUP BY t.slug'
        , $taxonomy, $post_type, 'publish' );
    $include = $wpdb->get_col($sql);
    $ret['html'] = preg_replace( '/<\/?select[^>]*>/', '', my_dropdown_categories( $taxonomy, $current_selected, $include ) );
}
}

wp_send_json( $ret );
}

本当にありがとう :)

1
Guit4eva

あなたの問題はあなたがnonceをチェックしていてnonceが古くなっているということです。あなたのケースでnonceを使う必要性について具体的なコメントをするのは難しいですが、一般的にnonceはクエリーではなくデータ送信にのみ使われるべきです。

1
Mark Kaplun