Wordpress: как вызвать функцию плагина с помощью ajax-вызова?
Я пишу плагин Wordpress MU, он включает ссылку с каждым сообщением, и я хочу использовать ajax для вызова одной из функций плагина, когда пользователь нажимает на эту ссылку, а затем динамически обновляет текст ссылки с выходом от этой функции.
Я застрял в ajax-запросе. У меня есть этот сложный, явно хакерский, способ сделать это, но он не совсем работает. Что такое "правильный" или "Wordpress" способ включения функции ajax в плагин?
(Мой текущий код взлома ниже. Когда я нажимаю на ссылку генерации, я не получаю тот же вывод, который я получаю на странице wp, так как, когда я перехожу непосредственно к sample-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
Ответы
Ответ 1
TheDeadMedic не совсем прав. WordPress имеет встроенные возможности AJAX. Отправьте свой запрос ajax в /wp -admin/admin-ajax.php, используя POST с аргументом "action":
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 уже использует некоторые имена действий, поэтому убедитесь, что вы просматриваете файл и не используете те же имена действий, иначе вы случайно попытаетесь сделать что-то вроде удаления комментариев и т.д.
ИЗМЕНИТЬ
Извините, я не совсем понял вопрос. Я думал, вы спрашиваете, как выполнить запрос 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);
}
});
});
});
Ответ 2
среда WordPress
Прежде всего, чтобы достичь этой задачи, он рекомендовал зарегистрировать, затем вставить в очередь jQuery script, который будет перенаправлять запрос на сервер. Эти операции будут зацепляться в wp_enqueue_scripts
action hook. В том же самом крюке вы должны положить wp_localize_script
, чтобы он включал произвольный Javascript. Таким образом, в передней части будет доступен объект JS. Этот объект содержит правильный URL-адрес, который будет использоваться дескриптором jQuery.
Пожалуйста, взгляните на:
Файл: 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 должна быть функция, вызванная вашим вызовом ajax.
Помните суффиксы:
- wp_ajax (разрешить функцию только для зарегистрированных пользователей или операций панели управления)
- 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
}
Надеюсь, что это поможет!
Сообщите мне, если что-то неясно.
Ответ 3
Просто добавьте информацию.
Если вы хотите получить объект из функции метода класса php:
js file
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();
}