如何按时间顺序重新排序和显示提要?

时间:2011-11-11 作者:Joshua Lynch

我有一个事件日历中的提要,一旦放入WordPress RSS小部件中,就会按相反的时间顺序显示提要项。因此,未来最远的事件显示在第一位,即将发生的事件显示在最后。

我们只显示提要中的标题(事件名称)和提要中的发布日期(事件日期)。

有人知道有没有一种方法可以使用SimplePie插件或编辑默认RSS小部件的输出(不修改核心)按时间顺序输出,以便最旧的帖子(在本例中为事件)显示第一个帖子,而最新的帖子显示在列表的末尾?

我已经尝试更改提要本身,以便按时间顺序排列,但RSS小部件继续按发布日期排序。不幸的是,使用日历插件或自定义帖子类型并不理想,因为我们需要能够在一个地方更新此提要,并在多个不同的站点上显示事件。

6 个回复
最合适的回答,由SO网友:Joshua Abenazer 整理而成

这应该可以奏效。在函数中输入以下代码。php,然后查看RSS小部件。它将有一个选项来反转提要的顺序。

/**
 * RSS widget class
 */
class Reverse_Widget_RSS extends WP_Widget {

function __construct() {
    $widget_ops = array( \'description\' => __(\'Entries from any RSS or Atom feed ( with Reverse Order Option )\') );
    $control_ops = array( \'width\' => 400, \'height\' => 200 );
    parent::__construct( \'rss\', __(\'RSS\'), $widget_ops, $control_ops );
}

function widget($args, $instance) {

    if ( isset($instance[\'error\']) && $instance[\'error\'] )
        return;

    extract($args, EXTR_SKIP);

    $url = $instance[\'url\'];
    while ( stristr($url, \'http\') != $url )
        $url = substr($url, 1);

    if ( empty($url) )
        return;

    // self-url destruction sequence
    if ( in_array( untrailingslashit( $url ), array( site_url(), home_url() ) ) )
        return;

    $rss = fetch_feed($url);
    $title = $instance[\'title\'];
    $desc = \'\';
    $link = \'\';

    if ( ! is_wp_error($rss) ) {
        $desc = esc_attr(strip_tags(@html_entity_decode($rss->get_description(), ENT_QUOTES, get_option(\'blog_charset\'))));
        if ( empty($title) )
            $title = esc_html(strip_tags($rss->get_title()));
        $link = esc_url(strip_tags($rss->get_permalink()));
        while ( stristr($link, \'http\') != $link )
            $link = substr($link, 1);
    }

    if ( empty($title) )
        $title = empty($desc) ? __(\'Unknown Feed\') : $desc;

    $title = apply_filters(\'widget_title\', $title, $instance, $this->id_base);
    $url = esc_url(strip_tags($url));
    $icon = includes_url(\'images/rss.png\');
    if ( $title )
        $title = "<a class=\'rsswidget\' href=\'$url\' title=\'" . esc_attr__( \'Syndicate this content\' ) ."\'><img style=\'border:0\' width=\'14\' height=\'14\' src=\'$icon\' alt=\'RSS\' /></a> <a class=\'rsswidget\' href=\'$link\' title=\'$desc\'>$title</a>";

    echo $before_widget;
    if ( $title )
        echo $before_title . $title . $after_title;
    reverse_widget_rss_output( $rss, $instance );
    echo $after_widget;

    if ( ! is_wp_error($rss) )
        $rss->__destruct();
    unset($rss);
}

function update($new_instance, $old_instance) {
    $testurl = ( isset($new_instance[\'url\']) && ($new_instance[\'url\'] != $old_instance[\'url\']) );
    return reverse_widget_rss_process( $new_instance, $testurl );
}

function form($instance) {

    if ( empty($instance) )
        $instance = array( \'title\' => \'\', \'url\' => \'\', \'items\' => 10, \'error\' => false, \'show_summary\' => 0, \'show_author\' => 0, \'show_date\' => 0, \'reverse\' => 0 );
    $instance[\'number\'] = $this->number;

    reverse_widget_rss_form( $instance );
}
}

function reverse_widget_rss_output( $rss, $args = array() ) {
if ( is_string( $rss ) ) {
    $rss = fetch_feed($rss);
} elseif ( is_array($rss) && isset($rss[\'url\']) ) {
    $args = $rss;
    $rss = fetch_feed($rss[\'url\']);
} elseif ( !is_object($rss) ) {
    return;
}

if ( is_wp_error($rss) ) {
    if ( is_admin() || current_user_can(\'manage_options\') )
        echo \'<p>\' . sprintf( __(\'<strong>RSS Error</strong>: %s\'), $rss->get_error_message() ) . \'</p>\';
    return;
}

$default_args = array( \'show_author\' => 0, \'show_date\' => 0, \'show_summary\' => 0, \'reverse\' => 0 );
$args = wp_parse_args( $args, $default_args );
extract( $args, EXTR_SKIP );

$items = (int) $items;
if ( $items < 1 || 20 < $items )
    $items = 10;
$show_summary  = (int) $show_summary;
$show_author   = (int) $show_author;
$show_date     = (int) $show_date;
$reverse       = (int) $reverse;

if ( !$rss->get_item_quantity() ) {
    echo \'<ul><li>\' . __( \'An error has occurred; the feed is probably down. Try again later.\' ) . \'</li></ul>\';
    $rss->__destruct();
    unset($rss);
    return;
}

    if( $reverse )
        $feed_items = array_reverse( $rss->get_items(0, $items) );
    else
        $feed_items = $rss->get_items(0, $items);

echo \'<ul>\';
foreach ( $feed_items as $item ) {
    $link = $item->get_link();
    while ( stristr($link, \'http\') != $link )
        $link = substr($link, 1);
    $link = esc_url(strip_tags($link));
    $title = esc_attr(strip_tags($item->get_title()));
    if ( empty($title) )
        $title = __(\'Untitled\');

    $desc = str_replace( array("\\n", "\\r"), \' \', esc_attr( strip_tags( @html_entity_decode( $item->get_description(), ENT_QUOTES, get_option(\'blog_charset\') ) ) ) );
    $desc = wp_html_excerpt( $desc, 360 );

    // Append ellipsis. Change existing [...] to [&hellip;].
    if ( \'[...]\' == substr( $desc, -5 ) )
        $desc = substr( $desc, 0, -5 ) . \'[&hellip;]\';
    elseif ( \'[&hellip;]\' != substr( $desc, -10 ) )
        $desc .= \' [&hellip;]\';

    $desc = esc_html( $desc );

    if ( $show_summary ) {
        $summary = "<div class=\'rssSummary\'>$desc</div>";
    } else {
        $summary = \'\';
    }

    $date = \'\';
    if ( $show_date ) {
        $date = $item->get_date( \'U\' );

        if ( $date ) {
            $date = \' <span class="rss-date">\' . date_i18n( get_option( \'date_format\' ), $date ) . \'</span>\';
        }
    }

    $author = \'\';
    if ( $show_author ) {
        $author = $item->get_author();
        if ( is_object($author) ) {
            $author = $author->get_name();
            $author = \' <cite>\' . esc_html( strip_tags( $author ) ) . \'</cite>\';
        }
    }

    if ( $link == \'\' ) {
        echo "<li>$title{$date}{$summary}{$author}</li>";
    } else {
        echo "<li><a class=\'rsswidget\' href=\'$link\' title=\'$desc\'>$title</a>{$date}{$summary}{$author}</li>";
    }
}
echo \'</ul>\';
$rss->__destruct();
unset($rss);
}

function reverse_widget_rss_process( $widget_rss, $check_feed = true ) {
$items = (int) $widget_rss[\'items\'];
if ( $items < 1 || 20 < $items )
    $items = 10;
$url           = esc_url_raw(strip_tags( $widget_rss[\'url\'] ));
$title         = trim(strip_tags( $widget_rss[\'title\'] ));
$show_summary  = isset($widget_rss[\'show_summary\']) ? (int) $widget_rss[\'show_summary\'] : 0;
$show_author   = isset($widget_rss[\'show_author\']) ? (int) $widget_rss[\'show_author\'] :0;
$show_date     = isset($widget_rss[\'show_date\']) ? (int) $widget_rss[\'show_date\'] : 0;
$reverse       = isset($widget_rss[\'reverse\']) ? (int) $widget_rss[\'reverse\'] : 0;

if ( $check_feed ) {
    $rss = fetch_feed($url);
    $error = false;
    $link = \'\';
    if ( is_wp_error($rss) ) {
        $error = $rss->get_error_message();
    } else {
        $link = esc_url(strip_tags($rss->get_permalink()));
        while ( stristr($link, \'http\') != $link )
            $link = substr($link, 1);

        $rss->__destruct();
        unset($rss);
    }
}
return compact( \'title\', \'url\', \'link\', \'items\', \'error\', \'show_summary\', \'show_author\', \'show_date\', \'reverse\' );
}

function reverse_widget_rss_form( $args, $inputs = null ) {

$default_inputs = array( \'url\' => true, \'title\' => true, \'items\' => true, \'show_summary\' => true, \'show_author\' => true, \'show_date\' => true, \'reverse\' => true );
$inputs = wp_parse_args( $inputs, $default_inputs );
extract( $args );
extract( $inputs, EXTR_SKIP);

$number = esc_attr( $number );
$title  = esc_attr( $title );
$url    = esc_url( $url );
$items  = (int) $items;
if ( $items < 1 || 20 < $items )
    $items  = 10;
$show_summary   = (int) $show_summary;
$show_author    = (int) $show_author;
$show_date      = (int) $show_date;
$reverse      = (int) $reverse;

if ( !empty($error) )
    echo \'<p class="widget-error"><strong>\' . sprintf( __(\'RSS Error: %s\'), $error) . \'</strong></p>\';

if ( $inputs[\'url\'] ) :
?>
<p><label for="rss-url-<?php echo $number; ?>"><?php _e(\'Enter the RSS feed URL here:\'); ?></label>
<input class="widefat" id="rss-url-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][url]" type="text" value="<?php echo $url; ?>" /></p>
<?php endif; if ( $inputs[\'title\'] ) : ?>
<p><label for="rss-title-<?php echo $number; ?>"><?php _e(\'Give the feed a title (optional):\'); ?></label>
<input class="widefat" id="rss-title-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][title]" type="text" value="<?php echo $title; ?>" /></p>
<?php endif; if ( $inputs[\'items\'] ) : ?>
<p><label for="rss-items-<?php echo $number; ?>"><?php _e(\'How many items would you like to display?\'); ?></label>
<select id="rss-items-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][items]">
<?php
    for ( $i = 1; $i <= 20; ++$i )
        echo "<option value=\'$i\' " . ( $items == $i ? "selected=\'selected\'" : \'\' ) . ">$i</option>";
?>
</select></p>
<?php endif; if ( $inputs[\'show_summary\'] ) : ?>
<p><input id="rss-show-summary-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][show_summary]" type="checkbox" value="1" <?php if ( $show_summary ) echo \'checked="checked"\'; ?>/>
<label for="rss-show-summary-<?php echo $number; ?>"><?php _e(\'Display item content?\'); ?></label></p>
<?php endif; if ( $inputs[\'show_author\'] ) : ?>
<p><input id="rss-show-author-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][show_author]" type="checkbox" value="1" <?php if ( $show_author ) echo \'checked="checked"\'; ?>/>
<label for="rss-show-author-<?php echo $number; ?>"><?php _e(\'Display item author if available?\'); ?></label></p>
<?php endif; if ( $inputs[\'show_date\'] ) : ?>
<p><input id="rss-show-date-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][show_date]" type="checkbox" value="1" <?php if ( $show_date ) echo \'checked="checked"\'; ?>/>
<label for="rss-show-date-<?php echo $number; ?>"><?php _e(\'Display item date?\'); ?></label></p>
<?php endif; if ( $inputs[\'reverse\'] ) : ?>
<p><input id="rss-reverse-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][reverse]" type="checkbox" value="1" <?php if ( $reverse ) echo \'checked="checked"\'; ?>/>
<label for="rss-reverse-<?php echo $number; ?>"><?php _e(\'Reverse Order?\'); ?></label></p>
<?php
endif;
foreach ( array_keys($default_inputs) as $input ) :
    if ( \'hidden\' === $inputs[$input] ) :
        $id = str_replace( \'_\', \'-\', $input );
?>
<input type="hidden" id="rss-<?php echo $id; ?>-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][<?php echo $input; ?>]" value="<?php echo $$input; ?>" />
<?php
    endif;
    endforeach;
}

function register_rss_widget() {
    unregister_widget( \'WP_Widget_RSS\' );
    register_widget( \'Reverse_Widget_RSS\' );
}
add_action( \'widgets_init\', \'register_rss_widget\' );

SO网友:ZweiBlumen

将以下代码添加到主题的函数中。php文件应该做到这一点:

function feedFilter($query) {
    if ($query->is_feed) {
        $query->set(\'order\',\'ASC\');
        $query->set(\'orderby\',\'date\');
        }
    return $query;
}
add_filter(\'pre_get_posts\',\'feedFilter\');
注意:这将影响所有RSS源。您可以通过进一步检查查询的目的(即不只是示例中的“is\\u feed”)来针对更具体的feed。

这是一篇有关自定义查询的详细信息的文章:

http://codex.wordpress.org/Custom_Queries

SO网友:Chris Cox

最简单的方法是用一个自定义作业替换核心RSS小部件,该作业在显示之前反转提要项。类似于:

<?php foreach (array_reverse($feed->get_items()) as $item): ?>

SO网友:solepixel

不确定是否有其他人在处理这个问题,或者这篇文章中的答案是否过时,但这是我使用的方法,它大大减少了代码的重复:

add_action(\'wp_feed_options\', \'myaction_reverse_feed\');

function myaction_reverse_feed(&$feed, $url=NULL){

    if(!$url){
        $url = $feed->feed_url;
    }


    if(!class_exists(\'SimplePieReversed\')){
        class SimplePieReversed extends SimplePie {
            public static function sort_items($a, $b)
            {
                return $a->get_date(\'U\') >= $b->get_date(\'U\');
            }
        }
    }

    $feed = new SimplePieReversed();

    $feed->set_sanitize_class( \'WP_SimplePie_Sanitize_KSES\' );
    // We must manually overwrite $feed->sanitize because SimplePie\'s
    // constructor sets it before we have a chance to set the sanitization class
    $feed->sanitize = new WP_SimplePie_Sanitize_KSES();

    $feed->set_cache_class( \'WP_Feed_Cache\' );
    $feed->set_file_class( \'WP_SimplePie_File\' );

    $feed->set_feed_url($url);
    $feed->set_cache_duration( apply_filters( \'wp_feed_cache_transient_lifetime\', 12 * HOUR_IN_SECONDS, $url ) );
}

SO网友:Norcross

设置CPT仍然是首选,所以您可以为开始日期添加一个元字段。每种帖子类型都有自己的RSS提要,独立于帖子。

SO网友:kovshenin

你首先应该看的是default-widgets.php includes文件夹中的文件和WP_Widget_RSS 使用wp_widget_rss_output 函数来呈现RSS输出。该函数没有任何方便的过滤器或操作,您可以通过挂钩来覆盖其行为,这意味着您最好创建自己的小部件。

您可以简单地将整个WP\\u Widget\\u RSS类复制并粘贴到插件或您的函数中。php文件(不要忘记wp_widget_rss_output, wp_widget_rss_formwp_widget_rss_process 函数),然后进行适当的修改(不要忘记修改小部件名称和slug)

希望这有帮助!祝你好运:)

结束

相关推荐

重写自定义帖子类型RSS提要链接

我正在寻找一种方法来重写位于http://localhost:8888/feed/?post_type=post 到http://localhost:8888/feed/portfoliothis post建议使用http://localhost:8888/portfolio/feed/哪个不是主提要,而是评论提要,有什么想法吗?http://localhost:8888/portfolio/feed目前,上述内容也用于评论。