Usando los hooks wp_ajax y wp_ajax_nopriv
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;
}
}

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.

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
