Подгрузка новых постов в WordPress на AJAX (jQuery)

18 Февраль 2011

Если в нашем блоге доскроллить страницу почти до самого низа — начинается подгрузка новых постов.
В этом посте я хочу рассказать о том, как сделать так в своем блоге на WordPress.
Для этого нам придется редактировать текущую тему блога. Темы хранятся в папка_блога/wp-content/themes/название_темы/

Краткое описание работы

С помощью JavaScript мы проверяем, доскроллил ли пользователь до конца страницы. Если да, то отправляем AJAX запрос PHP скрипту, который отдаем нам нужные посты. При этом будем передавать доп. параметры, например: количество постов, номер страницы, смещение и прочее.

JQuery

Начнем с JQuery. Скачайте скрипт, если у вас его еще нет. Подключаем JQuery в шапку блога. Для этого редактируем файл header.php.

<script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/jquery.js"></script>

У нас используется такой путь. Файл jquery.js должен лежать в одной папкой с темой блога.

Теперь переходим к файлу functions.php. Может получится так, что у вас этого файла нет. В этом случае создайте его в папке темы.
В WordPress есть так называемые экшены (actions), которые можно привязать к выполнению какой-либо функции. Нам необходимо добавить наш JavaScript в тег head наших страниц. Начнем с добавления экшена (он может быть расположен после функции) и добавления функции.

<?php
add_filter('wp_head', 'javascript_page');
function javascript_page() {
	global $query_string;
?>
<script type="text/javascript">
	/* Наш код будет размещен здесь */
</script>
<?php
}
?>

Добавляем JavaScript вместо комментария. Объявляем несколько полезных переменных и проверяем не доскроллил ли еще пользователь до конца страницы.

$(document).ready(function() {
	var number = 5; //количество постов
	var offset = 0; //смещение постов
	var page_number = 2; //номер страницы
	var busy = false;
    var loc = '<?php echo $query_string; ?>';
    if(loc==""){
        $(window).bind('scroll', function(e) {
            if($(window).scrollTop() + $(window).height() > $(document).height() - 250 && !busy) {
                busy = true;
                $.post('<?php bloginfo('siteurl') ?>/wp-admin/admin-ajax.php', {
                    action: 'and_action',
                    off: offset+number,
                    pagenumber: page_number,
                    query_string: '<?php echo $query_string; ?>'
                    }, function(data) {
                        if(data == "") {
                            //больше нет постов
                        }
                        else {
                            offset = offset+number;
                            $('.content').append(data);
                            busy = false;
                            page_number += 1;
                       }
                });
            }
        });
    }
});

Если в вашей теме есть отдельные файлы под каждую страницу — главная, один пост и прочее, то можно убрать эту проверку:

var loc = '<?php echo $query_string; ?>';
if(loc==""){

У нас в теме только один файл, который выводит все страницы сразу.
В этой строке $(document).height() – 250 можно установить в какой момент вы хотите начинать подгружать новые посты. Например, у нас это 250 px до конца страницы.

PHP

Продолжаем работать в functions.php
Переходим в верхнюю часть файла и добавляем два экшена (один для людей с правами администратора, второй для всех остальных) и функцию для получения новых постов.

add_action('wp_ajax_and_action', 'get_posts_page');
add_action('wp_ajax_nopriv_and_action', 'get_posts_page');

function get_posts_page() {
/* Описание функции будет здесь */
}

Обратите внимание, мы вызываем and_action, который мы ранее отправляли в функции JQuery $.post(). Теперь нам нужно написать функцию, которая выбирает все подходящие посты и выводит их в нашей верстке.
Объявляем глобальную переменную (класс) $wpdb, формируем строку запроса и в цикле выводим все наши посты.

$query_string = $_POST['query_string'];
global $wpdb;
query_posts($query_string . '&posts_per_page=5&post_status=publish&offset='.$_POST['off']);	//получаем посты
if ( have_posts() ) : while ( have_posts() ) : the_post();
/* Вывод постов в цикле */
endwhile; endif;
die();

На место моего комментария в цикл необходимо вставить HTML код вывода поста. Его нужно скопировать из файла index.php
У нас он вот такой:

<div class="post" id="post-<?php the_ID(); ?>">
	<h2 class="storytitle">
		<?php  if (!is_single() && !is_page() ) { echo '<a href="'; the_permalink() ; echo '">';}; the_title();
	if ( !is_single() && !is_page() ) echo '</a>'; ?>
	</h2>
	<em class="date"><?php the_time('j F Y') ?></em>
	<div class="storycontent">
		<?php the_content(); ?>

		<div class="feedback">
			<!-- Я убрал отсюда социальные кнопки, чтобы сократить код -->
			<span class="author"><?php the_author() ?></span>
			<?php wp_link_pages(); ?>
			<span class="comment"><?php comments_popup_link(__('0 комментариев'), __('1 комментарий'), __('% комментариев')); ?></span>
		</div>
	</div>
</div>
<?php comments_template( '', true ); ?>

Вот и все.

Скачать

Скачать файл functions.php в архиве можно здесь. Демо можно посмотреть на главной странице нашего блога.

Проверка валидности номера пластиковой карты

8 Февраль 2011

Недавно на просторах интернета мы встретили вот такую картинку с инфографикой. Картинка повествует о том, что означают эти загадочные цифры на пластиковых картах и как можно проверить валидность (правильность) номера кредитной карты.

Зачем-то мы решили сделать сервис для проверка валидности пластиковых карт. Никаких данных вашей карты мы не сохраняем. Параноики могут заглянуть в исходный код страницы и найти там чистый JavaScript без отправки данных куда-либо. Надеемся, что кому-то это будет полезно и не будет использоваться в незаконных целях.

А еще недавно мы сделали новый сайт по акции. Клиент, в очередной раз, остался очень доволен хорошим сайтом за совсем скромные деньги. Торопитесь, мы не знаем сколько еще продлится все это.

Делаем заглушку для сайта

26 Сентябрь 2010

Многие заказчики на время разработки основного сайта просят сделать так называемую заглушку.

Некоторые ставят на пустой домен картинку вроде этой. Можно еще любую картинку из этих. Иногда просто надпись «сайт в разработке». Что должна делать и на что способна заглушка, когда речь идет о нормальном сайте?

  • кратко и понятно рассказать о том, что за сайт здесь будет;
  • помочь собрать адреса эл. почты потенциальных клиентов;
  • заинтересовать пользователей и ждать открытия.

За последние две недели нам пришлось делать сразу две заглушки: для сайта он-лайн покера и химического завода. Сначала про покер.

Сразу понятно, о чем будет этот сайт, объяснения излишне. Карты сделаны интерактивными. У пользователя на руках две карты и пять в прикупе. Если пользователь вводит свою электронную почту, то мы запоминаем его комбинацию и при открытии сайта будем начислять бонусы в зависимости от величины комбинации. Поиграть в покер самому можно вот здесь.

А справа и слева как-будто сидят какие-то мужчины и «курят» карты (судя по мастям в дыме).

На заглушке для химического завода уже сложнее также явно показать, чем они занимаются, поэтому пришлось это описать.

Название, контакты, краткое описание продукции и/или услуг компании — все это на сайте есть. Кроме того, небольшая игра с молекулами. Кликая на шарики их можно соединять. Была идея сделать это все немного интереснее, но реакция Internet Explorer версий 6-8 и FireFox на такие штуки заставила нас остановиться.

Вся анимация на страницах сделана с помощью волшебной библиотеки Raphael.js. Техническая реализация достаточно проста и описывать ее тут нет смысла.

Только, молю, не спрашивайте, почему карты в скрипте не сделаны в виде массива.