로그인하지 않았을 때 ajax가 작동을 멈췄습니까?


9

몇 개월 동안 자동 완성 필드가 작동했지만 로그인하지 않았을 때 작동이 중지 되었습니까? 언제 며칠 또는 몇 주일인지 확실하지 않습니다 (최근에 WordPress를 업데이트하지 않음).

이미; add_action ( 'wp_ajax_filter_schools', 'filter_schools'); add_action ( 'wp_ajax_nopriv_filter_schools', 'filter_schools');

functions.php에 오류가 없습니다.

로그인하지 않을 때받는 응답은 다음과 같습니다.
safari에서 ... * 요청 URL : http : //www.payingforit.org.uk/wp-admin/admin-ajax.php? term = holywe & action = filter_schools & postType = school 요청 방법 : GET 상태 코드 : 302 발견 *

어떤 도움을 환영합니다! Dc.

jquery 코드

 $( "#userSelectedSchool" ).bind( "keydown", function( event ) {
            if ( event.keyCode === $.ui.keyCode.TAB &&
                    $( this ).data( "autocomplete" ).menu.active ) {
                event.preventDefault();
            }
        }).autocomplete({
            source: function( request, response ) {

                $.getJSON( "/wp-admin/admin-ajax.php", {


            term: extractLast( request.term ), action: 'filter_schools', postType: 'school'
            }, response );

            dataToBeSent = {
                term: extractLast( request.term ), action: 'filter_schools', postType: 'school'
            }

            console.log(request.term);

        }, select: function( event, ui ) {

            var terms = split( this.value );
            // remove the current input
            terms.pop();
            // add the selected item
            terms.push( ui.item.id );
            // add placeholder to get the comma-and-space at the end // ui.item.label
            terms.push( "" );
            this.value = ui.item.label;

            $('input[name=userSchool]').val(ui.item.urn)

            return false;

        }, open: function() { $('.ui-menu').width(300) }

});

functions.php의 함수

add_action('wp_ajax_filter_schools', 'filter_schools');
add_action('wp_ajax_nopriv_filter_schools', 'filter_schools');

function filter_schools(){
    global $wpdb; // this is how you get access to the database

    $str = $_GET['term'];
    $action = $_POST['action'];
    $postType = $_POST['postType'];

    $finalArgs =  array (
        'posts_per_page'=>5,
        'order' => 'ASC',
        'post_type' => 'school'
    );

    $searchSchools = new WP_Query( $finalArgs );
    $mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title LIKE '".$str."%' ");

    $args = array(
        'post__in'=> $mypostids,
        'post_type'=>'school',
        'orderby'=>'title',
        'order'=>'asc'
    );

    $res = new WP_Query($args);
    while( $res->have_posts() ) : $res->the_post();

        global $post;

        $EstablishmentNumber = get_post_meta($post->ID,'EstablishmentNumber', true);
        $URN = get_post_meta($post->ID,'URN', true);
        $add = get_post_meta($post->ID,'address', true);

        $schl = array('post_id'=>$post->ID,'id'=>$EstablishmentNumber, 'label'=>$post->post_title.', '.$add['town'].' '.$add['postcode'] , 'value'=>$EstablishmentNumber, 'urn'=>$URN );
        $matchedSchools[] = $schl;

    endwhile;

    echo json_encode($matchedSchools);
    wp_reset_postdata();
    die(); // this is required to return a proper result
}

답변:


6

편집 : 나는 원래의 대답을 아래에 유지했지만, 내가 생각하고있는 것이 확실하지 않습니다 ... 트리거 할 필요 가 없습니다do_action( 'wp_ajax...' ) .

문제가 무엇인지 확신 할 수 없지만 질문의 코드는 대략 괜찮습니다 ( 와 함께 $_POST있어야 한다고 생각 합니다 ).$_GET.getJSON


이것을 맨 위에 올려보십시오 ...

if(isset($_REQUEST['action']) && $_REQUEST['action']=='filter_schools'):
        do_action( 'wp_ajax_' . $_REQUEST['action'] );
        do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
endif;

WordPress가 로그인하지 않은 사용자에 대해 자동으로 아약스 작업을 수행하지 않는다고 생각합니다. 잠재적으로 비 사용자는 할 수 없었던 일을 할 수 있습니다.

나는 아마도 그 $_GETs & %_POSTs $_REQUEST도 변경할 것입니다 .


감사합니다
Stephen-

약간 혼란스럽게 한 후에 do_action은 add_filter 뒤에 와야합니다. 감사합니다 stephen ...
v3nt

관리자가 아닌 사용자와 동일한 문제가있었습니다. 이 솔루션은 그것을 만들어 내 순서도 중요했습니다.
brasofilo

2

filter_schools () 함수 이전의 최종 작업 코드입니다.

if(isset($_REQUEST['action']) && $_REQUEST['action']=='filter_teachers'):
    add_action('wp_ajax_filter_teachers', 'filter_teachers');
    add_action('wp_ajax_nopriv_filter_teachers', 'filter_teachers');
endif;

if(isset($_REQUEST['action'])):
        do_action( 'wp_ajax_' . $_REQUEST['action'] );
        do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
endif;

Daniel, 순서는 중요하지 않습니다. do_actions가 맨 위에있는 플러그인이 있고 add_actions가 함수가 호출되기 직전에옵니다. 또한 add_actions는 'if'문 안에있을 필요는 없습니다. 그러나 위의 방법으로 작동하면 작동합니다!
Stephen Harris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.