web-dev-qa-db-fra.com

Une fonction pour récupérer le contenu du blog via un flux rss

J'essaie de créer une fonction qui prend une URL fedd RSS et récupère les 2 publications les plus récentes. J'ai essayé de refaire l'extrait d'ici à une fonction complète dans funtions.php comme suit. Je ne veux pas utiliser de plugin pour cela car les plugins que j'ai consultés sont presque impossibles à styler avec mon propre HTML ...

function fetch_feed_from_blogg($path) {
$rss = fetch_feed($path);

if (!is_wp_error( $rss ) ) : 

$maxitems = $rss->get_item_quantity(2); 
$rss_items = $rss->get_items(0, $maxitems); 
endif;

function get_first_image_url($html)
{
  if (preg_match('/<img.+?src="(.+?)"/', $html, $matches)) {
  return $matches[1];
  }
}

function shorten($string, $length) 
{
$suffix = '&hellip;';

$short_desc = trim(str_replace(array("/r", "/n", "/t"), ' ', strip_tags($string)));
    $desc = trim(substr($short_desc, 0, $length));
    $lastchar = substr($desc, -1, 1);
      if ($lastchar == '.' || $lastchar == '!' || $lastchar == '?') $suffix='';
          $desc .= $suffix;
    return $desc;
}

if ($maxitems == 0) echo '<li>No items.</li>';
else 
foreach ( $rss_items as $item ) :

$html = '<ul class="rss-items" id="wow-feed"> <li class="item"> <span class="rss-image"><img src="' .get_first_image_url($item->get_content()). '"/></span>
    <span class="data"><h5><a href="' . esc_url( $item->get_permalink() ) . '" title="' . esc_html( $item->get_title() ) . '"' . esc_html( $item->get_title() ) . '</a></h5></li></ul>';

 return $html;
}

J'essaie également de faire en sorte qu'il puisse être utilisé plusieurs fois sur une seule page.

1
HannesH

Tout d’abord, évitez de définir des fonctions dans les fonctions. PHP n'a pas de problème avec cela, mais c'est généralement le signe que vous "faites le mal" et cela conduit à des maux de tête inutiles.

Deuxièmement, votre boucle foreach au bas est un peu mal formée. Vous devez définir le <ul> en dehors de la boucle, puis ajouter à $html - sinon vous vous retrouvez avec le dernier élément!

function wpse_187819_get_feed_html( $url ) {
    if ( is_wp_error( $rss = fetch_feed( $url ) ) )
        return; // Bail

    $maxitems  = $rss->get_item_quantity( 2 );
    $rss_items = $rss->get_items( 0, $maxitems );

    $html = '<ul class="rss-items" id="wow-feed">';

    if ( $maxitems ) {
        foreach ( $rss_items as $item ) {
            $title = esc_attr( $item->get_title() );
            $link  = esc_url( $item->get_permalink() );

            $html .= '<li class="item">'; 
                if ( preg_match( '/<img.+?src="(.+?)"/', $item->get_content(), $matches ) )
                    $html .= '<span class="rss-image"><img src="' . $matches[1] . '"/></span>';

                $html .= '<span class="data"><h5><a href="' . $link . '" title="' . $title . '"' . $title . '</a></h5></span>';
            $html .= '</li>';
        }

    } else {
        $html .= '<li>No items</li>';
    }

    // All done, now close the <ul>
    $html .= '</ul>';

    return $html;
}
3
TheDeadMedic