2010-05-25 4 views
12

Я пишу плагин Wordpress MU, он включает ссылку с каждым сообщением, и я хочу использовать ajax для вызова одной из функций плагина, когда пользователь нажимает на эту ссылку, а затем динамически обновляет текст ссылки с выходом из эта функция.Wordpress: как вызвать функцию плагина с помощью вызова ajax?

Я застреваю с запросом ajax. У меня есть этот сложный, явно хакерский, способ сделать это, но он не совсем работает. Что такое «правильный» или «Wordpress» способ включения функции ajax в плагин?

(Мой текущий код хак ниже. Когда я нажимаю генерировать ссылку не получить тот же результат, я получаю на странице в.ч., как, когда я иду прямо в образец-ajax.php в браузере.)

Я получил свой код [1] устанавливается следующим образом:

мю-плагинов/sample.php:

<?php 
/* 
Plugin Name: Sample Plugin 
*/ 
if (!class_exists("SamplePlugin")) { 
    class SamplePlugin { 
    function SamplePlugin() {} 
    function addHeaderCode() { 
     echo '<link type="text/css" rel="stylesheet" href="'.get_bloginfo('wpurl'). 
      '/wp-content/mu-plugins/sample/sample.css" />\n'; 
     wp_enqueue_script('sample-ajax', get_bloginfo('wpurl') . 
      '/wp-content/mu-plugins/sample/sample-ajax.js.php', 
      array('jquery'), '1.0'); 

    } 
    // adds the link to post content. 
    function addLink($content = '') { 
     $content .= "<span class='foobar clicked'><a href='#'>click</a></span>"; 
     return $content; 
    } 
    function doAjax() { // 
     echo "<a href='#'>AJAX!</a>"; 
    } 
    } 
} 
if (class_exists("SamplePlugin")) { 
    $sample_plugin = new SamplePlugin(); 
} 
if (isset($sample_plugin)) { 
    add_action('wp_head',array(&$sample_plugin,'addHeaderCode'),1); 
    add_filter('the_content', array(&$sample_plugin, 'addLink')); 
} 

мю-плагинов/образец/пример-ajax.js.php:

<?php 
if (!function_exists('add_action')) { 
    require_once("../../../wp-config.php"); 
} 
?> 
jQuery(document).ready(function(){ 
    jQuery(".foobar").bind("click", function() { 
     var aref = this; 
     jQuery(this).toggleClass('clicked'); 
     jQuery.ajax({ 
      url: "http://mysite/wp-content/mu-plugins/sample/sample-ajax.php", 
      success: function(value) { 
      jQuery(aref).html(value); 
      } 
     }); 
    }); 
}); 

мю-плагинов/образец/пример-ajax.php:

<?php 
if (!function_exists('add_action')) { 
    require_once("../../../wp-config.php"); 
} 
if (isset($sample_plugin)) { 
    $sample_plugin->doAjax(); 
} else { 
    echo "unset"; 
} 
?> 

[1] Примечание: Следующий учебник получил меня это далеко, но я озадачен в этой точке. http://www.devlounge.net/articles/using-ajax-with-your-wordpress-plugin

ответ

21

TheDeadMedic не совсем прав. WordPress имеет встроенные возможности AJAX. Отправить запрос на Ajax /wp-admin/admin-ajax.php с помощью POST с аргументом «действия»:

jQuery(document).ready(function(){ 
    jQuery(".foobar").bind("click", function() { 
     jQuery(this).toggleClass('clicked'); 
     jQuery.ajax({ 
      type:'POST', 
      data:{action:'my_unique_action'}, 
      url: "http://mysite/wp-admin/admin-ajax.php", 
      success: function(value) { 
      jQuery(this).html(value); 
      } 
     }); 
    }); 
}); 

Затем подключить его в плагин, как это, если вы хотите, чтобы работать для зарегистрированных пользователей :

add_action('wp_ajax_my_unique_action',array($sample_plugin,'doAjax')); 

или повесьте его так, чтобы работать только для не зарегистрированных пользователей:

add_action('wp_ajax_nopriv_my_unique_action',array($sample_plugin,'doAjax')); 

Используйте оба, если вы хотите, чтобы работать для всех.

admin-ajax.php уже использует некоторые имена действий, поэтому убедитесь, что вы просматриваете файл и не используете те же имена действий, иначе вы случайно попытаетесь сделать что-то вроде удаления комментариев и т. Д.

EDIT

Извините, я не совсем понял вопрос. Я думал, вы спрашиваете, как выполнить запрос ajax. Во всяком случае, две вещи, которые я бы постарался:

Во-первых, у вас есть функция echo только для слова AJAX без тега a. Затем попробуйте изменить AJAX вызов, так что имеет как успех и полный обратный вызов:

jQuery(document).ready(function(){ 
    jQuery(".foobar").bind("click", function() { 
     var val = ''; 
     jQuery(this).toggleClass('clicked'); 
     jQuery.ajax({ 
      type:'POST', 
      data:{action:'my_unique_action'}, 
      url: "http://mysite/wp-admin/admin-ajax.php", 
      success: function(value) { 
      val = value; 
      }, 
      complete: function(){ 
      jQuery(this).html(val); 
      } 
     }); 
    }); 
}); 
+0

Я забыл добавить, что админ-ajax.php позаботится о загрузке всей среды WordPress, поэтому вам не нужно беспокоиться о включении любых файлов в ваш плагин. –

+1

Ваш оригинальный ответ был замечательный. Спасибо, что показал мне правильный способ сделать ajax в wp. В вашем объяснении четко видно, что я видел в другом коде, который я прочитал. Примечание: У меня также была ошибка с оценкой javascript, которую я исправил выше в вопросе, поэтому он может быть более полезным справочным вопросом wp, чем вопрос «исправить мою конкретную тупую ошибку».(ссылался на «это» внутри успеха fn для вызова ajax). – Bee

+0

John P мертв правильно, я извиняюсь, мое решение - это ** не ** единственный способ, но это метод, который я нахожу удобным для быстрого AJAX, без необходимости загружать WordPress самостоятельно. – TheDeadMedic

4

WordPress среду

Прежде всего, в целях достижения этой задачи рекомендуется зарегистрировать затем Епдиеим сценарий jQuery, который будет вызывать запрос на сервер. Эти операции будут зацепляться в wp_enqueue_scripts action hook.В том же самом крюке вы должны поставить wp_localize_script, что он используется для включения произвольного Javascript. Таким образом, в передней части будет доступен объект JS. Этот объект содержит правильный URL-адрес, который будет использоваться дескриптором jQuery.

Пожалуйста, обратите внимание на:

  1. wp_register_script(); функции
  2. wp_enqueue_scripts крючок
  3. wp_enqueue_script(); функция
  4. wp_localize_script(); функция

Файл: functions.php 1/2

add_action('wp_enqueue_scripts', 'so_enqueue_scripts'); 
function so_enqueue_scripts(){ 
    wp_register_script('ajaxHandle', get_template_directory() . 'PATH TO YOUR JS FILE', array(), false, true); 
    wp_enqueue_script('ajaxHandle'); 
    wp_localize_script('ajaxHandle', 'ajax_object', array('ajaxurl' => admin_url('admin-ajax.php'))); 
} 

Файл: jquery.ajax.js

Этот файл делает вызов Ajax.

jQuery(document).ready(function($){ 
    //Some event will trigger the ajax call, you can push whatever data to the server, simply passing it to the "data" object in ajax call 
    $.ajax({ 
    url: ajax_object.ajaxurl, // this is the object instantiated in wp_localize_script function 
    type: 'POST', 
    data:{ 
     action: 'myaction', // this is the function in your functions.php that will be triggered 
     name: 'John', 
     age: '38' 
    }, 
    success: function(data){ 
     //Do something with the result from server 
     console.log(data); 
    } 
    }); 
}); 

Файл: functions.php 2/2

Наконец в вашем файле functions.php должна быть функция вызвана вашей АЯКС вызова. Помните суффиксы:

  1. wp_ajax (разрешить функцию только для зарегистрированных пользователей или операций админки)
  2. wp_ajax_nopriv (разрешить функцию для каких-либо пользователей привилегий)

Этих суффиксов плюс композа действия название вашего действия:

wp_ajax_myaction или wp_ajax_nopriv_myaction

add_action('wp_ajax_myaction', 'so_wp_ajax_function'); 
add_action('wp_ajax_nopriv_myaction', 'so_wp_ajax_function'); 
function so_wp_ajax_function(){ 
    //DO whatever you want with data posted 
    //To send back a response you have to echo the result! 
    echo $_POST['name']; 
    echo $_POST['age']; 
    wp_die(); // ajax call must die to avoid trailing 0 in your response 
} 

Надеюсь, это поможет!

Дайте мне знать, если что-то неясно.

+0

add_action ('wp_ajax_nopriv_myaction', 'so_wp_ajax_function'); – Akyegane

0

Просто для добавления информации. Если вы хотите получить объект из функции метода класса PHP:

JS файл

jQuery(document).ready(function(){ 
jQuery(".foobar").bind("click", function() { 
    var data = { 
     'action': 'getAllOptionsByAjax', 
     'arg1': 'val1', 
     'arg2': $(this).val() 
    }; 
    jQuery.post(ajaxurl, data, function(response) { 
     var jsonObj = JSON.parse(response); 
    }); 
}); 

PHP файл

public static function getAllOptionsByAjax(){ 

    global $wpdb; 

    // Start query string 
    $query_string = "SELECT * FROM wp_your_table WHERE col1='" . $_POST['arg1'] . "' AND col2 = '" . $_POST['arg2'] . "' "; 

    // Return results 
    $a_options = $wpdb->get_results($query_string, ARRAY_A); 
    $f_options = array(); 
    $f_options[null] = __('Please select an item', 'my_domain'); 
    foreach ($a_options as $option){ 
     $f_options [$option['id']] = $option['name']; 
    } 
    $json = json_encode($f_options); 
    echo $json; 
    wp_die(); 
} 
Смежные вопросы