Работая над фотоблогом, я накопил множество полезных сниппетов, позволяющих упростить работу с изображениями и представить их в лучшем виде. Я решил все их собрать в одном месте. Начну со сниппетов, работающих с изображениями на странице поста.
Facebook хоть и является мощной социальной сетью, но до сих пор его скрипты не отличаются полной совместимостью с WordPress. Часто при попытке отправить в Facebook ссылку на пост скрипт социальной кнопки не может определить миниатюру и описание. Нижеприведённый код формирует социальное описание страницы специально для Facebook. В качестве картинки извлекается миниатюра поста, а если таковой нет, то показывается изображение default_icon.jpg. В качестве заголовка используется название поста, а в качестве описания берется такая же цитата поста, какая отправляется и в RSS.
ID,'_thumbnail_id',false);
$thumb = wp_get_attachment_image_src($thumb[0], false);
$thumb = $thumb[0];
$default_img = get_bloginfo('stylesheet_directory').'/images/default_icon.jpg';
?>
<meta property="og:title" content="" />
<meta property="og:description" content="" />
<meta property="og:url" content=""/>
<meta property="og:image" content="" />
<meta property="og:title" content="" />
<meta property="og:url" content=""/>
<meta property="og:description" content="" />
<meta property="og:image" content="" />
Этот код можно вставлять в любой шаблон, используемый как при выводе отдельноо поста, так и отдельной страницы, например, в header.php или в footer.php.
Работа с произвольными полями может до бесконечности расширять возможности блога. Иногда требуется в определенное произвольное поле добавлять ссылку на миниатюру поста. Чтобы не делать это каждый раз вручную, можно автоматизировать этот процесс – определить миниатюру поста, и добавить ссылку на эту миниатюру в указанное произвольное поле.
function w_thumbnail_src() {
if (has_post_thumbnail()) {
$thumb = wp_get_attachment_image_src(get_post_thumbnail_id(), 'thumbnail');
return $thumb[0]; // урл миниатюры
} else {
return '/images/default.jpg'; // или урл дефолтной картинки, если миниатюры нет
}
}
add_action('publish_page', 'add_custom_field_automatically', 'w_thumbnail_src');
add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_id) {
global $wpdb;
if(!wp_is_post_revision($post_id)) {
add_post_meta($post_id, 'Image', w_thumbnail_src(), true);
}
}
Код вставляется в файл functions.php. Ссылка на миниатюру автоматически вставляется в произвольное поле Image. Если миниатюры нет, то можно вместо нее вставлять ссылку на стандартную картинку (например, логотип блога).
Иногда требуется вывести все изображения (или несколько), присоединенных к посту, например, для создания слайдер изображений или нестандартной галереи. Сделаем это, причем дадим возможность устанавливать размер изображения и класс ссылки, ведущей на него. В файл functions.php добавляем код функции, выводящей все изображения, присоединенные к посту:
function display_images_in_list($size = thumbnail) {
if($images = get_posts(array(
'post_parent' => get_the_ID(),
'post_type' => 'attachment',
'numberposts' => -1, // показать все, либо установите значение конкретное больше нуля
'post_status' => null,
'post_mime_type' => 'image',
'order' => 'ASC',
))) {
foreach($images as $image) {
$attimg = wp_get_attachment_image($image->ID,$size);
$attlink = wp_get_attachment_url($image->ID);
$title = wp_get_attachment_url($image->title);
static $count = 0;
$count += 1;
echo ''.$attimg.'';
}
}
}
В файл single.php вставляем вызов функции:
</pre>
<p>Аргументом у функции служит размер изображения:</p>
<ul>
<li>full – изображение выводится в полную величину</li>
<li>thumbnail, medium, large, пользовательское название размера миниатюры – изображение выводится в виде миниатюры соответствующего размера</li>
</ul>
<p>В коде функции можно задать класс ссылке на изображение.</p>
<p><a href="https://n-wp.ru/wp-content/uploads/2013/07/tiaurus-20130729201238.jpg" rel="attachment wp-att-21591"><img src="https://n-wp.ru/wp-content/uploads/2013/07/tiaurus-20130729201238.jpg" alt="Полезные сниппеты для фотоблога - оформление и вывод изображений в посте (2)" title="Полезные сниппеты для фотоблога - оформление и вывод изображений в посте (2)" width="1123" height="382" class="alignnone size-full wp-image-21591" /></a></p>
<p>При выводе галереи изображений, присоединенных к посту, шорткодом gallery, в эту галерею попадает и изображение, являющееся миниатюрой поста. Однако если миниатюра поста уже выводится в начале записи, то смысла выводить ее еще раз нет. Поэтому не лишним будет способ исключения миниатюры поста из галереи. Вставляем в файл <em>functions.php</em>:</p>
<pre>
function exclude_thumbnail_from_gallery($null, $attr)
{
if (!$thumbnail_ID = get_post_thumbnail_id())
return $null;
remove_filter('post_gallery', 'exclude_thumbnail_from_gallery');
if (!isset($attr['exclude']) || empty($attr['exclude']))
$attr['exclude'] = array($thumbnail_ID);
elseif (is_array($attr['exclude']))
$attr['exclude'][] = $thumbnail_ID;
$gallery = gallery_shortcode($attr);
add_filter('post_gallery', 'exclude_thumbnail_from_gallery', 10, 2);
return $gallery;
}
add_filter('post_gallery', 'exclude_thumbnail_from_gallery', 10, 2);
Теперь миниатюра поста всегда будет исключаться из галереи.
Есть способ и более простой, он подходит тем, кто автоматически выводит галерею изображений, встроив функцию вывода в файл single.php. В этом случае чтобы исключить миниатюру из галереи, в файле single.php нужно использовать:
ID ) . '"]'); ?>
При выводе изображений в виде стандартной галереи WordPress автоматически добавляет к изображениям атрибуты title и alt. Версия WordPress 3.5+ не добавляет к изображениям атрибут title, считая его почему-то несущественным, но тем не менее есть атрибут alt, то он будет присоединен к изображению. Иногда бывают ситуации, когда эти атрибуты нужно удалить и у изображений, выведенных с помощью стандартного шорткода gallery. Чтобы это сделать, добавьте в файл functions.php:
function tp_gallery_filter( $attr ) {
$attr['alt'] = "";
$attr['title'] = "";
return $attr;
}
add_filter( 'wp_get_attachment_image_attributes', 'tp_gallery_filter' );
Основное содержимое поста выводится с помощью функции the_content. Можно удалить у всех изображений, используемых в посте, и выводимых в основном содержимом, атрибут title. Для этого нужно вставить в файл functions.php:
function remove_img_titles($text) {
$result = array();
preg_match_all('|title="[^"]*"|U', $text, $result);
foreach($result[0] as $img_tag) {
$text = str_replace($img_tag, '', $text);
}
return $text;
}
add_filter('the_content', 'remove_img_titles');
Чтобы глобально удалить атрибут title вообще у всех изображений в блоге, неважно, где они выводятся и с помощью каких функций, можно использовать jQuery-скрипт. Он находит в исходном коде страницы код вывода изображения, и удаляет из него атрибут title. Вставьте код в файл footer.php:
[code lang=”js”] jQuery(document).ready(function($) {$(‘img’).each(function() { $(this).removeAttr(‘title’); });
});
Раньше при загрузке изображений в блог WordPress предлагает добавить к каждому изображению мета-данные title, alt и caption. Однако в версии WordPress 3.5 изменилось медиатека и скрипты добавления изображений, и теперь заполнять мета-данные закачиваемых в блог изображений стало не удобно: приходится совершать множество манипуляций, поле title стало недоступным, а мета-данные alt вообще непонятно как заполняются. Поэтому все плагины, которые умели массово автоматически заполнять alt и title, перестали работать. Я отказался от дополнительных плагинов, и теперь заполняю в фотоблоге мета-данные title и caption автоматически – данные для них берутся из названия поста, к которому присоединяются изображения. Нужно вставить следующий код в файл functions.php:
function modify_uploaded_file_meta($meta, $file, $sourceImageType) {
if( isset($_REQUEST['post_id']) ) {
$post_id = $_REQUEST['post_id'];
} else {
$post_id = false;
}
if($post_id && is_numeric($post_id)) {
$post_title = get_the_title($post_id);
if($post_title) {
$meta['title'] = $post_title;
$meta['caption'] = $post_title;
}
}
return $meta;
}
add_filter('wp_read_image_metadata', 'modify_uploaded_file_meta', 1, 3);
При закачке изображения в блог функция определяет название текущего поста, и автоматически заполняет поля Заголовок (title) и Описание (caption), вставляя туда название поста.
Следующим шагом будет знакомство со сниппетами для отдельной страницы вложения, на которой отображается присоединенное к посту изображение.












