Usando los hooks wp_ajax y wp_ajax_nopriv

3 nov 2013, 18:27:18
Vistas: 48.1K
Votos: 3

Quiero enviar una petición ajax y procesarla si el usuario ha iniciado sesión. Por lo tanto, quiero usar los siguientes dos hooks, pero no estoy seguro si los estoy usando correctamente.

¿Es correcto usar la misma función take_action_function para ambos hooks, y luego verificar en la función si el usuario ha iniciado sesión o no? ¿O debería crear dos funciones diferentes, una para realizar la acción y otra simplemente para devolver el mensaje de que el usuario debe iniciar sesión?

add_action('wp_ajax_nopriv_test-action', 'take_action_function');
add_action('wp_ajax_test-action', 'take_action_function');

function take_action_function(){
    if ( is_user_logged_in() ){
       echo "success";
       die;
    } else {
        echo "no ha iniciado sesión";
        die;
    }
}
4
Comentarios

Realmente no importa. ¿Tienes algún problema con un método en particular?

fuxia fuxia
3 nov 2013 18:33:41

No, ningún problema, solo pensaba si existía alguna práctica de codificación estándar/preferida.

enam enam
3 nov 2013 18:36:36

Yo lo dejaría así... me parece bien.

helgatheviking helgatheviking
3 nov 2013 19:02:24

¿Has considerado usar endpoints de REST API en su lugar?

Tom J Nowell Tom J Nowell
27 abr 2018 22:54:04
Todas las respuestas a la pregunta 1
2

Depende de lo que exactamente quieras hacer. Si solo deseas mostrar un mensaje breve, usa el mismo callback para ambos.

Pero si necesitas objetos completamente diferentes y cargar archivos adicionales distintos dependiendo del estado de inicio de sesión, usa callbacks separados.

Ejemplo básico, probablemente no una implementación recomendada. :)

class Ajax_Controller {

    public function __construct( $action ) {

        add_action( "wp_ajax_nopriv_$action", array ( $this, 'logged_out' ) );
        add_action( "wp_ajax_$action",        array ( $this, 'logged_in' ) );
    }

    public function logged_out() {

        require_once __DIR__ . '/Logged_Out_Data_Interface.php';
        require_once __DIR__ . '/Logged_Out_Data.php';
        require_once __DIR__ . '/Logged_Out_View.php';

        $data = new Logged_Out_Data;
        $view = new Logged_Out_View( $data );
        $view->render();
    }

    public function logged_in() {

        require_once __DIR__ . '/Logged_In_Data_Interface.php';
        require_once __DIR__ . '/Logged_In_Data.php';
        require_once __DIR__ . '/Logged_In_View.php';

        $data = new Logged_In_Data;
        $view = new Logged_In_View( $data );
        $view->render();
    }
}

Analiza tu caso de uso, sé pragmático. En caso de duda, compara el rendimiento y la complejidad de ambos enfoques.

3 nov 2013 19:40:38
Comentarios

así que nopriv_ es para llamadas no privadas, había estado luchando con el por qué las funciones solo se ejecutaban para usuarios logueados. Llamé la misma función con los prefijos "wp_ajax_nopriv_" junto a "wp_ajax_" y ahora las funciones están funcionando perfectamente. Gracias

MFarooqi MFarooqi
11 mar 2020 17:06:33

¿Has oído hablar de nuestro señor y salvador PSR-4? En serio, WordPress, ya es hora...

Lucas Bustamante Lucas Bustamante
2 may 2020 23:52:31