All Inclusive. Все включено!
-
Хочу представить уважаемой публике свой плагин.
All Inclusive. Все включено!
Плагин двумя дополнительными SQL запросами присоединяет в исходную выборку данных $wp_query->posts все мета поля, все файлы и картинки, для каждой картинки формируются прямые url на маленькое, среднее и полное изображение.
Принцип работы:
Итак допустим мы заходим на главную страницу нашего блога 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'";
Человеческий перевод – найти все дочерние записи для записей с номерами (по списку) И тип искомых записей должен быть «attachment». То есть короче говоря мы находим все файлы (attachment) который мы загрузили для наших 10 записей.
Теперь вновь формируем ID список: первые в него входят ID 10 записей и к нему добавляем ID файлов (атачметнов). Атачменты как и обычные записи хранятся в одной таблице wp_posts.
Получаем примерно след SQL запрос:$query = "SELECT * FROM $wpdb->postmeta WHERE post_id IN ('21','29','30','35','38','42','46','48','49','55','23','24','31','32','33','43','44') ";
Итак здесь мы выбираем все мета поля (custom fields) для всех записей и всех файлов. Ну а далее уже дело техники – данные надо аккуратно разложить по полочкам ничего не перепутав. Все мета поля поля добавляются в массив $post->meta, а файлы в массив $post->files причем файлы сразу же сортируются по номеру order (при загрузке это можно указать – порядок сортировки).
Кроме того для каждого файла, если это изображение, рассчитываются полные пути на превьюшки : маленькая(thumbnail), средняя( medium) и полная картинка (full).
Чтобы увидеть картину в целом – очень рекомендую где нибудь в теле главного цикла добавть распечатку:<? echo '<pre>';print_r($post);echo '</pre>'; ?>
Теперь, чтобы получить значение мета поля уже не нужно вызывать функцию 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?>
Вот так всего лишь двумя дополнительными SQL убиваем сразу целый табун зайцев 🙂
Функцию
function all_inclusive($posts, $forcibly = 0) можно использовать не как плагин, а просто добавлять в свою тему и затем использовать принудительный вызов:query_posts('cat=2,6,17,38'); $wp_query->posts = all_inclusive($wp_query->posts, 1);
не знаю как тут файлы загрузить в общем пока у себя выкладываю
http://ili.com.ua/all-inclusive.zip
-
Круто, конечно. Но без «но» не обошлось 🙂
Теперь, чтобы получить значение мета поля уже не нужно вызывать функцию get_post_meta
А другие плагины и функции Темы об этом не знают. И будут вызывать — по привычке. Разбежались наши зайцы.
Ничего сейчас мы загоним всех назад.
Второй SQL уберем и получим все мета поля с помощью функции$all_meta = update_meta_cache('post', $ar_all_id);
$ar_all_id — здесь все ID записи + все атачменты
таким образом все сразу попадает в кеш и последующие вызовы get_post_meta будут извлекать значение из кеша.
- Тема «All Inclusive. Все включено!» закрыта для новых ответов.