2016-05-26 5 views
1

У меня есть запрос Ajax, который выглядит следующим образом:Функция не выполняется должным образом, когда вызывается по нажатию кнопки

$('#clear_cache').click(function (event) { 
     event.preventDefault(); 
     var ajaxurl = "clearcache.php"; 
     $.post(ajaxurl, function() { 
      $('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache'); 
     }); 
    }); 

Файл clearcache.php выглядит следующим образом:

do_action('clear_terms', 'clear_transients'); 

function clear_transients() { 
global $wpdb; 
$sql = "delete from {$wpdb->options} 
where option_name like '_transient_cc%'"; 
return $wpdb->query($sql); 
} 

Я знаю Аякс запрос связывает ok с файлом php, потому что, когда я очищаю файл php и нажимаю на свою кнопку, запрос выполняется. Я чувствую, что что-то не так с моим файлом PHP, как функция не была настроена правильно или я делаю неправильный тип запроса. Однако, когда я протестировал этот код php в том же файле, где находится моя кнопка, он работает нормально (но это использовало метод строки запроса). Ваша помощь очень ценится.

+0

Как у * clearcache.php * есть доступ к функциям WordPress? – rnevius

+1

Вы загрузили wordpress в clearcache.php? – Musa

+1

Вы должны действительно рассмотреть возможность избавиться от файла PHP и вместо этого использовать ['wp_ajax_ (действие)'] (https://codex.wordpress.org/AJAX_in_Plugins#Ajax_on_the_Viewer-Facing_Side). – rnevius

ответ

5

Я вижу несколько вещей здесь не так. Если вы используете ajax с WordPress, вы должны запускать его через URL-адрес admin ajax.

Вы не используете do_action должным образом. Первый параметр - это имя действия, а второй - аргументы для действия. Я думаю, вы вводите в заблуждение do_action с add_action.

Лучше всего использовать die() или еще лучше wp_die(), когда вы закончите свой обработчик ajax. В качестве альтернативы, если вы возвращаете какой-либо вывод, вы можете использовать wp_send_json()

Ваш ajaxurl должен всегда указывать на admin-ajax.php. Если вы делаете это на стороне администратора, ajaxurl уже настроен для вас. Если вы делаете это на внешнем интерфейсе вы должны иметь фрагмент кода, как в следующем в вашем functions.php

add_action('wp_enqueue_scripts', 'my_scripts'); 

function my_scripts() { 
    // the file where your javascript is located  
    wp_enqueue_script('ajax-script', get_template_directory_uri() . '/js/script.js', array('jquery')); 

    // this makes the admin url available to your javascript 
    wp_localize_script('ajax-script', 'ajax_object', 
      array('ajaxurl' => admin_url('admin-ajax.php'))); 
} 

Вы можете использовать ajax_object.ajaxurl в вашем JavaScript, чтобы получить правильный URL.

Ваш Javascript может выглядеть примерно так:

$('#clear_cache').click(function (event) { 
     event.preventDefault(); 
     var data = { action: 'clear_transients' } 
     $.post(ajax_object.ajaxurl, data, function() { 
      $('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache'); 
     }); 
    }); 

Если вы работаете это в админке просто заменить ajax_object.ajaxurl с ajaxurl. Обратите внимание на добавление переменной data. Это скажет WordPress, какое действие он должен выполнять.

Для ваших действий вы должны использовать wp_ajax_(action) для стороны администратора или wp_ajax_nopriv_(action) для интерфейса.

Это изменит вашу АЯКС функцию обработчика на что-то вроде этого:

// run on the admin side 
add_action('wp_ajax_clear_transients', 'clear_transients'); 

// or run on the frontend 
add_action('wp_ajax_nopriv_clear_transients', 'clear_transients'); 

function clear_transients() { 
    global $wpdb; 
    $sql = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_cc%'"; 
    $wpdb->query($sql); 
    wp_die(); 
} 

Ваш обработчик Ajax также может быть помещен в functions.php.

Одна вещь, о которой я не упоминал, - nonces. Вы должны использовать nonces для обеспечения безопасности. Nonces используются с check_ajax_referer, чтобы убедиться, что запросы ajax исходят из правильного источника.

+1

Спасибо Jrod, что я сделал в моем вопросе, я упростил несколько вещей, чтобы попытаться найти основную причину проблемы, но я понимаю, что должен был предоставить более подробную информацию, чтобы вы могли лучше настроить ваш ответ. Например, это для плагина Wordpress в области администратора. Я действительно использовал метод wp_enqueue_scripts для jQuery. Со всем сказанным вы указали целый ряд ошибок, на которые мне нужно обратить внимание. Ваш ответ настолько подробный, очень высоко оцененный, о котором вы не знаете. – user1190132

0

Похоже, что вы используете Wordpress, но вызов Ajax идет непосредственно в php-файл без предварительной загрузки необходимых файлов Wordpress.

Посмотрите здесь для получения инструкций по использованию Ajax с Wordpress: https://codex.wordpress.org/AJAX_in_Plugins

+0

Эй, Руди, я просто хочу поблагодарить вас за кучу за то, что поделился этой ссылкой. Прочитав все, это дало мне пример кода, который я мог бы проверить и встать и запустить. Я смог переделать это, чтобы все работало woohoo! Поэтому я очень рад и благодарен за вашу помощь. Основная проблема, с которой я сталкиваюсь, заключалась в том, что я пыталась поместить этот PHP-код в отдельный файл и не ссылаться на него в остальном плагине. Добавление действия php и jQuery в мою основную папку плагина решило все мои проблемы. – user1190132

 Смежные вопросы

  • Нет связанных вопросов^_^