[44] | 1 | <?php /*
|
---|
| 2 | Plugin Name: RSS Aggregator
|
---|
| 3 | Plugin URI: http://www.anthonyshapley.co.uk/tools/wordpress-rss-aggregator/
|
---|
| 4 | Description: Outputs RSS Feeds into Posts
|
---|
| 5 | Version: 0.0.2
|
---|
| 6 | Author: Anthony Shapley
|
---|
| 7 | Author URI: http://www.anthonyshapley.co.uk
|
---|
| 8 |
|
---|
| 9 | Copyright (C) 2008, Anthony Shapley
|
---|
| 10 | All rights reserved.
|
---|
| 11 |
|
---|
| 12 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
---|
| 13 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
---|
| 14 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
---|
| 15 | Neither the name of Anthony Shapley nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
---|
| 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
|
---|
| 17 |
|
---|
| 18 | // Options
|
---|
| 19 |
|
---|
| 20 | $options = array();
|
---|
| 21 | $options['feeds'] = "http://feeds.feedburner.com/AnthonyShapleyAUkSeo";
|
---|
| 22 | $options['categories'] = "Aggregated Content";
|
---|
| 23 | $options['linkback'] = true;
|
---|
| 24 | $options['nofollow'] = true;
|
---|
| 25 | $options['seconds'] = true;
|
---|
| 26 | add_option("shapley_rss_aggregator",$option);
|
---|
| 27 |
|
---|
| 28 | if ( ! class_exists( 'shapley_aggregator' ) ) {
|
---|
| 29 |
|
---|
| 30 | class shapley_aggregator
|
---|
| 31 | {
|
---|
| 32 | function add_config_page()
|
---|
| 33 | {
|
---|
| 34 | global $wpdb;
|
---|
| 35 | if ( function_exists('add_submenu_page') )
|
---|
| 36 | {
|
---|
| 37 | add_options_page('Shapley RSS Aggregator', 'Aggregator', 10, basename(__FILE__),array('shapley_aggregator','config_page'));
|
---|
| 38 | }
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | function config_page()
|
---|
| 42 | {
|
---|
| 43 | if ( isset($_POST['submit']) )
|
---|
| 44 | {
|
---|
| 45 | if (!current_user_can('manage_options')) die(__('You cannot edit the Shapley RSS Aggregator options.'));
|
---|
| 46 | check_admin_referer('shapley-aggregator-updatesettings');
|
---|
| 47 |
|
---|
| 48 | foreach (array('feeds','categories','seconds') as $option_name)
|
---|
| 49 | {
|
---|
| 50 | if (isset($_POST[$option_name]))
|
---|
| 51 | {
|
---|
| 52 | $option[$option_name] = htmlentities(html_entity_decode($_POST[$option_name]));
|
---|
| 53 | }
|
---|
| 54 | }
|
---|
| 55 | foreach (array('linkback','nofollow') as $option_name)
|
---|
| 56 | {
|
---|
| 57 | if(isset($_POST[$option_name]))
|
---|
| 58 | {
|
---|
| 59 | $option[$option_name] = true;
|
---|
| 60 | }
|
---|
| 61 | else
|
---|
| 62 | {
|
---|
| 63 | $option[$option_name] = false;
|
---|
| 64 | }
|
---|
| 65 | }
|
---|
| 66 | update_option("shapley_rss_aggregator",$option);
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | $options = get_option("shapley_rss_aggregator");
|
---|
| 70 | ?>
|
---|
| 71 | <!-- Admin Form -->
|
---|
| 72 | <div class="wrap">
|
---|
| 73 | <h2>Shapley RSS Aggregator Configuration</h2>
|
---|
| 74 | <form action="" method="post" id="shapleyaggregator-conf">
|
---|
| 75 | <table class="form-table">
|
---|
| 76 | <?php if (function_exists('wp_nonce_field')) { wp_nonce_field('shapley-aggregator-updatesettings'); } ?>
|
---|
| 77 | <tr>
|
---|
| 78 | <th scope="row" valign="top">
|
---|
| 79 | <label for="feeds">RSS Feeds</label>
|
---|
| 80 | </th>
|
---|
| 81 | <td>
|
---|
| 82 | <textarea name="feeds" id="feeds" style="width:500px; height:100px;">
|
---|
| 83 | <?php echo htmlentities($options['feeds']); ?>
|
---|
| 84 | </textarea>
|
---|
| 85 | </td>
|
---|
| 86 | </tr>
|
---|
| 87 |
|
---|
| 88 | <tr>
|
---|
| 89 | <th scope="row" valign="top">
|
---|
| 90 | <label for="seconds">Seconds between each feed load:</label>
|
---|
| 91 | </th>
|
---|
| 92 | <td>
|
---|
| 93 | <input type="text" name="seconds" id="seconds" value="<?php echo htmlentities($options['seconds']); ?>" />
|
---|
| 94 | </td>
|
---|
| 95 | </tr>
|
---|
| 96 |
|
---|
| 97 | <tr>
|
---|
| 98 | <th>
|
---|
| 99 | <label for="categories">Category for the aggregated data?</label>
|
---|
| 100 | </th>
|
---|
| 101 | <td>
|
---|
| 102 | <?php wp_dropdown_categories("name=categories&show_option_none=-- None --&selected=".$options['categories']); ?>
|
---|
| 103 | </td>
|
---|
| 104 | </tr>
|
---|
| 105 |
|
---|
| 106 | <tr>
|
---|
| 107 | <th>
|
---|
| 108 | <label for="linkback">Link back to original post?</label>
|
---|
| 109 | </th>
|
---|
| 110 | <td>
|
---|
| 111 | <input type="checkbox" id="linkback" name="linkback" <?php if ($options['linkback']) { echo 'checked="checked"'; } ?>/>
|
---|
| 112 | </td>
|
---|
| 113 | </tr>
|
---|
| 114 |
|
---|
| 115 | <tr>
|
---|
| 116 | <th>
|
---|
| 117 | <label for="nofollow">No Follow the link back?</label>
|
---|
| 118 | </th>
|
---|
| 119 | <td>
|
---|
| 120 | <input type="checkbox" id="nofollow" name="nofollow" <?php if ($options['nofollow']) { echo 'checked="checked"'; } ?>/>
|
---|
| 121 | </td>
|
---|
| 122 | </tr>
|
---|
| 123 |
|
---|
| 124 | </table>
|
---|
| 125 |
|
---|
| 126 | <br/>
|
---|
| 127 | <span class="submit" style="border: 0;"><input type="submit" name="submit" value="Save Settings" /></span>
|
---|
| 128 |
|
---|
| 129 | </form>
|
---|
| 130 | </div>
|
---|
| 131 | <?
|
---|
| 132 | }
|
---|
| 133 |
|
---|
| 134 | }
|
---|
| 135 |
|
---|
| 136 | }
|
---|
| 137 | // Checks to see if the post has already been submitted, it uses URL's to do this.
|
---|
| 138 | function unique_post($rss_url)
|
---|
| 139 | {
|
---|
| 140 | $exists = false;
|
---|
| 141 | $all_posts = get_posts('numberposts=1000&post_type=post&post_status=');
|
---|
| 142 | foreach ($all_posts as $blog_post)
|
---|
| 143 | {
|
---|
| 144 | if($rss_url == get_post_meta($blog_post->ID, "url", true))
|
---|
| 145 | {
|
---|
| 146 | $exists = true;
|
---|
| 147 | }
|
---|
| 148 | }
|
---|
| 149 | return $exists;
|
---|
| 150 | }
|
---|
| 151 | function shapley_rss_aggregate()
|
---|
| 152 | {
|
---|
| 153 | $options = get_option("shapley_rss_aggregator");
|
---|
| 154 |
|
---|
| 155 | // Only check every 24 hours (this will eventually be an option)
|
---|
| 156 | if ($options['lastcheck'] < ( mktime() - $options['seconds'] ) )
|
---|
| 157 | {
|
---|
| 158 | $feed_list = split("[\n\r\t ]+",$options['feeds']);
|
---|
| 159 |
|
---|
| 160 | foreach($feed_list as $feed)
|
---|
| 161 | {
|
---|
| 162 | $valid = strpos($feed, "http://" , 0);
|
---|
| 163 | if($valid === false) // string contains http://
|
---|
| 164 | {
|
---|
| 165 | // do nothing if the string doesn't contain HTTP
|
---|
| 166 | }
|
---|
| 167 | else
|
---|
| 168 | {
|
---|
| 169 | if( ! $rssxml = simplexml_load_file( $feed ))
|
---|
| 170 | {
|
---|
| 171 | echo "<p>Unable to access the RSS Feed</p>";
|
---|
| 172 | }
|
---|
| 173 | else
|
---|
| 174 | {
|
---|
| 175 | foreach( $rssxml->channel->item as $items)
|
---|
| 176 | {
|
---|
| 177 | // This function will check to see if the post is unique
|
---|
| 178 | $unique = unique_post($items->link);
|
---|
| 179 |
|
---|
| 180 | // if the post is unique, create a new one
|
---|
| 181 | if ($unique === false)
|
---|
| 182 | {
|
---|
| 183 | // Create post array
|
---|
| 184 | $post_content = $items->description;
|
---|
| 185 | if($options['nofollow'] === true) { $rel = "rel='nofollow'"; } else { $rel = ""; }
|
---|
| 186 | if($options['linkback'] === true)
|
---|
| 187 | {
|
---|
| 188 | $post_content .= "<p>Originally posted from <a href='".$items->link."' ".$rel.">".$items->title."</a>";
|
---|
| 189 | }
|
---|
| 190 | $my_post = array();
|
---|
| 191 | $my_post['post_title'] = $items->title;
|
---|
| 192 | $my_post['post_content'] = $post_content;
|
---|
| 193 | $my_post['post_status'] = 'publish';
|
---|
| 194 | $my_post['post_author'] = 1;
|
---|
| 195 | $my_post['post_category'] = array($options['categories']);
|
---|
| 196 |
|
---|
| 197 | // wp_insert_post, returns the post id, ideal we can then add the source URL to check for uniqueness
|
---|
| 198 | $post_id = wp_insert_post( $my_post );
|
---|
| 199 |
|
---|
| 200 | // adds the source URL, this is purely to check that each post is unique
|
---|
| 201 | add_post_meta( $post_id, 'url', "".$items->link."", true);
|
---|
| 202 | }
|
---|
| 203 | }
|
---|
| 204 | }
|
---|
| 205 | }
|
---|
| 206 |
|
---|
| 207 | }
|
---|
| 208 | $options['lastcheck']= mktime();
|
---|
| 209 | update_option("shapley_rss_aggregator",$options);
|
---|
| 210 | }
|
---|
| 211 | }
|
---|
| 212 | // Run the plugin each time the footer is loaded, the plugin will cache and run hourly, could be controllable from the admin page
|
---|
| 213 | add_action('wp_footer', 'shapley_rss_aggregate');
|
---|
| 214 | // Add Admin Page
|
---|
| 215 | add_action('admin_menu', array('shapley_aggregator','add_config_page'));
|
---|
| 216 |
|
---|
| 217 | ?>
|
---|