Wordpress AJAX в header.php


В настоящее время я изучаю Wordpress AJAX, но продолжаю получать сообщение об ошибке (поэтому функция успеха не выполняется)

В настоящее время я изменил header.php (двадцатитрехлетней темы), чтобы включить JavaScript, который отправляет запрос AJAX.

<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js"></script>
<![endif]-->
<?php wp_head(); ?>
<script type="text/javascript">

    jQuery(document).ready(function($){

    //AJAX
    $.ajax({

        type: "GET",
        dataType: "json",
        url: "<?php echo admin_url('admin-ajax.php'); ?>;",
        data: {
            action: 'xn_get_event'
        },
        success: function(response){
            alert("Yes");
        },
        error: function(response){
            alert("omg!");
        }

    }); //END OF AJAX (SEND REQUEST)
}); //END OF READY FUNCTION
</script>

А затем в папку темы я включил еще один PHP-файл под названием json-feed.php внутри папки функций (так theme_name/functions/json-feed.php ) и здесь я включил следующее код:

header('Content-Type:application/json');


//Needs to include wp-load.php file! 
if(file_exists('../../../../wp-load.php')):
    include '../../../../wp-load.php';
else: //Double checking in case the path is wrong.
    include '../../../../../wp-load.php';
endif;

//AJAX Handler
add_action('wp_ajax_nopriv_xn_get_event', 'xn_get_event');
add_action('wp_ajax_xn_get_event', 'xn_get_event');

function xn_get_event(){

    echo "Wow!";

}

А затем, когда я захожу на веб-сайт, он продолжает предупреждать меня "Боже мой!", и я не знаю, почему он продолжает возвращать ответ об ошибке!

Author: wordwannabe, 2014-08-30

2 answers

Существует тонны вопросов об использовании Ajax, поэтому ваш вопрос можно легко пометить как дублированный, но я вижу такие БОЛЬШИЕ ошибки, что не могу сказать вам, что вопрос дублируется без объяснения ваших ошибок.

  1. Ajax в Wordpress обрабатывается в admin-ajax.php файл, мы уверены, что вы правильно отправили запрос ajax (см. Параметр url вызова Ajax). Таким образом, вам не нужно включать wp-load.php , Wordpress уже загружен.
  2. Файл json-feed.php из папки вашей темы никогда не выполняется, если вы include не используете его в functions.php файл или любой файл-потомок.
  3. Вам всегда нужно выходить после завершения действия ajax (если вы используете wp_send_json и связанные функции, которые уже выполняют выход).
  4. У вас опечатка в параметре URL запроса Ajax (см. ; в конце).
  5. Тип контента, указанный в заголовке repsonse, не соответствует реальному типу контента ответа вывод.

Для быстрого рабочего примера включите этот код в functions.php файл и исправьте опечатку в параметре URL:

add_action('wp_ajax_nopriv_xn_get_event', 'xn_get_event');
add_action('wp_ajax_xn_get_event', 'xn_get_event');

function xn_get_event(){

    echo 'Wow!';
    exit;

}

Кроме того, рекомендуется не включать встроенный javascript непосредственно в header.php или любой другой файл шаблона, когда javascrpt имеет зависимости, такие как ваш код. Вы никогда не знаете, как обрабатываются зависимости. Например, ваш javascript зависит от jQuery, но файл jQuery можно переместить в нижний колонтитул, и ваш код jQuery перестанет работать потому что он печатается до загрузки jQuery. Используйте соответствующие функции Wordpress для включения javascript и управления зависимостями. Гораздо лучшим кодом было бы:

add_action('wp_ajax_nopriv_xn_get_event', 'xn_get_event');
add_action('wp_ajax_xn_get_event', 'xn_get_event');

function xn_get_event(){

    $data = array( 'message' => 'Wow!' );
    wp_send_json( $data );

}

add_action('wp_enqueue_scripts', 'cyb_enqueue_scripts');
function cyb_enqueue_scriptss() {

    //Register my script
    //Update with the correct path to javscript file
    wp_register_script('my-script', get_stylesheet_directory_uri(). '/js/my-script.js', array( 'jquery' ) );

    //Enqueue scripts and dependencies
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'my-script' );

    //Localize js variables to be used in my-script.js
    $scriptData = array(
                      'ajaxurl' => admin_url('admin-ajax.php')
                     );
    wp_localize_script( 'my-script', 'my_script_data', $scriptData );

}

Содержание my-script.js файл может быть примерно таким:

jQuery(document).ready(function($){

    //AJAX
    $.ajax({

        type: "GET",
        dataType: "json",
        url: my_script_data.ajaxurl,
        data: {
            action: "xn_get_event"
        }
    })
    .done( function( response ) {
            alert( response.message );
    })
    .fail( function( response ){
            alert( "omg!" );
    });
});

Для получения дополнительной информации прочитайте документацию по WP Ajax API или любые другие миллионы вопросов и примеров об использовании Ajax в Wordpress.

Примечание: код не проверен.

 5
Author: cybmeta, 2017-04-13 12:37:34

Попробуйте использовать complete вместо succes.

Кроме того, включение wp-нагрузки не является лучшей практикой, в чем причина, по которой вы ее включаете?

 -3
Author: stijn.aerts, 2014-08-30 10:13:40