2013-08-15 3 views
1

В моем плагине у меня есть код jQuery-Ajax, который обрабатывает данные формы и добавляет их в базу данных сразу после нажатия кнопки. Поскольку у многих людей есть другой путь к их плагиновой папке, мне было интересно, если бы все равно стандартизовал URL-адрес, указывающий на файл обработки данных PHP. Смотрите мой пример ниже:Правильный способ ссылки Ajax URL

$.ajax({ 
    type: "POST", 
    url: "url_to_php_file_path.php", 
    data: data, 
    cache: false, 
    success: function() { 
     alert.("added"); 
    } 
}); 
+2

Я бы предложил предложить в вашем плагине вариант для явного указания пути кода PHP при использовании вашего плагина. – crush

+1

@crush Я бы определенно НЕ рекомендовал это делать. Пожалуйста, см. Мой подробный ответ. – Community

+0

@usernotfound Нет, согласен. Я не понимал, что это было для WordPress в то время. – crush

ответ

9

Выяснение целевой URL

В WordPress, все запросы AJAX должны быть сделаны по следующему адресу:

http://www.example.com/wp-admin/admin-ajax.php 

Вы не должны сделать запрос AJAX непосредственно в файл, находящийся в плагине или тематический каталог.

Кроме того, не жестко закодировать вышеупомянутую URL, вместо этого вы должны использовать следующую функцию для построения URL:

<script> 
    ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>"; 
</script> 

В качестве альтернативы выше, вы можете использовать wp_localize_script(), но это не требуется, это тоже хорошо.

Примечание. Не беспокойтесь о части «admin», этот URL-адрес является правильным для всех пользователей, включая пользователей без регистрации (гостя).

Расскажите WordPress, какую функцию использовать для запроса AJAX

Вы должны позволить WordPress знать, какая функция должна обработать ваш запрос AJAX.

Для этой цели вы будете создавать пользовательскую функцию, и зарегистрировать его с помощью wp_ajax_* и wp_ajax_nopriv_* крюки:

add_action('wp_ajax_mycustomfunc', 'mycustomfunc'); // Logged-in users 
add_action('wp_ajax_nopriv_mycustomfunc', 'mycustomfunc'); // Guest users 
function mycustomfunc() { 

    $whatever = esc_html($_POST['whatever']); 
    echo 'It works: '.$whatever; 
    exit; // This is required to end AJAX requests properly. 
} 

Не забудьте указать «mycustomfunc» в запросе AJAX слишком

И, наконец, вот как вы бы сделать надлежащий запрос AJAX:

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

     var my_data = { 
      action: 'mycustomfunc', // This is required so WordPress knows which func to use 
      whatever: "yes it is" // Post any variables you want here 
     }; 

     jQuery.post(ajax_url, my_data, function(response) { 
      alert('Got this from the server: ' + response); 
     }); 
    }); 
})(jQuery); 

Объединить все это

Если вы должны были поместить все это в один файл, вот как бы это сделать:

// Register my custom function for AJAX processing 
add_action('wp_ajax_mycustomfunc', 'mycustomfunc'); // Logged-in users 
add_action('wp_ajax_nopriv_mycustomfunc', 'mycustomfunc'); // Guest users 
function mycustomfunc() { 

    $whatever = esc_html($_POST['whatever']); 
    echo 'It works: '.$whatever; 
    exit; // This is required to end AJAX requests properly. 
} 


// Inline JavaScript 
add_action('wp_footer', 'my_inline_js'); 
function my_inline_js() { ?> 

    <script> 
     // Set the "ajax_url" variable available globally 
     ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>"; 

     // Make your AJAX request on document ready: 
     (function ($) { 
      $(document).ready(function() { 

       var my_data = { 
        action: 'mycustomfunc', // This is required so WordPress knows which func to use 
        whatever: "yes it is" // Post any variables you want here 
       }; 

       $.post(ajax_url, my_data, function(response) { // This will make an AJAX request upon page load 
        alert('Got this from the server: ' + response); 
       }); 
      }); 
     })(jQuery); 
    </script> 

    <?php 
} 

Примечание: Для ajax_url части, вы могли бы использовать wp_localize_script() вместо того, чтобы установить его вручную, но он менее гибок, так как требует указания существующего скрипта в очереди, которого у вас может не быть.

Примечание. Кроме того, для вывода встроенного JavaScript вручную на страницу используется правильный крючок wp_footer. Если вы используете wp_localize_script(), тогда вместо этого вы должны использовать крюк wp_enqueue_scripts.

+0

Я использовал admin_head для крючка встроенного действия, так как он не работал с нижним колонтитулом. –

+0

@AndreYonadam, если он не работает с ['wp_footer'] (http://codex.wordpress.org/Plugin_API/Action_Reference/wp_footer) (или [' in_admin_footer'] (http://goo.gl/MZVTNW) для бэкэнд), то это, скорее всего, потому, что ваш скрипт расположен ** до **, устанавливается переменная 'ajax_url'. Чтобы исправить это, вы можете либо вызвать свой скрипт на '$ (document) .ready()', либо либо убедиться, что переменная 'ajax_url' установлена ​​_before_, то ваш скрипт включен, например, с помощью [' wp_head'] (http : //codex.wordpress.org/Plugin_API/Action_Reference/wp_head) (или ['admin_head'] (http://goo.gl/kTnoGy) для бэкэнд). – Community

+0

in_admin_footer только что сработал. –

1

Во-первых, все Ajax звонки должны быть зарегистрированы через wp_ajax

add_action('wp_ajax_add_something', 'add_something'); 

Этот код должен быть в файле плагина, наряду с функцией add_something

function add_something(){ 
    //logic 
} 

Затем в переднем конце вы должны использовать глобальную переменную ajaxurl, поставляемую Wordpress.

$.ajax({ 
    type: 'POST', 
    url: ajaxurl, 
    data: { 
     action: 'add_something', //this was defined earlier 
     data: 'other data here' 
    }, 
    success: function(data){ 
     //do whatever with the callback 
    } 
}); 

Это исключает необходимость явно объявить любой URL, и как таковой, является надлежащим образом выполнять Ajax звонки в Wordpress.

+0

Будьте осторожны, 'wp_ajax_yourfunc' будет работать только для зарегистрированных пользователей. Обязательно используйте как 'wp_ajax_yourfunc', так и' wp_ajax_nopriv_yourfunc', чтобы сделать вызов ajax для гостей и зарегистрированных пользователей. Также вы забыли упомянуть, что переменная JavaScript 'ajaxurl' должна быть установлена ​​в PHP на' admin_url ('admin-ajax.php'); иначе это не сработает. Ура! – Community

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