Использование хуков wp_ajax и wp_ajax_nopriv

3 нояб. 2013 г., 18:27:18
Просмотры: 48.1K
Голосов: 3

Я хочу отправить 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;
    }
}
4
Комментарии

Это не имеет особого значения. У вас возникают какие-то проблемы с одним из методов?

fuxia fuxia
3 нояб. 2013 г. 18:33:41

Нет, никаких проблем, просто я подумал, есть ли какие-то стандартные/предпочтительные практики написания кода.

enam enam
3 нояб. 2013 г. 18:36:36

Я бы оставил как есть... выглядит нормально на мой взгляд.

helgatheviking helgatheviking
3 нояб. 2013 г. 19:02:24

Вы не думали использовать конечные точки REST API вместо этого?

Tom J Nowell Tom J Nowell
27 апр. 2018 г. 22:54:04
Все ответы на вопрос 1
2

Это зависит от того, что именно вы хотите сделать. Если вам нужно показать просто короткое сообщение, используйте один и тот же 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();
    }
}

Проанализируйте ваш конкретный случай, будьте прагматичны. Если сомневаетесь, сравните производительность и сложность обоих подходов.

3 нояб. 2013 г. 19:40:38
Комментарии

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

MFarooqi MFarooqi
11 мар. 2020 г. 17:06:33

А вы слышали о нашем Господе и спасителе PSR-4? Серьёзно, WordPress, время пришло...

Lucas Bustamante Lucas Bustamante
2 мая 2020 г. 23:52:31