Поддержка Плагины 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

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Yuri

    (@yube)

    Круто, конечно. Но без «но» не обошлось 🙂

    Теперь, чтобы получить значение мета поля уже не нужно вызывать функцию get_post_meta

    А другие плагины и функции Темы об этом не знают. И будут вызывать — по привычке. Разбежались наши зайцы.

    Ничего сейчас мы загоним всех назад.
    Второй SQL уберем и получим все мета поля с помощью функции

    $all_meta = update_meta_cache('post', $ar_all_id);

    $ar_all_id — здесь все ID записи + все атачменты
    таким образом все сразу попадает в кеш и последующие вызовы get_post_meta будут извлекать значение из кеша.

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «All Inclusive. Все включено!» закрыта для новых ответов.