在WordPress循环功能减慢页面

时间:2018-10-27 09:27:15

标签: php mysql wordpress meta-tags

在我的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 :(得分:3)

理想情况下,您每次需要渲染帖子时都不会使用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_fieldget_field。我认为您正在使用ACF插件来管理元数据。如果您不打算使用ACF插件,可以改用get_post_metaupdate_post_meta