Ajax funktioniert nicht mehr, wenn er nicht angemeldet ist?

9

Hat ein Autocomplete-Feld seit Monaten funktioniert, funktioniert aber nicht mehr, wenn es nicht angemeldet ist? Ich bin mir nicht sicher, wann, aber innerhalb der letzten Tage oder Wochen (WordPress wurde kürzlich nicht aktualisiert).

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

in functions.php und es gibt nirgendwo Fehler.

Antwort, die ich bekomme, wenn ich nicht angemeldet bin, ist;
von der Safari ... * URL anfordern: http: //www.payingforit.org.uk/wp-admin/admin-ajax.php? term = Holywe & action = filter_schools & postType = Schule Anforderungsmethode: GET Status Code: 302 Gefunden *

jede Hilfe willkommen! Dc.

JQuery-Code

 $( "#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) }

});

Funktion in 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
}
v3nt
quelle

Antworten:

6

Bearbeiten: Ich habe meine ursprüngliche Antwort unten beibehalten, bin mir jedoch nicht sicher, was ich dachte ... Sie sollten niemals auslösen müssen do_action( 'wp_ajax...' ).

Ich kann zwar nicht sicher sein, was das Problem ist, aber der Code in der Frage ist ungefähr in Ordnung (ich denke, $_POSTsollte $_GETmit sein .getJSON).


Versuchen Sie, dies an die Spitze zu setzen ...

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

Ich denke, WordPress führt nicht automatisch Ajax-Aktionen für Benutzer aus, die nicht angemeldet sind. Potenziell Nichtbenutzer könnten Dinge tun, von denen sie nicht annehmen, dass sie dazu in der Lage sind.

Ich würde diese $_GETS & %_POSTS wahrscheinlich auch ändern $_REQUEST.

Stephen Harris
quelle
danke Stephen - hat diese Updates gemacht, aber es funktioniert immer noch nicht, wenn es nicht angemeldet ist.
v3nt
Nach einigem Herumspielen scheint es, dass die do_action nach dem add_filter kommen muss. Arbeiten jetzt so danke stephen ...
v3nt
Ich hatte das gleiche Problem mit Nicht-Administrator-Benutzern. Diese Lösung hat es geschafft, und die Reihenfolge war auch in meinem Fall wichtig.
Brasofilo
2

Endgültiger Arbeitscode vor der Funktion 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;
v3nt
quelle
Daniel, die Reihenfolge sollte keine Rolle spielen: Ich habe ein Plug-In, in dem sich die do_actions oben befinden, und add_actions kommen kurz vor dem Aufruf der Funktion. Außerdem müssen sich die add_actions nicht in 'if'-Anweisungen befinden. Aber wenn das oben genannte funktioniert, dann funktioniert es!
Stephen Harris