web-dev-qa-db-ja.com

fetch_feedによるwp_errorの配置

これは本当に簡単かもしれませんが、それがRSSとWPになると私はかなり絶望的です。 if ( is_wp_error( $feed ) ) {を次のようなコードのどこに置くべきですか?

<?php 
                    $rss = fetch_feed('' . $instance["feed_address"] . '');
                    $maxitems = $rss->get_item_quantity($instance["feed_count"]); 
                    $rss_items = $rss->get_items(0, $maxitems); 
                    $title = substr($item['title'],0,55)." ... ";
                ?>

                <ul>
                    <?php if ($maxitems == 0) echo ''; else foreach ( $rss_items as $item ) : ?>
                    <li>
                        <h2><a class="description" href="<?php echo $item->get_permalink(); ?>" target="_blank"><?php echo substr($item->get_title(), 0, 49) . ' ...'; ?> <span class="tip"><?php echo strip_tags(substr($item->get_description(), 0, 215)) . ' ...'; ?> <?php echo ''.$item->get_date('j F Y | g:i a'); ?></span></a></h2>
                    </li>
                    <?php endforeach; ?>
                </ul>

前もって感謝します。

編集:

上記のコードは、コアファイル内ではなく、カスタムphpページにあります。それは違いますか?とにかく、私はこれをどうにかして:

<?php 
                        $rss = fetch_feed('' . $instance["feed_address"] . '');
if ( !is_wp_error( $rss ) ) :
                        $maxitems = $rss->get_item_quantity($instance["feed_count"]); 
                        $rss_items = $rss->get_items(0, $maxitems); 
                        $title = substr($item['title'],0,55)." ... ";
endif;
                    ?>

                    <ul>
                        <?php if ($maxitems == 0) echo ''; else foreach ( $rss_items as $item ) : ?>
                        <li>
                            <h2><a class="description" href="<?php echo $item->get_permalink(); ?>" title="<?php echo 'Posted '.$item->get_date('j F Y | g:i a'); ?>" target="_blank"><?php echo substr($item->get_title(), 0, 49) . ' ...'; ?> <span class="tip"><?php echo strip_tags(substr($item->get_description(), 0, 215)) . ' ...'; ?></span></a></h2>
                        </li>
                        <?php endforeach; ?>
                    </ul>

要点はif ( !is_wp_error( $rss ) ) :です、少なくともそれはフィードをロードし、すべてがうまくいっているようですが、これで大丈夫ですか?エラーは時々発生するかもしれませんしないかもしれないのでテストは少し難しいです。しかし、エラーストロークが発生する前に、フィードはその瞬間にロードを停止し、その後も他のフィード(私は2つ)をロードしませんでした。上記のコードでは、エラーを受け取ったフィードをスキップしてもう一方をロードしますか?

ありがとう。

編集:

上記のコードがないと、ありがとうございます。エラーは予想どおりに発生しますが、フィードが空のままになり、次のフィードが通常どおりロードされます。あなたは揺れます!

1
user4237

$rss = fetch_feed('' . $instance["feed_address"] . '');に従い、wp-includes/feed.phpで関数を見つけます。

/**
 * Build SimplePie object based on RSS or Atom feed from URL.
 *
 * @since 2.8
 *
 * @param string $url URL to retrieve feed
 * @return WP_Error|SimplePie WP_Error object on failure or SimplePie object on success
 */
function fetch_feed($url) {
    require_once (ABSPATH . WPINC . '/class-feed.php');

    $feed = new SimplePie();
    $feed->set_feed_url($url);
    $feed->set_cache_class('WP_Feed_Cache');
    $feed->set_file_class('WP_SimplePie_File');
    $feed->set_cache_duration(apply_filters('wp_feed_cache_transient_lifetime', 43200, $url));
    do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );
    $feed->init();
    $feed->handle_content_type();

    if ( $feed->error() )
        return new WP_Error('simplepie-error', $feed->error());

    return $feed;
}

ご覧のとおり、fetch_feed()はWP_Errorオブジェクトを返すかもしれません。そのため、この関数の呼び出しのすぐ下で確認してください。

$rss = fetch_feed('' . $instance["feed_address"] . '');

if ( is_wp_error( $rss ) )
{
    // do something awesome
}
else
{
    // print your feed items
    // $maxitems = …
}
2
fuxia