
Пишу в блог, чтобы не забыть, да и моим читателем будет интересно…
Реализация AJAX в плагинах/темах
Реализация AJAX’а при помощи jQuery для версий WordPress начиная с 2.6 по текущую:
/**
* Регистрируем переменные фильтра "query_vars"
*
* @param array $vars
* @return array
*/
function plugin_query_vars($vars) {
$vars[] = 'plugin_query';
return $vars;
}
add_filter('query_vars', 'plugin_query_vars');
/**
* Парсим запрос и что-то делаем
*
* @param $wp
*/
function plugin_parse_request($wp) {
// что-то делаем если присутствует перменная "plugin_query" в запросе
if (array_key_exists('plugin_query', $wp->query_vars)){
switch ($wp->query_vars['plugin_query']) {
case 'option1':
// что-то делаем
break;
case 'option2':
// делаем что-то другое
break;
}
// die - дабы предотвратить дальнейшую работу WP
die();
}
}
// регестрируемся на хук wp
add_action('wp', 'plugin_parse_request');
// не забываем подключить jQuery
wp_enqueue_script('jquery');
HTML часть будет выглядеть следующим образом:
<a href="<?php echo get_bloginfo('wpurl') ?>" id="ajax">AJAX Link</a>
Непосредственный вызов:
jQuery(document).ready(function($) {
// AJAX Link
$('#ajax').click(function(){
var data = {
'plugin_query':'option1'
};
$.post($(this).attr("href"), data, function(response){
// response ...
});
return false;
});
});
Реализация AJAX для админ панели
С админкой всё на порядок проще, необходимо сделать следующии манипуляции в плагине:
// функция которая возвращает что-то...
function my_special_action() {
// что-то делаем и что-то возвращаем
$whatever = $_POST['whatever'];
$whatever += 10;
echo $whatever;
// "умираем"
die;
}
// хук вида wp_ajax_***
add_action('wp_ajax_my_special_action', 'my_special_action' );
Ссылка:
<a href="<?php echo get_bloginfo('wpurl') ?>" id="ajax">AJAX Link</a>
JavaScript для вызова функции my_special_action:
jQuery(document).ready(function($) {
$('#ajax').click(function(){
var data = {
action: 'my_special_action',
whatever: 1234
};
$.post(ajaxurl, data, function(response){
// response ...
alert('Сервер нам ответил: ' + response);
});
return false;
});
});
Для WordPress с версии 2.8 появился новый хук “wp_ajax_nopriv_my_action”:
// залогиненный пользователь
add_action('wp_ajax_my_action', 'my_action_callback');
// гость
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
Получить список файлов приаттаченных к посту
<?php
$attachment = get_children('post_parent='.$post->ID.'&post_type=attachment');
if ($attachment) :?>
<div class="attachment">
<ul>
<?php foreach ($attachment as $file) : ?>
<li><a href="<?php echo $file->guid ?>" title="<?php echo $file->post_title ?>"><?php echo $file->post_title ?></a></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif;?>
Совместимость версий
Если надо поддерживать старые версии WordPress’а:
if (version_compare($wp_version, '2.8', '<')) {
// пишем функции для обратной своместимости
}
Если надо поддерживать PHP 4-ой версии (файлы берем из пакета PEAR::PHP_Compat):
if (version_compare(phpversion(), '5.0.0', '<')) {
require_once 'compatibility/scandir.php';
require_once 'compatibility/file_put_contents.php';
require_once 'compatibility/file_get_contents.php';
}
Хе-хе, попробуем как это применить в своем плагинчике.
Кстати, ваш Syntax highlighter офигенен :)
Прикольно. Спасибо за пост.
эм… а зач так?
поч не прописать в начале где путь к js в шаблоне, и все?!
на пример для форм =\
все всегда работала отлично.