Функция в цикле wordpress замедляет страницу

На моей странице WordPress у меня есть сообщения, которые получают контент с других сайтов. На свою страницу я добавляю только URL-адрес страницы, и на странице отображается мета с этого URL-адреса.

пример функции:

    function getOGimage() {
$url = get_field('link');
$page_content = file_get_contents($url);

$dom_obj = new DOMDocument();
@$dom_obj->loadHTML($page_content);
$meta_val = null;

foreach($dom_obj->getElementsByTagName('meta') as $meta) {

if ($meta->getAttribute('property')=='og:image'){ 

    $meta_val = $meta->getAttribute('content');
}
}
echo '<img src = "'.$meta_val.'" style = "width:180px; height:auto;" />';}

Моя петля:

<?php if ($popularindex->have_posts()) : ?>
 <?php while ($popularindex->have_posts()) : $popularindex->the_post(); ?>
  <li class = "box" id = "post-<?php the_ID(); ?>">
   <div class = "thumb-box">
    <a href = "<?php the_permalink(); ?>" title = "<?php the_title(); ?>">
     <?php if ( has_post_thumbnail() ) {
      the_post_thumbnail();
      } else $OG_image =  getOGimage();
     ?>
    </a>
   </div>
  </li>
 <?php endwhile; ?>
 <?php else : ?> 
<?php endif; ?>

Работает, но замедляет страницу. У кого-нибудь есть решение для этого?

Я думал о сохранении этой меты в базе данных, но я не знаю, как это сделать автоматически с основного URL

заранее спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В идеале вы не должны использовать file_get_contents() каждый раз, когда вам нужно рендерить сообщения. Помимо медленного, это означает, что если 200 пользователей посетят страницу, вы загрузите изображения 200 раз.

Wordpress имеет действие, которое вы можете подключать к нему каждый раз, когда сообщение создается или обновляется в бэкэнде: save_post (более подробную информацию вы можете найти здесь: https://codex.wordpress.org/Plugin_API/Action_Reference/save_post). Вы должны подключиться к этим действиям, и каждый раз, когда сообщение создается / обновляется, вы извлекаете изображение и сохраняете его в своей базе данных как post_meta. Вам нужно будет добавить что-то похожее на приведенное ниже:

function post_updated_set_og_image( $post_id ) {

    $url = get_field('link', $post_id);
    $page_content = file_get_contents($url);

    $dom_obj = new DOMDocument();
    @$dom_obj->loadHTML($page_content);
    $meta_val = null;

    foreach($dom_obj->getElementsByTagName('meta') as $meta) {

      if ($meta->getAttribute('property')=='og:image'){ 

      $meta_val = $meta->getAttribute('content');
    }
    update_field('og_image_src', $meta_val, $post_id);

}
add_action( 'save_post', 'post_updated_set_og_image' );

Тогда, когда ваш цикл должен быть примерно таким:

<?php if ($popularindex->have_posts()) : ?>
    <?php while ($popularindex->have_posts()) : $popularindex->the_post(); ?>
        <li class = "box" id = "post-<?php the_ID(); ?>">
            <div class = "thumb-box">
                <a href = "<?php the_permalink(); ?>" title = "<?php the_title(); ?>">
                <?php if ( has_post_thumbnail() ) {
                    the_post_thumbnail();
                } else{
                  $og_image = get_field('og_image_src');
                  echo '<img src = "'.$og_image.'" style = "width:180px; height:auto;" />';
                }
                ?>
                </a>
            </div>
        </li>
    <?php endwhile; ?>
<?php else : ?> 
<?php endif; ?>

Я использую get_field и update_field, поскольку вы использовали get_field в своем вопросе. Я думаю, вы используете плагин ACF для управления метаданными. Вместо этого можно использовать get_post_meta и update_post_meta, если вы не собираетесь использовать плагин ACF.

Пожалуйста :) Рад, что смог помочь. Если у вас возникнут другие проблемы, дайте мне знать;)

Omar Tanti 27.10.2018 15:59

Привет, когда я использую этот код в localhost, он работает отлично, но когда дело доходит до использования на сервере, он не работает, потому что он дает мне ошибку: Предупреждение: file_get_contents (url): не удалось открыть поток: HTTP-запрос не выполнен!

adkoski 31.10.2018 14:45

Не могли бы вы сообщить мне, что будет на выходе, когда вы укажете URL-адрес var_dump или write_log?

Omar Tanti 31.10.2018 15:43

После URL-адреса var_dump у меня есть ошибка: Неустранимая ошибка: вызов неопределенной функции curl_get_contents ()

adkoski 31.10.2018 19:19

Кажется, вы немного изменили свой код, верно? Вы не просто добавили var_dump, поскольку ошибка не имеет ничего общего с var_dump, если вы удалите var_dump, та же ошибка все равно будет отображаться, не так ли? Можете ли вы добавить свой новый код к вопросу? Вы уверены, что на вашем сервере установлено расширение curl? php.net/manual/en/curl.setup.php

Omar Tanti 01.11.2018 07:46

Другие вопросы по теме