Плагин двумя дополнительными SQL запросами присоединяет в исходную выборку данных $wp_query->posts все мета поля, все файлы и картинки, для каждой картинки формируются прямые url на маленькое, среднее и полное изображение. Теперь нет необходимости использовать функции the_post_thumbnail и get_post_meta.
Принцип работы:
Итак допустим мы заходим на главную страницу нашего блога WordPress выдает нам список последних 10 записей. Напомню данные уже находятся в глобальном объекте $wp_query в массиве posts $wp_query->posts. Для начала создается список из ID (номера записей под которыми они хранятся в БД).
Формируем первый SQL запрос:
$query = «SELECT $wpdb->posts.* FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN(’21’,’29’,’30’,’35’,’38’,’42’,’46’,’48’,’49’,’55’) AND $wpdb->posts.post_parent AND $wpdb->posts.post_type = ‘attachment'»;
12 | $query = «SELECT $wpdb->posts.* FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN(’21’,’29’,’30’,’35’,’38’,’42’,’46’,’48’,’49’,’55’) AND $wpdb->posts.post_parent AND $wpdb->posts.post_type = ‘attachment'»; |
Человеческий перевод – найти все дочерние записи для записей с номерами (’21’,’29’,’30’,’35’,’38’,’42’,’46’,’48’,’49’,’55’) И тип искомых записей должен быть “attachment”. То есть короче говоря мы находим все файлы (attachment) который мы загрузили для наших 10 записей.
Вновь формируем список ID: первые 10 ID записей и к нему добавляем ID файлов (атачметнов). Атачменты как и обычные записи хранятся в одной таблице wp_posts.
Теперь воспользуемся функцией update_meta_cache:
$all_meta = update_meta_cache(‘post’, $ar_all_id);
1 | $all_meta = update_meta_cache(‘post’, $ar_all_id); |
$ar_all_id – здесь исходные записи + атачменты
таким образом все сразу попадает в кеш и последующие вызовы get_post_meta будут извлекать значение из кеша. Ну а далее уже дело техники – данные надо аккуратно разложить по полочкам ничего не перепутав. Все мета поля поля добавляются в массив $post->meta, а файлы в массив $post->files причем файлы сразу же сортируются по номеру order (при загрузке это можно указать – порядок сортировки).
Кроме того для каждого файла, если это изображение, рассчитываются полные пути на превьюшки : маленькая(thumbnail), средняя( medium) и полная картинка (full).
Чтобы увидеть картину в целом – очень рекомендую где нибудь в теле главного цикла добавть распечатку:
<? echo ‘[crayon-59c522022bf76539965011 ]’;print_r($post);echo ‘
1 | <? echo ‘[crayon-59c522022bf76539965011 ]’;print_r($post);echo ‘ |
’; ?>
[/crayon]
Теперь, чтобы получить значение мета поля уже не нужно вызывать функцию get_post_meta($post->ID, ‘metaName’,true);
Все поля будут находится в ассоциативном массиве $post->meta то есть для metaName надо использовать $post->meta[‘metaName’].
Все файлы прикрепленные к записи находятся в массиве $post->files.
Например, чтобы проверить загружено ли хоть одно изображение для текущей записи и если загружено то вывести его маленькое картинку, ну а если нет то выводим заглушку.
<? if($post->files[0]):?> <img src=»<?=$post->files[0]->thumbnail?>» /> <?else:?> <img src=»http://ili.com.ua/zaglushka.jpg» /> <?endif?>
12345 | <? if($post->files[0]):?> <img src=«<?=$post->files[0]->thumbnail?>« /><?else:?> <img src=«http://ili.com.ua/zaglushka.jpg» /><?endif?> |
Вот так всего лишь двумя дополнительными SQL убиваем сразу целый табун зайцев 🙂
Функцию
function all_inclusive($posts, $forcibly = 0) можно использовать не как плагин, а просто добавлять в свою тему и затем использовать принудительный вызов:
query_posts(‘cat=2,6,17,38’); $wp_query->posts = all_inclusive($wp_query->posts, 1);
12 | query_posts(‘cat=2,6,17,38’);$wp_query->posts = all_inclusive($wp_query->posts, 1); |
all-inclusive.zip