Функция в цикле Wordpress замедляет страницу - PullRequest
0 голосов
/ 27 октября 2018

На моей странице 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

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

1 Ответ

0 голосов
/ 27 октября 2018

В идеале вы не используете 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.

...