ajax a cessé de fonctionner lorsqu'il n'est pas connecté?


9

Un champ de saisie semi-automatique fonctionne depuis des mois mais a cessé de fonctionner lorsqu'il n'est pas connecté? Je ne sais pas quand mais au cours des derniers jours ou de la semaine (wordpress non mis à jour récemment).

J'ai déjà; add_action ('wp_ajax_filter_schools', 'filter_schools'); add_action ('wp_ajax_nopriv_filter_schools', 'filter_schools');

dans functions.php et il n'y a aucune erreur nulle part.

la réponse que j'obtiens lorsque je ne suis pas connecté est;
de safari ... * URL de demande: http: //www.payingforit.org.uk/wp-admin/admin-ajax.php? term = Holywe & action = filter_schools & postType = school Méthode de demande: GET Status Code: 302 Trouvé *

toute aide bienvenue! Dc.

code 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) }

});

fonction dans 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
}

Réponses:


6

Edit: J'ai gardé ma réponse d'origine ci-dessous, cependant, je ne suis pas sûr de ce que je pensais ... Vous ne devriez jamais avoir besoin de déclencher do_action( 'wp_ajax...' ).

Bien que je ne peux pas être sûr de ce que la question est, est le code dans la question est à peu près correct (je pense $_POSTdevrait être $_GETavec .getJSON).


Essayez de mettre cela en haut ...

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

Je pense que WordPress ne fait pas automatiquement des actions ajax pour les utilisateurs non connectés. Les non-utilisateurs potentiels pourraient faire des choses qu'ils ne sont pas censés pouvoir faire.

Je changerais probablement ces $_GETs & %_POSTs $_REQUESTaussi.


merci Stephen - fait ces mises à jour mais cela ne fonctionne toujours pas lorsqu'il n'est pas connecté.
v3nt

après avoir mal tourné un peu, il semble que l'action do_action doive venir après l'add_filter.
Je

J'ai eu le même problème avec les utilisateurs non administrateurs. Cette solution l'a fait, et l'ordre était également important dans mon cas.
brasofilo

2

Code de travail final avant la fonction 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, l'ordre ne devrait pas avoir d'importance: j'ai un plug-in où les do_actions sont en haut et add_actions viennent juste avant l'appel de la fonction. De plus, les add_actions n'ont pas besoin d'être à l'intérieur des instructions 'if'. Mais si ce qui précède fonctionne, alors cela fonctionne!
Stephen Harris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.