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