Работа с meta полями (custom fields) и картинками в WordPress ускоряемся в 10 раз.

Если ваша тема активно использует механизм мета полей WordPress то это приведет к неизбежным потерям производительности т.к. каждый вызов get_post_meta или get_post_custom может генерировать лишний SQL к базе данных, если данных нет в кеш. Особенно заметно это будет при создании списка категории или главной страницы, когда эти функции вызываются в теле основного цикла.
Чтобы этого избежать можно подключить фильтр posts_results в фильтре мы получим результат последней выборки – массив постов, далее собираем все ID и формируем новый запрос в таблицу postmeta забираем там сразу все meta для всех постов и это будет намного быстрее чем каждый раз дергать выше упомянутые функции.

Вот так вот одним махом теперь все мета поля сидят у нас в $post. Используйте в теле основного цикла if ( have_posts() ) : while ( have_posts() ) : the_post(); доступ к вашим полям $post->meta[meta_key]

А вот если мы используем WordPress как CMS, часто возникает задача добавлять картинки к короткому анонсу поста, то есть когда html код тега img надо удалить или надо использовать цитату (http://codex.wordpress.org/Template_Tags/the_excerpt) совмесно с картинкой вот как здесь timer.od.ua
В этом случае нужно потратится на еще один SQL и получить сразу все атачменты для сразу всех постов а затем для всех ID получить мета поля. Привожу код:

Сначала получаем ID всех постов из массива $posts, делаем первый SELECT для всех постов получаем все атачменты (см. SQL оператор IN) затем получаем ID всех атачментов напомню, что атачменты это такие же посты только без текста и хранятся они в одной таблице. Складываем два массива $ar_all_id = @array_merge($ar_post_id,$ar_file_id); и делаем запрос теперь уже в таблицу postmeta получаем все мета поля.
Надо также сказать, что WP хранит дополнительную информацию о закачанных картинках в тех же самых мета полях глвное нас интересует поля с именем _wp_attachment_metadata здесь хранятся ссылки на две превьюшки маленькую и среднюю которые автоматически нарезаются WP при загрузке изображений.
Мы обработаем эти данные и создадим дополнительно 3 свойства imgUrl thumbUrl mediumUrl которые содержат соответственно полный url на кртинку, url на маленькую превьюшку и url на среднюю картинку.

Чтобы посмотреть, что где лежит распечатайте переменную $post в теле основного цикла
echo ‘<pre>’; print_r( $post ); echo ‘</pre>’;
Да ! самое главное не путайте где массив, а где свойство объекта а то получите фатальную ошибку.

Чтобы все разложить по полочкам приведу пример что же мы получим в переменной $post .

Вывести любое мета поле например ads_email

Здесь есть тонкий момент все атачменты – картинки или другие файлы zip или rar архивы будут сортироваться по времени и все они будут содержатся в массиве $files, поэтому чтобы все правильно отобразилось картинку надо загружать первой.
Ну а теперь выводим все картинки в виде превьюшек со сcылкой на основную картинку.

Цикл выведет все картинки, дополнительно реализованна проверка mime type у файла if(strstr($value->post_mime_type,’image/’) === false ) continue; в данном случае только изображения.

Напомню что все эти конструкции мы применяем внутри основного цикла вашего шаблона темы!
if ( have_posts() ) : while ( have_posts() ) : the_post();

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> [php]…[/php] [html]…[/html] [css]…[/css] [text]…[/text] [code]…[/code]

  • sdfsdfsdf
  • sdfsdfsdfsdf
  • sdfsdfsdfs
  • sdfsdfsdf
  • sdfsdfsdfsdfs
  • sdfsdfsdfs
  • sdfsdfsdf
  • sdfsdfsdfsdfs