¿Ajax dejó de funcionar cuando no inició sesión?

9

¿Ha tenido un campo de autocompletar funcionando durante meses pero ha dejado de funcionar cuando no ha iniciado sesión? No estoy seguro de cuándo pero dentro de los últimos días o semana (WordPress no actualizado recientemente).

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

en functions.php y no hay errores en ningún lado.

la respuesta que obtengo cuando no estoy conectado es;
from safari ... * URL de solicitud: http: //www.payingforit.org.uk/wp-admin/admin-ajax.php? term = holywe & action = filter_schools & postType = school Método de solicitud: GET Código de estado: 302 encontrado *

cualquier ayuda bienvenida! Corriente continua.

código 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) }

});

funcion en 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
fuente

Respuestas:

6

Editar: He mantenido mi respuesta original a continuación, sin embargo, no estoy seguro de lo que estaba pensando ... Usted debe nunca se necesita disparar do_action( 'wp_ajax...' ).

Si bien no puedo estar seguro de cuál es el problema, el código en la pregunta está más o menos bien (creo que $_POSTdebería estar $_GETcon .getJSON).


Intenta poner esto en la parte superior ...

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

Creo que WordPress no realiza automáticamente acciones ajax para los usuarios que no han iniciado sesión. Potencialmente, los no usuarios podrían hacer cosas que se supone que no pueden hacer.

Probablemente también cambiaría esos $_GETs & %_POSTs $_REQUEST.

Stephen Harris
fuente
gracias Stephen - hizo esos cambios, pero su aún no funciona cuando no está conectado.
v3nt
después de jugar un poco, parece que do_action tiene que venir después de add_filter. Trabajando ahora, así que gracias Stephen ...
v3nt
Tuve el mismo problema con usuarios que no son administradores. Esta solución lo hizo, y el orden también fue importante en mi caso.
brasofilo
2

Código de trabajo final antes de la función 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
fuente
Daniel, el orden no debería importar: tengo un complemento donde las do_actions están en la parte superior, y add_actions vienen justo antes de que se llame a la función. Además, las add_actions no necesitan estar dentro de las declaraciones 'if'. Pero si lo anterior funciona, ¡entonces funciona!
Stephen Harris el