WordPress AJAX devuelve 0 cuando el usuario no ha iniciado sesión

3 minutos de lectura

Esto se ha preguntado antes, pero he intentado muchas cosas para que funcione, y no sé lo que me estoy perdiendo. Tengo un directorio de miembros para un sitio de WordPress que usa Ajax para llamar y mostrar perfiles de miembros. También te permite ordenarlos alfabéticamente por nombre. Ambos funcionan perfectamente cuando se inicia sesión, pero devuelven ‘0’ cuando se cierra la sesión. Lo he probado con varias cuentas con diferentes permisos, y siempre que uno esté conectado con cualquier cuenta, funciona bien.

tengo ambos

add_action('wp_ajax_nopriv_load-filter', 'load_members');

y

add_action('wp_ajax_load-members', 'load_members');

agregado, que he leído debería hacer que funcione tanto para los usuarios que iniciaron sesión como para los que no iniciaron sesión. Supongo que los usuarios que no han iniciado sesión no pueden acceder a algo esencial para el funcionamiento de Ajax, posiblemente el archivo ajax-admin.php sobre el que sigo leyendo, pero las correcciones que he intentado no hacen nada.

Intenté depurar en Chrome (F12, verificar la red en busca de errores, etc.) y no encontré información útil. También agregué líneas console.log() a varias partes de mi código para determinar si se estaba llamando, y todas se llamaron como se esperaba, iniciaron o cerraron sesión.

de todos modos, aquí está mi código de functions.php (sin incluir la parte add_action):

     function load_members()
           {

              $letter = $_POST[ 'letter' ];

                    if($letter == "all") {

                        $args = array(
                            'role' => 'Subscriber', );

                            $user_query = new WP_User_Query($args);

                            ob_start();

                            global $user;

                            if (!empty($user_query->results)) {
                            foreach ($user_query->results as $user) {
                            get_template_part('template', 'directory');
                      }
                                } else {
                echo '<div class="center" >No users found.</div>';}
                $response = ob_get_contents();
                    ob_end_clean();

                    echo $response;

                    die(1);

Y aquí está la función de mi página de directorio:

function members_get(catID) {
jQuery("a.ajax").removeClass("current");
jQuery("#category-post-content").fadeOut();
$('.' + catID).addClass("current"); //adds class current to the  menu item being displayed so you can style it with css
jQuery("#loading-animation").show();
var ajaxurl="<?php echo admin_url("admin-ajax.php'); //must echo it?>';
console.log(ajaxurl);
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {"action": "load-members", letter: catID },
success: function(response) {
jQuery("#category-post-content").fadeIn();
jQuery("#category-post-content").html(response);
jQuery("#loading-animation").hide();
return false;

}

Disculpas por el formato en la sección functions.php; pegaba raro y traté de arreglarlo. ¿Alguien tiene alguna idea de lo que está pasando?

El problema es con sus llamadas a add_action.

add_action('wp_ajax_nopriv_load-filter', 'load_members');
add_action('wp_ajax_load-members', 'load_members');

Tienes razón al pensar que necesitas ambos wp_ajax_(action) y wp_ajax_nopriv_(action). (action) debe ser idéntico para ambos.

Actualización para:

add_action( 'wp_ajax_nopriv_load-members', 'load_members' );
add_action( 'wp_ajax_load-members', 'load_members' );

  • Gracias, este era el problema. ¡Me tomó mucho, mucho tiempo solucionar un problema tan pequeño!

    – Grant Hendricks

    10 de enero de 2017 a las 3:47

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad