10 убойных хаков для WordPress

Ещё один мой перевод крайне интересной статьи на тему хакинга, модинга и оптимизации любимого Wordpress’а.

2008-й год оказался очень продуктивным для сообщества WordPress. Движок обновлялся часто и стабильно, в конце концов достигнув версии 2.7. На базе WordPress создано множество новых блогов. Ну и конечно обнаружены десятки хаков, которые помогли многим блоггерам улучшить свои блоги :)

В этой статье я покажу вам 10 новых убойных хаков, которые открывают потайные силы вашего любимого блогового движка. К каждому из хаков написаны сопроводительные объяснения, благодаря которым вы не только познаете мощь WordPress, но и поймёте суть проделанных операций.

1. Показ блоков AdSense только для посетителей с поисковиков

Проблема. Всем известный факт — постоянные посетители блога не кликают на рекламные блоки. А те, которые всё-таки кликают, в 90% случаев — посетители, которые пришли с поисковиков.

Другая проблема — это Гугловская «интеллектуальная система определения цен» (smart pricing). В действии это означает, что клик-рейтинг (CTR) низок и деньги, которые вы заработаете за клик, будут поделены на знаменатель в диапазоне от 2 до 10. К примеру, если каждый клик должен приносить вам $1.00, то с системой «smart pricing» вы получите всего лишь $0.10. Обидно, да? К счастью есть решение этой проблемы, которое позволит отображать рекламные блоки AdSense только потенциальным «клиентам», что в свою очередь означает больше кликов и более высокий CTR.

Решение.
1. Открываем файл functions.php вашей темы.
2. Вставляем в него следующий код:

function scratch99_fromasearchengine(){
  $ref = $_SERVER['HTTP_REFERER'];
  $SE = array('/search?', 'images.google.', 'web.info.com', 'search.', 'del.icio.us/search', 'soso.com', '/search/', '.yahoo.');
  foreach ($SE as $source) {
  if (strpos($ref,$source)!==false) return true;
  }
  return false;
}

Готово? Чудненько. Теперь вставьте вот такой код в том месте своего шаблона, где вы хотите отображать рекламный блок. После этого рекламу увидят только те посетители, которые пришли к вам по результатам поисковых систем:

if (function_exists('scratch99_fromasearchengine')) {
  if (scratch99_fromasearchengine()) {
    INSERT YOUR CODE HERE
  }
}

Объяснение кода. Хак начинается с создания функции scratch99_fromasearchengine(). Эта функция содержит массив переменных $SE, в котором вы можете определить поисковые системы. Так что можете добавлять новые поисковики просто добавляя новые элементы в массив.

2. Как избежать дубликатов записей в множественных циклах

Проблема. В связи с недавней популярностью «журнальных» тем, среди пользователей WordPress, которые используют более одного цикла в своём блоге, существует высокая потребность в решении проблемы дубликатов записей в случае использования второго цикла.

Решение. Вот так мы решим эту проблему, используя мощь PHP-массивов:

1. Давайте создадим простой PHP-массив и положим в него все идентификаторы записей с первого цикла.

<?php
$ids = array();
while (have_posts()) : the_post();
the_title();
?>

<?php $ids[]= $post->ID;
endwhile; ?>

Теперь черёд второго цикла: мы используем PHP-функцию in_array(), чтобы проверить содержится ли идентификатор записи в массиве $ids. Если идентификатора в массиве нет, значит мы можем смело показывать запись, так как она не была показана во время прохождения через первый цикл:

<?php
query_posts("showposts=50");
while (have_posts()) : the_post();
if (!in_array($post->ID, $ids)) {
the_title();?>
<br />

<?php }
endwhile; ?>

Объяснение кода. Когда запущен первый цикл, все идентификаторы записей, которые в нём содержатся, отправляются в массив переменных. Когда запущен второй цикл, мы проверяем не был ли отображён идентификатор текущей записи в первом цикле, используя данные с массива.

3. Замена постраничной навигации «Следующие записи» и «Предыдущие записи» на нумерацию страниц

Проблема. По умолчанию, в WordPress есть функции для отображения ссылок на предыдущие и следующие страницы. Это, конечно, лучше чем ничего, но я серьёзно не понимаю почему ребятки в WordPress не сделают нумератор страниц по-умолчанию. Конечно для этого есть специальные плагины, но почему бы не встроить его прямо в тему?

Решение. Для достижения этой цели, мы будем использовать плагин WP-PageNavi и внедрим его прямо в тему:

1. Первым делом, очевидно, качаем плагин.
2. Распаковываем и загружаем файлы wp-pagenavi.php и wp-pagenavi.css в папку с темой.
3. Открываем файл, в который вы хотите вставить нумератор (это может быть index.php, categories.php, search.php и т.д.), и находим следующие строки:

<div class="navigation">
<div class="alignleft"><?php next_posts_link('Previous entries') ?></div>
<div class="alignright"><?php previous_posts_link('Next entries') ?></div>
</div>

Заменяем их на такие:

<?php
include('wp-pagenavi.php');
if(function_exists('wp_pagenavi')) { wp_pagenavi(); }
?>

4. Теперь нам надо «хакнуть» файл плагина. Для этого открываем файл wp-pagenavi.php и ищем следующую строку (должна быть 61-й по счёту):

function wp_pagenavi($before = '', $after = '') {
        global $wpdb, $wp_query;

Нам надо вызвать функцию pagenavi_init(), делаем это следующим образом:

function wp_pagenavi($before = '', $after = '') {
	global $wpdb, $wp_query;
        pagenavi_init();

5. Почти закончили. Осталось только добавить в блог таблицу стилей wp-pagenavi. Для этого открываем файл header.php и добавляем такую строчку:

<link rel="stylesheet" href="<?php echo TEMPLATEPATH.'/pagenavi.css';?>" type="text/css" media="screen" />

Объяснение кода. Хак, в основном, состоит в простом подключении плагина напрямую к файлам темы. Нам также нужно добавить вызов функции pagenavi_init() для уверенности в том, что нумератор отобразится нормально.

4. Автоматическое получение изображений с содержания записи

Проблема. Использовать произвольные поля для показа изображений, которые ассоциированы с вашей записью — это определённо неплохая идея, но многим пользователям WordPress должно прийтись по душе решение, в котором изображения, включенные в запись, вызывают сами себя.

Решение. Насколько мне известно, для этого не существует ни одного плагина. К счастью, следующий цикл сделает всю работу: найдёт изображения в содержании записи и отобразит их на экране.

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>

<?php
$szPostContent = $post->post_content;
$szSearchPattern = '~<img [^\>]*\ />~';

preg_match_all( $szSearchPattern, $szPostContent, $aPics );

$iNumberOfPics = count($aPics[0]);

if ( $iNumberOfPics > 0 ) {
     for ( $i=0; $i < $iNumberOfPics ; $i++ ) {
          echo $aPics[0][$i];
     };
};

endwhile;
endif;
?>

Объяснение кода. Вышеуказанный код в основном состоит из простого цикла WordPress. Единственное отличие в том, что мы использовали PHP и регулярные выражения для поиска изображений в содержании записи вместо простого отображения записи. Если изображения найдены, то они отображаются.

5. Создание кнопки «Отправить в Twitter»

Проблема. Используете Twitter? Если по какой-то причине — да, то почему бы не дать своим читателям возможность напрямую отправлять ссылки на ваши записи в Twitter? Ведь таким образом можно привлечь больше посетителей!

Решение. А решение очень простое в реализации. Единственное что вам нужно сделать — это создать статическую ссылку на Twitter. А так как мы используем блог WordPress, то будем использовать функцию the_permalink() для извлечения ссылки страницы.

<a href="http://twitter.com/home?status=Currently reading <?php the_permalink(); ?>" title="Click to send this page to Twitter!" target="_blank">Share on Twitter</a>

Элегантно и полезно, правда?

6. Использование кавычек

Проблема. Если вы разработчик, который часто публикует фрагменты кода на своём сайте, то, вероятно, сталкивались с ситуацией, когда пользователь говорит вам, что код, который вы опубликовали, не работает. Почему так происходит? Всё дело в кавычках. По умолчанию, WordPress заменяет “универсальные кавычки” на английские “лапки”, которые разрушают работоспособность фрагмента кода.

Решение. Чтобы избавиться от этих назойливых лапок, проделайте следующие операции:
1. Откройте файл functions.php вашей темы. Если такого файла нет — создайте его.
2. Вставьте туда вот такой код:

<?php remove_filter('the_content', 'wptexturize'); ?>

3. Сохраните файл.

Объяснение. Функция wptexturize() автоматически превращает универсальные кавычки в английские лапки. Используя функцию remove_filter(), мы убеждаем WordPress больше такого не делать :)

7. Запрет на комментирование

Проблема. Спам — это действительно проблема каждого блоггера. Akismet, конечно, помогает, но почему бы не предотвратить появление спама ещё более эффективно? Следующий код будет искать реферальную ссылку (с которой была вызвана страница) во время доступа к файлу wp-comments-post.php. Если реферальная ссылка существует и если это ссылка на ваш блог, то комментирование разрешено. В обратном случае страница не загружается и комментарий опубликован не будет.

Решение. Просто скопируйте этот код в файл function.php вашей темы. Если такого файла нет, то давно пора его создать.

function check_referrer() {
    if (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == "") {
        wp_die( __('Please enable referrers in your browser, or, if you\'re a spammer, bugger off!') );
    }
}

add_action('check_comment_flood', 'check_referrer');

8. Использование CSS-эффекта «раздвижных дверей» в навигации WordPress

Проблема. Встроенные функции wp_list_pages() и wp_list_categories() могут вытворять многие вещи, но они не позволяют использовать тег <span>, и поэтому не позволяют реализовать широкоизвестный CSS-эффект «раздвижных дверей». К счастью, с помощью PHP и регулярных выражений, мы можем использовать эту потрясающую технику в своём блоге WordPress.

Создайте необходимые изображения и отредактируйте файл style.css вашей темы. Например:

#nav a, #nav a:visited {
  display:block;
}
#nav a:hover, #nav a:active {
  background:url(images/tab-right.jpg) no-repeat 100% 1px;
  float:left;
}
#nav a span {
  float:left;
  display:block;
}
#nav a:hover span {
  float:left;
  display:block;
  background: url(images/tab-left.jpg) no-repeat 0 1px;
}

2. Теперь можно редактировать файл header.php. Просто скопируйте и вставьте, в зависимости от своих нужд, следующие строки:

Для списка страниц:

<ul id="nav">
<li><a href="<?php echo get_option('home'); ?>/"><span>Home</span></a></li>
<?php echo preg_replace('@\<li([^>]*)>\<a([^>]*)>(.*?)\<\/a>@i', '<li$1><a$2><span>$3</span></a>', wp_list_pages('echo=0&orderby=name&exlude=181&title_li=&depth=1')); ?>
</ul>

Для списка категорий:

<ul id="nav">
<li><a href="<?php echo get_option('home'); ?>/"><span>Home</span></a></li>
<?php echo preg_replace('@\<li([^>]*)>\<a([^>]*)>(.*?)\<\/a>@i', '<li$1><a$2><span>$3</span></a>', wp_list_categories('echo=0&orderby=name&exlude=181&title_li=&depth=1')); ?>
</ul>

Объяснение кода. В этом примере мы используем параметр echo=0 в функциях wp_list_pages() и wp_list_categories(), что позволяет нам получить результат функции без его вывода на экран. Потом результат функции используется другой, уже PHP-функцией — preg_replace() и, наконец, отображается с тегами <span>, добавленными между тегами <li> и <a>.

9. Показ случайных картинок в шапке вашего блога WordPress

Проблема. На самом деле это не проблема, но результат многим нравится :)

Решение.
1. Как только вы выбрали несколько изображений для шапки блога, переименуйте их в 1.jpg, 2.jpg, 3.jpg и так далее. Можете использовать столько картинок, сколько пожелаете.
2. Загрузите картинки в папку wp-content/themes/ваша_тема/images
3. Откройте файл header.php и вставьте в него такой код:

$num = rand(1,10);
<div id="header" style="background:transparent url(images/header<?php echo $num;?>.png) no-repeat top left;">

4. Вот и всё! Теперь шапка вашего блога будет постоянно, в случайном порядке, изменяться при каждом новом посещении какой-нибудь страницы или записи.

Объяснение кода. Ничего сложного здесь нет. Мы просто определили переменную $num, используя PHP-функцию rand() для получения случайных чисел в диапазоне от 1 до 10. Потом мы добавили результат переменной $num в путь, который используется текущей темой.

10. Список ваших будущих записей

Проблема. Как и многие блоггеры, вы вероятно желаете увеличить приток посетителей и количество RSS-подписчиков. Хороший способ заинтересовать читателей и в дальнейшем посещать ваш блог — отображать список запланированных на будущее статей.

Решение. Откройте любой файл вашей темы и вставьте следующие строки:

<?php
$my_query = new WP_Query('post_status=future&order=DESC&showposts=5');
if ($my_query->have_posts()) {
    while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <li><?php the_title(); ?></li>
    <?php endwhile;
}
?>

Объяснение кода. В этом коде мы создали пользовательский запрос, используя WordPress-класс WP_Query для отправки запроса к базе данных и для получения оттуда 5-ти последних запланированных статей. А потом мы использовали простой цикл WordPress для отображения их заголовков.

  1. 19:56

    Спасибо огромное за Вашу работу! Мне многое пригодится….

  2. 17:19

    Хак №3 не отображается правильно. Отображается текст
    Страница 1 из 212»
    Это показывает, что страниц у меня 1 из 14
    Ничего не поняла с этой навигации
    Как сделать, чтобы нормально отображалось и чтобы был не текст, а кнопочки?

  3. 20:05

    В таком случае советую вам плагин WP-PageNavi, он же используется на Бузочке. Всё отлично настраивается – хотите кнопочки, хотите текст. Всё меняется с помощью CSS.

  4. 18:30

    Я умею пользоваться WP-PageNavi, все отлично, но хотелось бы без плагина… Это невозможно?

↓ Можете опубликовать своё мнение