Пишу в блог, чтобы не забыть, да и моим читателем будет интересно…
Реализация AJAX в плагинах/темах
Реализация AJAX’а при помощи jQuery для версий WordPress начиная с 2.6 по текущую:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /** * Регистрируем переменные фильтра "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 часть будет выглядеть следующим образом:
1 | <a href= "<?php echo get_bloginfo('wpurl') ?>" id= "ajax" >AJAX Link</a> |
Непосредственный вызов:
01 02 03 04 05 06 07 08 09 10 11 12 | 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 для админ панели
С админкой всё на порядок проще, необходимо сделать следующии манипуляции в плагине:
01 02 03 04 05 06 07 08 09 10 11 | // функция которая возвращает что-то... function my_special_action() { // что-то делаем и что-то возвращаем $whatever = $_POST [ 'whatever' ]; $whatever += 10; echo $whatever ; // "умираем" die ; } // хук вида wp_ajax_*** add_action( 'wp_ajax_my_special_action' , 'my_special_action' ); |
Ссылка:
1 | <a href= "<?php echo get_bloginfo('wpurl') ?>" id= "ajax" >AJAX Link</a> |
JavaScript для вызова функции my_special_action:
01 02 03 04 05 06 07 08 09 10 11 12 13 | 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”:
1 2 3 4 | // залогиненный пользователь add_action( 'wp_ajax_my_action' , 'my_action_callback' ); // гость add_action( 'wp_ajax_nopriv_my_action' , 'my_action_callback' ); |
Получить список файлов приаттаченных к посту
01 02 03 04 05 06 07 08 09 10 11 12 | <?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’а:
1 2 3 | if (version_compare( $wp_version , '2.8' , '<' )) { // пишем функции для обратной своместимости } |
Если надо поддерживать PHP 4-ой версии (файлы берем из пакета PEAR::PHP_Compat):
1 2 3 4 5 | 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 в шаблоне, и все?!
на пример для форм =\
все всегда работала отлично.