Отображение каждого изображения из поста WordPress - PullRequest
0 голосов
/ 26 апреля 2019

Цель состоит в том, чтобы Wordpress выплевывал или отображал все изображения из пользовательского формата поста, который я создал.Я новичок в PHP и не собираюсь использовать какие-либо сторонние плагины, возможно, исправление приведенного ниже кода, пожалуйста.

Все решения, с которыми я столкнулся отсюда (stackoverflow) или из Google, не работают или выплевывают ВСЕ изображения, которые я когда-либо загружал из библиотеки мультимедиа, которые мне не нужны.Большинство предоставленных решений предназначены для «показа первого изображения», о котором я знаю, и которое работает, но я хотел бы, чтобы все изображения из поста.

Вот ближайший код, который работал пару раз, но ондеформирует мой макет, а затем возвращается к отображению одного изображения:

    function displayPostImg() {
      global $post, $posts;
      $first_img = '';
      ob_start();
      ob_end_clean();
      $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
      $first_img = $matches[0][0];
      return $first_img;

}

И вызов, который я использую, чтобы вставить в свой собственный пост php:

<?php echo displayPostImg(); ?>

Как указано выше, существующие решения не работают.Любая помощь с четким объяснением того, что я делаю неправильно, будет огромной помощью.

РЕДАКТИРОВАТЬ

@ corvidism Спасибо за дальнейшие объяснения, человек.Я взглянул на инструменты разработки, и «возвратный взлет», похоже, вывел его из цикла, вызывая проблему с макетом.Ваше решение действительно показывает изображения / вложения, которые я опубликовал, но я не могу исправить эту неудачу.Кажется, что есть переход к решению, которое должно делать то же самое.Это печально перекликается с каждым изображением из медиатеки.Объединение вашего кода с приведенным ниже приблизило меня, но если я найду решение, я опубликую его здесь для других:

$args = array( 
  'post_type'      => 'attachment', 
  'posts_per_page' => -1, 
  'post_status'    =>'any', 
  'post_parent'    => $post->ID ); 

$attachments = get_posts( $args );

if ( $attachments ) {
    foreach ( $attachments as $attachment ) {
        echo apply_filters( 'the_title' , $attachment->post_title );
        the_attachment_link( $attachment->ID , false );
    }
}

РЕДАКТИРОВАТЬ # 2: Решение

Поработав с различными решениями, я нашел кое-что, что работает.Попробуйте:

function grab_those_images( $post ) {

    $content_post = $post->post_content;

    $search_post = '~src="[^"]*"~';
    preg_match_all( $search_post, $content_post, $imgs );
    $no_of_pics = count($imgs[0]);

    if ( $no_of_pics > 0 ) {
            for ( $i=0; $i < $no_of_pics ; $i++ ) {
                $string=$imgs[0][$i];
                $string=trim( $string );
                $length=strlen( $string );
                $image_path=substr_replace( substr( $string, 5, $length ),"",-1 );
                echo '<img src="';
                echo $image_path;
                echo '" />';
        }
    }
}

1 Ответ

0 голосов
/ 26 апреля 2019

Используемая вами функция содержит функции манипулирования буфером (ob_start() и ob_end_clean()), которые, скорее всего, конфликтуют с чем-то другим в вашем шаблоне (вероятно, это то, что также использует их, обычноплагины).

Если вы не ищете изображения, вставленные как мета поста (что, я полагаю, не так), вы найдете все изображения в посте внутри свойства $post->post_content.Вы можете использовать preg_match_all для поиска изображений.

Вы должны передавать содержимое публикации своей функции в качестве параметра вместо доступа к глобальному объекту $ post.Это сделает вещи более надежными и проще в отладке.(Глобальные объекты обычно не одобряются при разработке PHP, о чем следует помнить, если вы планируете использовать PHP более широко, чем просто для WordPress.)

Вот как может выглядеть ваша функция:

function getAllImagesInPost($postContent) {
    preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $postContent, $matches); 
    // This regex function searches for <img> tags and uses a capture group
    // for the image source url. It will search the whole supplied string,
    // in this case post content. It returns results into the $matches variable.
    $image_tags = $matches[0]; 
    // This is an array containing all the regex matches.
    $image_urls = $matches[1]; 
    // This is an array containing all the capture group matches.

    return implode('',$image_tags); 
    // implode() creates a string from an array of strings/numbers. 
}

В вашем файле шаблона использование зависит от того, находитесь ли вы в цикле.В цикле вы можете работать с объектом $ post и использовать $post->post_content или get_the_content() (оба получат содержимое публикации в виде строки):

echo getAllImagesInPost(get_the_content());

Вне цикла вы будете первымнеобходимо получить сообщение (например, get_post($somePostID);).

Дополнение 1:
Вы должны передать переменную в функцию, чтобы вы не моглииспользовать функции шаблона WordPress, такие как the_content().Они отражаются прямо на странице и возвращают true или что-то еще бесполезное (в данном случае, во всяком случае).Общее правило WP гласит: если оно начинается с the_, оно повторяется, если оно начинается с get_the_, оно возвращается.

Добавление 2:
Для отображения только изображения из вашего поста и никакого другого контента, вы просто не используете какой-либо другой тег шаблона контента в своем файле шаблона.(Например, the_content()).

Дополнение 3:
Я подозреваю, что ваша проблема не в самой функции, а в том, как / где вы ее вызываете.Но если эта функция вызывает изменения в вашем макете, это на 99% регулярное выражение, возвращающее неработающий HTML (маловероятно, но возможно, в зависимости от вашего ввода).

Способ отладки заключается в проверке страницы с помощью инструментов разработчика браузера и поиске битых тегов или других странностей.Если вы видите это, вам нужно выяснить, что именно происходит, протестировав функцию на различных входах.Подайте это жестко запрограммированную строку, сделайте тестовый пост, используя только текст / изображение / что-нибудь еще, пока не узнаете, что происходит.Если вы решите, что регулярное выражение является виновником, вы можете попытаться исправить его самостоятельно или поискать в Интернете лучший вариант (без суждения, регулярное выражение - это боль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...