PluginProbe
Super RSS Reader – Add attractive RSS Feed Widget / 4.7
Super RSS Reader – Add attractive RSS Feed Widget v4.7
trunk 0.8 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 3.0 3.1 3.2 4.0 4.0.1 4.1 4.2 4.3 4.4 4.4.1 4.5 4.6 4.7 4.8 All 33 releases
super-rss-reader / includes / feed.php

feed.php in Super RSS Reader – Add attractive RSS Feed Widget 4.7, at includes/feed.php

377 lines 14.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Prepares the feed HTML
4 *
5 */
6
7 if( ! defined( 'ABSPATH' ) ) exit;
8
9 class SRR_Feed{
10
11 public $options = array();
12
13 public function __construct( $options ){
14
15 $this->options = wp_parse_args( $options, SRR_Options::defaults() );
16
17 }
18
19 public function html(){
20
21 $urls = trim( $this->options['urls'] );
22 $tab_titles = $this->options['tab_titles'];
23 $count = intval( $this->options['count'] );
24
25 $show_date = intval( $this->options['show_date'] );
26 $show_desc = intval( $this->options['show_desc'] );
27 $show_author = intval( $this->options['show_author'] );
28 $show_thumb = intval( $this->options['show_thumb'] );
29 $open_newtab = intval( $this->options['open_newtab'] );
30 $add_nofollow = intval( $this->options['add_nofollow'] );
31 $strip_desc = intval( $this->options['strip_desc'] );
32 $strip_title = intval( $this->options['strip_title'] );
33 $date_format = $this->options['date_format'];
34 $date_timezone = $this->options['date_timezone'];
35 $order_by = $this->options['order_by'];
36 $read_more = $this->options['read_more'];
37 $rich_desc = intval( $this->options['rich_desc'] );
38 $desc_type = $this->options['desc_type'];
39 $thumbnail_position = $this->options['thumbnail_position'];
40 $thumbnail_size = $this->options['thumbnail_size'];
41 $thumbnail_default = $this->options['thumbnail_default'];
42 $no_feed_text = $this->options['no_feed_text'];
43
44 $color_theme = $this->options['color_style'];
45 $display_type = $this->options['display_type'];
46 $visible_items = intval( $this->options['visible_items'] );
47 $ticker_speed = intval( $this->options['ticker_speed'] ) * 1000;
48
49 if( empty( $urls ) ){
50 return '';
51 }
52
53 $url_delim = strpos( $urls, ',' ) !== false ? ',' : "\n";
54 $tab_title_delim = strpos( $tab_titles, ',' ) !== false ? ',' : "\n";
55
56 $urls = explode( $url_delim, $urls );
57 $tab_titles = explode( $tab_title_delim, $tab_titles );
58 $url_count = count( $urls );
59
60 $feeds = array();
61 $html = '';
62 $no_feed_html = '<div>' . wp_kses_post( $no_feed_text ) . '</div>';
63
64 $classes = array( 'srr-wrap', 'srr-style-' . $color_theme );
65 if( $display_type == 'vertical_ticker' ) array_push( $classes, 'srr-vticker' );
66 $class = implode( ' ', $classes );
67
68 // Fetch the feed
69 for( $i=0; $i < $url_count; $i++ ){
70 $feed_url = trim( $urls[$i] );
71
72 // Skip if the RSS feed URL is same as the site URL
73 if ( in_array( untrailingslashit( $feed_url ), array( site_url(), home_url() ), true ) ) {
74 continue;
75 }
76
77 $feed = fetch_feed( $feed_url );
78
79 if( is_wp_error( $feed ) ){
80 $feed_title = __( 'Error' );
81 }else{
82 $feed_title = ( isset( $tab_titles[$i] ) && !empty( $tab_titles[$i] ) ) ? $tab_titles[$i] : strip_tags( $feed->get_title() );
83 }
84
85 $feeds[ $feed_url ] = array(
86 'id' => rand( 100, 999 ),
87 'feed' => $feed,
88 'title' => $feed_title
89 );
90 }
91
92 // Generate tabs
93 if( $url_count > 1 ){
94 $html .= '<ul class="srr-tab-wrap srr-tab-style-' . esc_attr( $color_theme ) . ' srr-clearfix">';
95 foreach( $feeds as $url => $data ){
96 $id = $data[ 'id' ];
97 $feed = $data[ 'feed' ];
98 $html .= '<li data-tab="srr-tab-' . esc_attr( $id ) . '">' . wp_kses_post( $data[ 'title' ] ) . '</li>';
99 }
100 $html .= '</ul>';
101 }
102
103 // Generate feed items
104 foreach( $feeds as $url => $data ){
105
106 $id = $data[ 'id' ];
107 $feed = $data[ 'feed' ];
108
109 // Check for feed errors
110 if ( is_wp_error( $feed ) ){
111 $html .= '<div class="srr-wrap srr-style-' . esc_attr( $color_theme ) .'" data-id="srr-tab-' . esc_attr( $id ) . '"><p>RSS Error: ' . wp_kses_post( $feed->get_error_message() ) . '</p></div>';
112 continue;
113 }
114
115 if( method_exists( $feed, 'enable_order_by_date' ) ){
116 if( in_array( $order_by, array( 'date', 'date_reverse' ) ) ){
117 $feed->enable_order_by_date( true );
118 }else{
119 $feed->enable_order_by_date( false );
120 }
121 }
122
123 // Outer wrap start
124 $html .= '<div class="' . esc_attr( $class ) . '" data-visible="' . esc_attr( $visible_items ) . '" data-speed="' . esc_attr( $ticker_speed ) . '" data-id="srr-tab-' . esc_attr( $id ) . '">';
125 $html .= '<div>';
126
127 $max_items = $feed->get_item_quantity();
128
129 // Check feed items
130 if ( $max_items == 0 ){
131 $html .= $no_feed_html;
132 }else{
133
134 $feed_items = $feed->get_items();
135 $feed_items = $this->process_items( $feed_items, $count, $order_by );
136 $j=1;
137
138 // Loop through each feed item
139 foreach( $feed_items as $item ){
140
141 // Link
142 $link = $item->get_link();
143 while ( stristr( $link, 'http' ) != $link ){ $link = substr( $link, 1 ); }
144 $link = strip_tags($link);
145
146 // Title
147 $title = strip_tags( $item->get_title() );
148 $title_full = $title;
149
150 if ( empty( $title ) ){
151 $title = __( 'No Title', 'super-rss-reader' );
152 }
153
154 if( $strip_title > 0 && strlen( $title ) > $strip_title ){
155 $title = wp_trim_words( $title, $strip_title );
156 }
157
158 // Open links in new tab
159 $new_tab = $open_newtab ? ' target="_blank"' : '';
160
161 // Add no follow attribute
162 $no_follow = $add_nofollow ? ' rel="nofollow noopener noreferrer"' : '';
163
164 if( empty( $link ) ){
165 $link = '#';
166 $new_tab = '';
167 }
168
169 // Date
170 $date = '';
171 $date_full = strip_tags( $item->get_date() );
172
173 if( strtolower( $date_format ) == 'relative' ){
174 $item_date = $item->get_date( 'U' );
175 if( $item_date ){
176 $date = human_time_diff( $item_date, current_time( 'U' ) ) . ' ' . __( 'ago' );
177 }else{
178 $date = __( 'Today' );
179 }
180 }else{
181 $date = SRR_Utilities::date_i18n( $date_format, $item->get_date( 'U' ), $date_timezone );
182 }
183
184 // Thumbnail
185 $thumb = '';
186 if ( $show_thumb == 1 ){
187 $thumb_url = $this->get_thumbnail_url( $item, $thumbnail_default );
188 $thumb_url = apply_filters( 'srr_mod_thumbnail_url', $thumb_url, $item, $feed, $thumbnail_default );
189 if( !empty( $thumb_url ) ){
190 $thumb_styles = array(
191 'width' => $thumbnail_size,
192 'height' => $thumbnail_size
193 );
194 $thumb_style = '';
195 foreach( $thumb_styles as $prop => $val ){
196 $thumb_style .= "$prop:$val;";
197 }
198 $thumb = '<a href="' . esc_url( $link ) . '" class="srr-thumb srr-thumb-' . esc_attr( $thumbnail_position ) . '" style="' . esc_attr( $thumb_style ) . '" ' . $new_tab . $no_follow . '><img src="' . esc_url( $thumb_url ) . '" alt="' . esc_attr( $title_full ) . '" align="left"' . ( wp_lazy_loading_enabled( 'img', 'srr-thumbnail' ) ? ' loading="lazy"' : '' ) . ' /></a>';
199 }
200 }
201
202 // Description
203 $desc = '';
204 if( $show_desc ){
205 $desc_content = ( $desc_type == 'summary' ) ? $item->get_description() : $item->get_content();
206 if( $rich_desc ){
207 $desc = wp_kses_post( strip_tags( $desc_content, '<p><a><img><em><strong><font><strike><s><u><i><br>' ) );
208 }else{
209 $desc = str_replace( array( "\n", "\r" ), ' ', strip_tags( @html_entity_decode( $desc_content, ENT_QUOTES, get_option('blog_charset') ) ) );
210
211 if( $strip_desc != 0 ){
212 $desc = wp_trim_words( $desc, $strip_desc );
213 if ( '[...]' == substr( $desc, -5 ) ){
214 $desc = substr( $desc, 0, -5 );
215 }elseif ( '[&hellip;]' != substr( $desc, -10 ) ){
216 $desc .= '';
217 }
218 }
219
220 $desc = trim( esc_html( $desc ) );
221 if( !empty( $desc ) ){
222 $read_more_link = !empty( $read_more ) ? ' <a href="' . esc_url( $link ) . '" title="' . esc_attr__( 'Read more', 'super-rss-reader' ) . '"' . $new_tab . $no_follow . ' class="srr-read-more">' . esc_html( $read_more ) . '</a>' : '';
223 $desc = $desc . $read_more_link;
224 }
225
226 }
227 }
228
229 // Author
230 $author = '';
231 if( $show_author ){
232 $author = $item->get_author();
233 if ( is_object( $author ) ) {
234 $author = strip_tags( $author->get_name() );
235 }
236 }
237
238 $t_title = '';
239 $t_meta = '';
240 $t_thumb = '';
241 $t_desc = '';
242
243 $t_title .= '<div class="srr-title"><a href="' . esc_url( $link ) . '"' . $new_tab . $no_follow . ' title="' . esc_attr( $title_full ) . '">' . esc_html( $title ) . '</a></div>';
244
245 // Metadata
246 if( $show_date || $show_author ){
247 $t_meta .= '<div class="srr-meta">';
248 if( $show_date && !empty( $date ) ){
249 $t_meta .= '<time class="srr-date" title="' . esc_attr( $date_full ) . ' UTC">' . esc_html( $date ) . '</time>';
250 }
251
252 if( $show_author && !empty( $author ) ){
253 $t_meta .= ' - <cite class="srr-author">' . esc_html( $author ) . '</cite>';
254 }
255 $t_meta .= '</div>'; // End meta
256 }
257
258 if ( $show_thumb ){
259 $t_thumb .= $thumb;
260 }
261
262 if( $show_desc && !empty( $desc ) ){
263 $t_desc .= '<div class="srr-summary srr-clearfix">';
264 $t_desc .= $rich_desc ? $desc : ( '<p>' . $desc . '</p>' );
265 $t_desc .= '</div>'; // End summary
266 }
267
268 $f_data = apply_filters( 'srr_mod_item_html', array(
269 'title' => $t_title,
270 'meta' => $t_meta,
271 'thumbnail' => $t_thumb,
272 'description' => $t_desc,
273 'before' => '',
274 'after' => ''
275 ), $url, $item );
276
277 $f_title = !isset( $f_data[ 'title' ] ) ? '' : $f_data[ 'title' ];
278 $f_meta = !isset( $f_data[ 'meta' ] ) ? '' : $f_data[ 'meta' ];
279 $f_thumb = !isset( $f_data[ 'thumbnail' ] ) ? '' : $f_data[ 'thumbnail' ];
280 $f_desc = !isset( $f_data[ 'description' ] ) ? '' : $f_data[ 'description' ];
281 $f_before = !isset( $f_data[ 'before' ] ) ? '' : $f_data[ 'before' ];
282 $f_after = !isset( $f_data[ 'after' ] ) ? '' : $f_data[ 'after' ];
283
284 // Display the feed items
285 $html .= '<div class="srr-item ' . ( ( $j%2 == 0 ) ? 'srr-stripe' : '') . '">';
286 $html .= '<div class="srr-clearfix">';
287 $html .= $f_before;
288 $html .= $f_title . $f_meta . $f_thumb . $f_desc;
289 $html .= $f_after;
290 $html .= '</div>'; // End item inner clearfix
291 $html .= '</div>'; // End feed item
292
293 $j++;
294 }
295
296 if( $j == 1 ){
297 $html .= $no_feed_html;
298 }
299
300 }
301
302 // Outer wrap end
303 $html .= '</div></div>' ;
304
305 if( !is_wp_error( $feed ) )
306 $feed->__destruct();
307
308 unset( $feed );
309
310 }
311
312 $html = '<div class="srr-main">' . $html . '</div>';
313
314 return $html;
315
316 }
317
318 function process_items( $items, $count, $order_by ){
319
320 if( count( $items ) == 0 ){
321 return $items;
322 }
323
324 // For shuffle order - Shuffle first and then slice as per count
325 if( $order_by == 'random' ){
326 shuffle( $items );
327 return array_slice( $items, 0, $count );
328 }
329
330 // For date based order - slice first and then order
331 $items = array_slice( $items, 0, $count );
332
333 if( $order_by == 'date_reverse' ){
334 $items = array_reverse( $items );
335 }
336
337 return $items;
338
339 }
340
341 function get_thumbnail_url( $item, $thumbnail_default ){
342
343 // Try to get from the item enclosure
344 $enclosure = $item->get_enclosure();
345
346 if ( $enclosure->get_thumbnail() ) {
347 return $enclosure->get_thumbnail();
348 }
349
350 if ( $enclosure->get_link() ) {
351 return $enclosure->get_link();
352 }
353
354 // Try to get from item content
355 $content = $item->get_content();
356
357 preg_match_all('~<img.*?src=["\']+(.*?)["\']+~', $content, $urls);
358 $urls = $urls[1];
359
360 if( !empty( $urls ) ){
361 return $urls[0];
362 }
363
364 // Try to get the image tag finally if available
365 $image = $item->get_item_tags( '', 'image' );
366
367 if( isset( $image[0]['data'] ) ){
368 return $image[0]['data'];
369 }
370
371 return trim( $thumbnail_default );
372
373 }
374
375 }
376
377 ?>