Cum să adaugi imagini în fluxul RSS WordPress fără plugin-uri
Am căutat modalități de a adăuga imagini featured în feed-ul RSS fără plugin-uri pentru WordPress. Am găsit câteva exemple și le-am aplicat conform instrucțiunilor. Dar tot ce am obținut până acum este nimic. Tot nu pot accesa imaginea.
Ultima și cea mai bună soluție (după părerea mea) pe care am găsit-o (așa cum se menționează aici) este adăugarea următorului cod în fișierul functions.php al temei curente
function featured_image_in_feed( $content ) {
global $post;
if( is_feed() ) {
if ( has_post_thumbnail( $post->ID ) ){
$output = get_the_post_thumbnail( $post->ID, 'medium', array( 'style' => 'float:right; margin:0 0 10px 10px;' ) );
$content = $output . $content;
}
}
return $content;
}
add_filter( 'the_content', 'featured_image_in_feed' );
Nu am văzut nicio schimbare. Mai este ceva de făcut?
Ceea ce vreau să fac este să adaug imaginea featured ca un alt element în XML. Ar fi mai ușor să o afișez pentru slider-ul meu.
Bazat pe notele de aici și multe alte resurse pe care le-am citit, am conceput această soluție special pentru a funcționa cu Mailchimp RSS to Email converter folosind feed-ul din Wordpress. Șabloanele lor folosesc extensia <media:content> la elementul item pentru a popula macro-ul lor de imagine. Acest cod se adaugă în functions.php al temei.
// Adaugă namespace pentru elementul media:image folosit mai jos
add_filter( 'rss2_ns', function(){
echo 'xmlns:media="http://search.yahoo.com/mrss/"';
});
// inserează obiectul imagine în elementul RSS (vezi MB-191)
add_action('rss2_item', function(){
global $post;
if (has_post_thumbnail($post->ID)){
$thumbnail_ID = get_post_thumbnail_id($post->ID);
$thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'medium');
if (is_array($thumbnail)) {
echo '<media:content medium="image" url="' . $thumbnail[0]
. '" width="' . $thumbnail[1] . '" height="' . $thumbnail[2] . '" />';
}
}
});
Dimensiunea imaginii 'medium' poate fi înlocuită cu 'thumbnail' dacă doriți o imagine mai mică.
Mulțumesc. Exact ce aveam nevoie pentru ca alte agregatoare să găsească imaginea. Doar adăugarea unui tag de imagine în conținut nu este suficient.
Juergen Schulze
rss2_ns este un action hook. Deci în loc de add_filter ar trebui să fie add_action - https://core.trac.wordpress.org/browser/tags/5.7.1/src/wp-includes/feed-rss2.php#L36
Aakash Chakravarthy
Bună! Am o întrebare. Ce ar trebui să introduc în zona evidențiată? Captură de ecran --> https://snipboard.io/rn6vWx.jpg
Jornes
@Jornes lasă acea parte așa cum este. De ce crezi că trebuie să o schimbi?
vick
Bună Vick, mulțumesc pentru răspuns! Nu sunt sigur. Am crezut că linkul ar trebui să fie linkul pentru feed-ul meu RSS.
Jornes
Bună @Vick, SEOpress mi-a recomandat să ignor prima parte. Și funcționează. Dar am observat câteva erori (evidențiate) aici. Te rog să te uiți la captura de ecran. -> https://snipboard.io/iDXZBj.jpg
Cum pot rezolva problema?
Jornes
Iată un exemplu excelent. Cum să afișezi imaginile miniatura ale articolelor în fluxurile WordPress
lipeste acest fragment de cod în fișierul functions.php al temei tale
// afișează imaginile miniatura ale articolelor în fluxurile WordPress
function wcs_post_thumbnails_in_feeds( $content ) {
global $post;
if( has_post_thumbnail( $post->ID ) ) {
$content = '<p>' . get_the_post_thumbnail( $post->ID ) . '</p>' . $content;
}
return $content;
}
add_filter( 'the_excerpt_rss', 'wcs_post_thumbnails_in_feeds' );
add_filter( 'the_content_feed', 'wcs_post_thumbnails_in_feeds' );
Pentru asta va trebui să modifici șablonul Feed. Iată un tutorial pentru asta. http://digwp.com/2012/10/customizing-wordpress-feeds/#customize-templates
Robert hue
Ce anume dorești să faci? Dacă poți explica mai multe, poate cineva de aici te poate ajuta.
Robert hue
Vreau să afișez imaginile și titlurile știrilor recomandate într-un component carousel din Bootstrap. Încerc să scriu un fișier .php. Iar ajutorul tău este suficient de bun pentru a-mi rezolva problema. Mulțumesc. Voi extrage calea imaginii din cheia description.
zkanoca
@Roberthue Poți confirma că funcționează pentru fluxul de articole pe categorii? /?cat=15&feed=rss2
jackncoke
Am încercat răspunsul selectat și am obținut o imagine foarte mare în feed-ul meu. Aș recomanda adăugarea unei dimensiuni a imaginii în cod.
// afișează imaginile în miniatură ale articolelor în feed-urile RSS
function WPGood_rss_thumbs( $content ) {
global $post;
if( has_post_thumbnail( $post->ID ) ) {
$content = '<figure>' . get_the_post_thumbnail( $post->ID, 'thumbnail' ) . '</figure>' . $content;
}
return $content;
}
add_filter( 'the_excerpt_rss', 'WPGood_rss_thumbs' );
add_filter( 'the_content_feed', 'WPGood_rss_thumbs' );
Am folosit 'thumbnail' pentru feed-ul meu, dar 'medium' ar putea funcționa mai bine pentru unele site-uri.
Am încercat răspunsurile de mai sus și nu am reușit să fac funcționalitatea să meargă. Continuam să-mi adauge imaginea în zona de descriere.
Am găsit acest cod pe un alt site, l-am modificat puțin și voila, a început să funcționeze.
add_action('rss2_item', function(){
global $post;
if(has_post_thumbnail($post->ID)){
$output = '';
$thumbnail_ID = get_post_thumbnail_id( $post->ID );
$thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'thumbnail');
$output .= '<post-thumbnail>';
$output .= '<url>'. $thumbnail[0] .'</url>';
$output .= '<width>'. $thumbnail[1] .'</width>';
$output .= '<height>'. $thumbnail[2] .'</height>';
$output .= '</post-thumbnail>';
echo $output;
}
});
Iată cum preiau imaginile împreună cu linkul și titlul postării, dintr-un flux RSS extern.
<div class="row">
<?php
/*
* Obține ultimele articole de blog din fluxul RSS
* Sortează articolele după data publicării
* Obține atributul SRC și ALT al imaginii principale folosind expresii regulate
* Parcurge și repetă de 4 ori pentru a afișa 4 articole
*/
$feed = 'https://www.somewpsite.com/feed/';
$entries = array();
$xml = simplexml_load_file($feed);
$entries = array_merge($entries, $xml->xpath("//item"));
//Sortează articolele după pubDate
usort($entries, function ($feed1, $feed2) {
return strtotime($feed2->pubDate) - strtotime($feed1->pubDate);
});
?>
<?php
$counter = 0;
foreach ($entries as $entry) {
//obține imaginea principală
//intră în conținutul articolului de blog
$blogContent = $entry->description;
//expresie regulată pentru a găsi atributul img
preg_match('/(<img[^>]+>)/i', $blogContent, $matches);
//salvează prima imagine în variabilă
$featuredImage = $matches[0];
//Obține atributul src cu expresie regulată
preg_match('@src="([^"]+)"@', $featuredImage, $getSrc);
//Obține atributul alt cu expresie regulată
preg_match('@alt="([^"]+)"@', $featuredImage, $getAlt);
//Salvează atributele filtrate pentru a le afișa.
$imgAlt = array_pop($getAlt);
$imgSrc = array_pop($getSrc);
// elimină parametrii din URL
$url = $entry->link;
$url = strtok($url, '?');
//Set counter pentru a itera peste 4 articole și apoi oprește bucla.
if ($counter <= 3) { ?>
<div class="col-12 col-sm-12 col-md-6 col-lg-3 col-xl-3">
<div class="imgContainer">
<a href="<?php echo $url ?>">
<img src="<?php echo $imgSrc ?>" alt="<?php echo $imgAlt; ?>" class="img-fluid">
</a>
</div>
<h4>
<a class="blog-entry-link" href="<?php echo $url ?>"><?= $entry->title ?></a>
</h4>
</div>
<?php
$counter++;
} // sfârșitul condiției counter
}// sfârșitul buclei ?>
</div>