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






В идеале вы не должны использовать 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.
Привет, когда я использую этот код в localhost, он работает отлично, но когда дело доходит до использования на сервере, он не работает, потому что он дает мне ошибку: Предупреждение: file_get_contents (url): не удалось открыть поток: HTTP-запрос не выполнен!
Не могли бы вы сообщить мне, что будет на выходе, когда вы укажете URL-адрес var_dump или write_log?
После URL-адреса var_dump у меня есть ошибка: Неустранимая ошибка: вызов неопределенной функции curl_get_contents ()
Кажется, вы немного изменили свой код, верно? Вы не просто добавили var_dump, поскольку ошибка не имеет ничего общего с var_dump, если вы удалите var_dump, та же ошибка все равно будет отображаться, не так ли? Можете ли вы добавить свой новый код к вопросу? Вы уверены, что на вашем сервере установлено расширение curl? php.net/manual/en/curl.setup.php
Пожалуйста :) Рад, что смог помочь. Если у вас возникнут другие проблемы, дайте мне знать;)