Антон Шевчук // Web-разработчик

WordPress Quick Tricks #01. AJAX и не только // WordPress

WordPress Logotype

Пишу в блог, чтобы не забыть, да и моим читателем будет интересно…

Реализация 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';
}

Ссылки по теме

© Антон Шевчук 2007-2016