Utilizzo degli hook wp_ajax e wp_ajax_nopriv
Voglio inviare una richiesta ajax e desidero elaborarla se l'utente ha effettuato l'accesso. Pertanto, voglio utilizzare i seguenti due hook, ma non sono sicuro di utilizzarli correttamente.
È corretto utilizzare la stessa funzione take_action_function
per entrambi gli hook e poi verificare nella funzione se l'utente ha effettuato l'accesso o meno? Oppure dovrei creare due funzioni diverse, una per eseguire l'azione e l'altra solo per restituire il messaggio che l'utente dovrebbe essere autenticato?
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 "successo";
die;
} else {
echo "non autenticato";
die;
}
}

Dipende da cosa vuoi fare esattamente. Se vuoi mostrare solo un breve messaggio, usa lo stesso callback per entrambi.
Ma se hai bisogno di oggetti completamente diversi e caricare file aggiuntivi differenti in base allo stato di accesso, usa callback separati.
Esempio base, probabilmente non un'implementazione consigliata. :)
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();
}
}
Analizza il tuo caso d'uso, sii pragmatico. In caso di dubbi, confronta le prestazioni e la complessità di entrambi gli approcci.

quindi nopriv_ è per le chiamate non private, avevo combattuto per capire perché le funzioni funzionavano solo per gli utenti loggati. Ho chiamato la stessa funzione con i prefissi "wp_ajax_nopriv_" insieme a "wp_ajax_" e ora le funzioni funzionano perfettamente. Grazie
