Определение, является ли это вызовом Ajax от фронтенда или от бэкенда

Я разрабатываю плагин только для администратора, который использует некоторые вызовы ajax в его интерфейсе. Сам веб-сайт также полагается на ajax, обращается к его фронтенду, также.

Я хотел бы смочь определить, когда WP загружается из-за "простого вызова бэкенда", "вызов бэкенда Ajax" или "Ajax frontend звонят". Вариант использования, в его самой простой форме, мог быть должен загрузить мой плагин только на администраторских страницах или вызовах ajax от них. Кроме того, это помогает не повредить фронтенд при разработке на живом сайте :)

До сих пор я нашел следующее:

  • is_admin() возвращает true на всех вызовах Ajax (который является странным, по моему скромному мнению),
  • поскольку все мои вызовы Ajax сделаны с помощью jQuery, я могу определить вызов Ajax переменной HTTP HTTP_X_REQUESTED_WITH (см. здесь).

Но я все еще не могу выяснить, как различать Ajax администраторской стороны и Ajax передней стороны. Какие-либо идеи?

1
09.10.2011, 23:10
3 ответа

Я понимаю проблему, которую Вы имеете, я думал о том же самом.

Это не действительно проблема tho, это - больше вопрос хорошего дизайна программирования, и имейте хорошее разделение фронтенда и бэкенда.

Теперь способ, которым мне удалось решить это, делает следующее:

Я надеюсь, что Вы называете свое действие Ajax с wp_localize_script. Мы собираемся расшириться, это немного путем реализации его этот путь:

wp_localize_script(
    'my-site-script',
    'my_ajax_object',
    array(
        'my_ajax_url' => admin_url( 'admin-ajax.php' ),
        'my_frontend_call' => 'something-here',
        'my_nonce' => wp_create_nonce( 'my_nonce' )
);

Это ТОЛЬКО добавляется в первой полосе, я уверен, что Вы знаете, как это работает. Теперь, поскольку Вы знаете, что это добавит маленький кусочек JavaScript. Отметьте здесь переменную my_frontend_call, это - важное, которое мы собираемся использовать.

Больше инструкций относительно того, как настроить хороший вызов ajax здесь: ссылка

Теперь у нас есть это все настроенное, теперь мы можем легко реализовать логику в бэкенде как это:

<?php
// Here we check that we are facing the backend.
// This will also be true if we are facing the 
// frontend but making an AJAX call. 
// As you say bad, also IMO
if( is_admin() )
{
        //Now here we are going to put the magic
        if(isset($_POST['my_frontend_call'])){
            // Now these actions are loaded only when `my_frontend_call` is set
            // You can add everything here that only get's loaded on a call where
            // `my_frontend_call` is set
            add_action('wp_ajax_handle_frontend_ajax', 'handle_frontend_ajax_callback');
            add_action('wp_ajax_admin_only_ajax', 'admin_only_ajax_callback');
        }
}

Теперь можно путать это немного с различными переменными от различных местоположений.

Я не знаю, почему это не известная рекомендация. По-моему, это ужасно, когда материал добирается, загрузился, когда это даже не необходимо.

ОБРАТИТЕ ВНИМАНИЕ, что я все еще плохо знаком с WordPress, поэтому возможно, это не хороший метод, я надеюсь, что некоторые профессионалы здесь могут прокомментировать это.

1
19.02.2020, 22:56

is_admin() возвращает true на всех вызовах Ajax (который является странным, по моему скромному мнению),

Это не странно, потому что вызовы Ajax следуют, намного больше администратора загружает логику, чем фронтенд. По существу загрузка Ajax является специализированной версией администраторской загрузки.

Вариант использования, в его самой простой форме, мог быть должен загрузить мой плагин только на администраторских страницах или вызовах ajax от них.

Не уверенный, что Вы имеете в виду здесь. Организация очередей сценария не зависит от Ajax. Если Вы не хотите сценарий на фронтэнде - не загружают его там.

Современный WordPress не полагается на ссылающиеся домены и такой для обнаружения, куда вызов прибыл из, вместо этого данные случаи должны использоваться для источника и поглощенной проверки.

Так как это - Ваш собственный код, чем самый простой способ отличить запрос состоит в том, чтобы иметь запрос, несут явный спор с информацией, это от передней стороны или назад.

1
19.02.2020, 22:56
  • 1
    Позвольте мне попытаться объяснить еще раз. Я не хочу, чтобы мой плагин загрузился на фронтенде (потому что он не имеет никакого отношения к нему и только сделал бы unnessasary инициализацию). Для простых просмотров страницы я могу просто свериться is_admin(). Но я не могу сделать этого для вызовов Ajax, прибывающих из фронтенда, потому что is_admin() возвращает true, также. И именно это я пытаюсь выяснить. P.S. Я не соглашаюсь, что загрузка Ajax является специализированной версией администраторской загрузки. Это не, если это инициируется простым пользователем, посещающим сайт. Пользователь не имеет никакого отношения к администрированию. –  Aurimas 10.10.2011, 10:16
  • 2
    @Aurimas, Если Вы не загружаете свой плагин на фронтэнде затем, Вы не получите запросы от фронтэнда. Не было бы никакого кода для отправки их. I disagree that AJAX load is a specialised version of admin load. Это не догадка, это просто указывает факты технической реализации. Запросы Ajax обработаны файлом в администраторской области и инициировали рычаги администраторской области во время загрузки. –  Rarst 10.10.2011, 12:10
  • 3
    , который я понимаю, но он был бы все еще загружен на вызовах Ajax фронтенда (которые обрабатываются абсолютно отдельным плагином), и я хотел бы избежать этого. –  Aurimas 10.10.2011, 13:35
  • 4
    @Aurimas, я сожалею, но я не следую за Вашей установкой вообще. Возможно, Вы могли добавить некоторые детали к вопросу? –  Rarst 10.10.2011, 14:29
is_admin() returns always true whether it is from back or front ajax request.

Моя идея очень проста. Просто определите два различных имени специально для данного случая поле. (Так, кроме разработчика, никто не будет знать который название который цель.) Пример:

add_action('wp_ajax_{my_ajax_hook}', 'my_ajax_function');
function my_ajax_function() {

    if( isset($_REQUEST['f_nonce']) ){
        $fromFront = true;
        $nonceField = 'f_nonce';
    }else{
        //by default from backend or you can alter;
        $fromFront = false;
        $nonceField = 'b_nonce';
    }

    if ( ! wp_verify_nonce( $_REQUEST[$nonceField], 'my-nonce-pass' ) ) {
        die( 'Security check' ); 

    } else {
        // Do stuff here according to the value of $fromFront;

    }
    exit();
}

Данные данного случая должны быть с каждым вызовом ajax для обеспечения сценария согласно http://codex.wordpress.org/AJAX_in_Plugins.

0
19.02.2020, 22:56

Теги

Похожие вопросы