Использование хуков wp_ajax и wp_ajax_nopriv
Я хочу отправить ajax запрос и обработать его, если пользователь авторизован. Поэтому я хочу использовать следующие два хука, но не уверен, правильно ли я их использую.
Правильно ли использовать одну и ту же функцию take_action_function
для обоих хуков, а затем проверять в функции, авторизован пользователь или нет? Или следует создать две разные функции, одну для выполнения действия, а другую только для возврата сообщения о том, что пользователь должен быть авторизован?
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 "not logged";
die;
}
}

Это зависит от того, что именно вы хотите сделать. Если вам нужно показать просто короткое сообщение, используйте один и тот же callback для обоих случаев.
Но если вам нужны совершенно разные объекты и загрузка разных дополнительных файлов в зависимости от статуса входа в систему, используйте отдельные callbacks.
Базовый пример, вероятно, не рекомендуемая реализация. :)
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();
}
}
Проанализируйте ваш конкретный случай, будьте прагматичны. Если сомневаетесь, сравните производительность и сложность обоих подходов.

Итак, nopriv_ предназначен для вызовов без привилегий (No private call). Я долго бился над тем, почему функции работают только для авторизованных пользователей. Пока я не вызвал ту же функцию с префиксами "wp_ajax_nopriv_" вместе с "wp_ajax_", и теперь функции работают отлично. Спасибо!
