У меня есть интересная проблема, которую я уверен, что кто-то здесь может решить. Я перебрал множество различных плагинов и фрагментов кода в поисках идеального кода для извлечения основного изображения, которое будет связано с публикацией.
Если используется новый элемент избранного изображения WP 3.0, то, конечно, нет проблем, но есть множество ситуаций, когда сообщению может не быть назначено «избранное изображение». В этих ситуациях, если бы вы использовали стандартный код:
<?php echo the_post_thumbnail( array(200,200) ); ?>
в вашем шаблоне… ничего не будет отображаться.
Для таких ситуаций я ищу идеальное решение. По сути, мне нужна возможность иметь тип «отказоустойчивости», когда the_post_thumbnail не существует, но мне также нужна возможность устанавливать размер изображения так же, как я могу с кодом из the_post_thumbnail.
Я считаю, что этот «отказоустойчивый переход» должен состоять из двух шагов:
- Проверьте «Медиа-галерею» для этого поста и найдите изображение с наивысшим порядком сортировки (или добавьте родительский пост, как показано в плагине ниже).
- Если порядок сортировки не установлен или пуст, извлеките первое изображение из содержимого публикации.
Хорошей новостью является то, что для двух пунктов выше я, кажется, нашел два отдельных фрагмента кода, которые заботятся об этих запросах по отдельности (скопировано ниже для обзора), но ничего, что объединяло бы все три из этих элементов в одном.
Итак, резюмируя: вместо того, чтобы выполнять кучу вызовов if/then, чтобы проверить, существует ли миниатюра сообщения, а затем запускать проверку кода ниже, я надеялся, что кто-то сможет предоставить чистую/комбинированную функцию, которая позволит мне чтобы повторить одну функцию вместе с переменными размера, которые могут достичь всех трех этих целей, как указано выше.
ЗДЕСЬ БИТЫ КОДА, УПОМЯНУТЫЕ ВЫШЕ:
ДЛЯ № 1: Получить первое изображение на основе порядка из медиагалереи: этот код работает, сначала ища любые вложения в таблице базы данных wp_posts, которые имеют идентификатор «post_parent», который соответствует текущему сообщению, и в качестве второго шага для сообщения с несколькими прикрепленными изображениями, возвращая вложение с полем «menu_order», установленным на «1». Если нет прикрепленных изображений, соответствующих текущему идентификатору сообщения, плагин возвращает «false».
// AUTOMATICALLY EXTRACT IMAGES BASED ON ASSOCIATED GALLERY ORDER
// THIS CODE EXTRACTS THE FIRST IMAGE BASED ON THE ORDER IN THE MEDIA GALLERY
// PLUGIN FROM: http://mekosh.org/projects/ordered-thumbnails
function ordered_thumbnails( $display = 'true', $class='' ) {
global $post;
// get all image attachments for this post
$images = get_children( array( 'post_type' => 'attachment', 'post_parent' => $post->ID, 'post_mime_type' => 'image', order=>"asc" ) );
// if the post has image attachments
if( $images !== false ) {
// find the image in position 1
foreach($images as $i) {
if ( $i->menu_order == 1 ) {
$img_id = $i->ID;
}
}
// if the images were unordered
if ( $img_id == '' ) {
$i = array_slice( $images, 0, 1 );
$img_id = $i[0]->ID;
}
// get image data
$image = wp_get_attachment_image_src( $img_id, 'thumbnail' );
$result = array(
'url' => $image[0],
'width' => $image[1],
'height' => $image[2]
);
// should the image be displayed or should data be returned as an array?
if ( $display == 'true' ) {
return _e( '<img src="'.$result['url'].'" width="'.$result['width'].'" height="'.$result['height'].'" class="'.$class.'" />' );
} else {
return $result;
}
} else {
// post does not have any image attachments
return (bool) false;
}
}
// create template tag "ordered_thumbnails"
add_action( 'ordered_thumbnails', 'ordered_thumbnails', 2 );
ДЛЯ № 2: извлеките первое изображение из содержимого сообщения.
// THIS CODE GETS THE FIRST IMAGE EXTRACTED DIRECTLY FROM THE POST CONTENT
function bm_extract_string($start, $end, $original) {
$original = stristr($original, $start);
$trimmed = stristr($original, $end);
return substr($original, strlen($start), -strlen($trimmed));
}
function getFirstImage() {
$content = get_the_content();
$pic_string = bm_extract_string('src="','" ',$content);
$imagesize = getimagesize($pic_string);
list($width, $height, $type, $attr) = getimagesize($pic_string);
$link = get_permalink();
$title = get_the_title($post->post_title);
echo '<a href="'.$link.'" style="background:url('.$pic_string.'); display:block; width:'.$width.'px; height:'.$height.'px;" title="'.$title.'"></a>';
}
@all Я нашел решение своей проблемы, которое я представил ниже, если кому-то интересно. Спасибо всем, кто пытался найти решение.
есть несколько вещей, которые мне непонятны. Зачем вам нужны регулярные выражения, чтобы найти первое изображение из содержимого?
get_children
должен позаботиться о поиске любых вложенных изображений. Вам не нужно обрабатывать удаленные изображения, просто добавьте атрибуты ширины/высоты в<img>
тег эскиза и позвольте браузеру обработать это. Также в чем причина использования ООП в этой ситуации?хотя это не то, что я ищу, я ценю, что вы предоставили код. Однако я действительно ищу здесь конкретное решение, которое, я чувствую, многие другие найдут ценность в
Ответ должен быть чем-то большим, чем просто ссылка на внешний сайт. Пожалуйста, добавьте решение.
Я предлагаю проверить плагин Get the Image. По сути, это одна функция, которая действует как гибкая и настраиваемая оболочка для поиска изображений в сообщениях с помощью различных методов (метаполя сообщений, избранные изображения, прикрепленные изображения, изображения в теле сообщения).
Вот решение моей проблемы, кому интересно.
Включите это в свой файл functions.php
Создайте новый файл и назовите его «extract-post-thumbnail.php», поместите его в папку с именем «custom» и поместите его в тот же каталог, где находится файл functions.php вашей темы. Наконец, вставьте приведенный ниже код в этот файл.
@NetConstructor,
Эта функция не решит всех ваших проблем, но я подумал, что она поможет. Он получает первое изображение, прикрепленное к сообщению, и добавляет изображение среднего размера
the_content
. Если порядок сортировки не установлен, он получит изображение с порядком сортировки «0». Он ничего не извлекает из содержимого сообщения, и если изображение находится в содержании сообщения, оно будет отображаться 2 раза.Я использовал его для клиента, у которого были проблемы с вставкой изображений в сообщения. С помощью этой функции ему нужно только нажать кнопку «добавить медиа», загрузить изображение и нажать «Сохранить», не «вставляя» его.
Вы можете проверить полезные фрагменты кода здесь, я нашел их полезными, чтобы вытащить первое изображение из поста.