it-swarm.com.de

Eine Funktion zum Abrufen von Blog-Inhalten über RSS-Feeds

Ich versuche, eine Funktion zu erstellen, die eine RSS-Feed-URL verwendet und die letzten 2 Beiträge abruft. Ich habe versucht, das Snippet von hier aus wie folgt zu einer vollständigen Funktion in funtions.php zu machen. Ich möchte kein Plugin dafür verwenden, da die Plugins, die ich mir angesehen habe, mit meinem eigenen HTML-Code so gut wie unmöglich zu stylen waren ...

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;
}

Ich versuche auch, es so zu gestalten, dass es mehrmals auf einer einzelnen Seite verwendet werden kann.

1
HannesH

Vermeiden Sie zuerst, Funktionen innerhalb von Funktionen zu definieren. PHP hat kein Problem damit, aber es ist normalerweise ein Zeichen dafür, dass Sie "es falsch machen" und es führt nur zu unnötigen Kopfschmerzen.

Zweitens ist Ihre foreach-Schleife am unteren Rand ein wenig fehlerhaft. Sie müssen den <ul> außerhalb der Schleife definieren und dann an $html anhängen - andernfalls erhalten Sie nur den letzten Eintrag!

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