Сегодня большой популярностью пользуются так называемые magazine или «журнальные темы».  Благодаря им можно придать блогу газетный вид или онлайн СМИ. На мой взгляд, такой дизайн сайта весьма привлекателен и удобен, он позволяет собрать на одной странице большое количество самых разнообразных источников информации из разных разделов, благодаря чему Вы максимально точно даете представление читателям о том или ином представленном проекте. Таким образом, если Вы заходите на главную страницу и видите в категориях последние публикации, то понимаете, на какую тематику здесь представлен материал. Этот метод вывода информации более наглядный, чем вывод последних скажем трех, четырех постов блога.

Для своего проекта «Cms-wordpress» я нашел подходящий шаблон в интернете. Все выглядело просто великолепно, но со временем посещаемость моего блога увеличилась и хостер мне сообщил, что у меня большая нагрузка на базу данных. Естественно я стал разбираться в коде и обратил внимание на то, что при запросе к превью для сообщений использовались запросы к базе данных прямо из шаблона:

[php]
<pre><div>
<?php
$id =$post->ID;
$the_content =$wpdb->get_var(«SELECT post_content FROM $wpdb->posts WHERE ID = $id»);
$pattern = ‘!<img.*?src=»(.*?)»!’;
preg_match_all($pattern, $the_content, $matches);
$image_src = $matches[‘1′][0];
?>
<div style=»border: 1px solid #333; width: 140px;height: 110px;background: url(<?php if($image_src != ») { echo $image_src; } else { ?><?php bloginfo(‘template_directory’); ?>/images/no-image.gif<?php } ?>) 0 0 no-repeat;»> </div></pre>
[/php]

Как результат с главной страницы и со страниц категорий получилось около 15-ти лишних запросов к БД, что достаточно значительно, особенно  при посещаемости в 2-3к уников.

Я начал искать выход из ситуации и нашел, таки, альтернативное решение проблемы. Нужно найти или создать, если такого нет, файл functions.php, в него добавляем следующую функцию:

[php]
<div>
<div>
<pre>function catch_that_image() {
global $post, $posts;
$first_img = »;
ob_start();
ob_end_clean();
$output = preg_match_all(‘/<img.+src=[\’»]([^\’»]+)[\’»].*>/i’, $post->post_content, $matches);
$first_img = $matches [1] [0];

if(empty($first_img)){ //Defines a default image
$first_img = «/images/default.jpg»;
}
return $first_img;
}
[/php]

После чего сохраняем внесенные изменения и закрываем файл. В результате при вызове данной функции вы получаете ссылку на первую картинку из поста. В том случае, если такой картинки нет, то будет выводиться изображение по адресу images/default.jpg (можно задать свой адрес).

Далее, для вывода ссылки на изображение нужно, всего на всего, вызвать эту функцию:

[php]<?php echo catch_that_image() ?>[/php]

Но нужно понимать, что выводиться будет лишь тот путь, который необходимо приписать уже в HTML код для тега IMG! К примеру, следующим образом:

[php]

<div>
<div>
<pre><div style=»border: 1px solid #333; width: 140px;height: 110px;background: url(<?php if(catch_that_image() != ») { echo catch_that_image(); } else { ?>http://design-mania.ru/wp-content/themes/Hamasaki-wordpress-theme/images/no-image.gif<?php } ?>) 0 0 no-repeat;»> </div></pre>
</div>
</div>
[/php]

Таким образом, при помощи данного хака получилось значительно уменьшить количество обращений к базе данных и сделать код компактным. Я надеюсь, что мой опыт многим пригодится – ведь вещь нужная. Напоследок хочется добавить, что для вывода изображения из поста в WordPress 2.9 специально добавлена функция post_thumbnail, и если вы работаете на системе этой версии, вам стоит обратить на это внимание.