# Author: Charles Johnson # License: GPL # Version: 2005.11.06 # # USAGE # ----- # update-feeds.php is a useful script for instructing the FeedWordPress plugin # to scan for fresh content on the feeds that it syndicates. This is handy if # you want your syndication site to actually syndicate content, and you can't # rely on all your contributors to send you an XML-RPC ping when they update. # # 1. Install FeedWordPress and activate the FeedWordPress plugin. (See # if you need a guide # for the perplexed.) # # 2. If you want to manually update one or more of your feeds, you can do # so by pointing your web browser to the URI # , where `http://xyz.com/` is # replaced by the URI to your installation of WordPress. Log in as any # user in your WordPress database and use the form to update. # # 3. To keep content up-to-date automatically, set up a cron job to run # update-feeds.php locally: # # cd /path/to/wordpress/wp-content ; php update-feeds.php # # where `/path/to/wordpress` is replaced by the filesystem path to your # installation of WordPress; or, if you don't have, or don't want to use, # command-line PHP, you can send an HTTP POST request to the appropriate # URI: # # curl --user user:pass http://xyz.com/wp-content/update-feeds.php -d update=quiet # # `user` and `pass` should be replaced by the username and password of # a user in your WordPress database (you can create a dummy user for # updates if you want; that's what I do). `http://xyz.com/` should be # replaced by the URI to your installation of WordPress. # # Don't be afraid to run this cron job frequently. FeedWordPress staggers # updates over time rather than checking all of the feeds every time the # cron job runs, so even if the cron job runs every 10 minutes, each feed # will, on average only be polled for updates once an hour or so (or less # frequently if the feed author requests less frequent updates using # the RSS element or the syndication module elements). # # 4. If you want to update *one* of the feeds rather than *all* of them, then # pass the URI and title as command-line arguments: # # $ php update-feeds.php http://radgeek.com # # or in the POST request: # # $ curl --user login:password http://xyz.com/wp-content/update-feeds.php -d uri=http://www.radgeek.com\&update=quiet # // Help us to pick out errors, if any. ini_set('error_reporting', E_ALL & ~E_NOTICE); ini_set('display_errors', true); define('MAGPIE_DEBUG', true); // Are we running from a web request or from the command line? if (!isset($_SERVER['REQUEST_URI'])) : $update_feeds_display = 'text/plain'; $update_feeds_invoke = 'cmd'; elseif (isset($_POST['update'])) : if ($_POST['update'] == 'quiet') : $update_feeds_display = 'text/plain'; $update_feeds_invoke = 'post'; $update_feeds_verbose = false; elseif ($_POST['update'] == 'verbose') : $update_feeds_display = 'text/plain'; $update_feeds_invoke = 'post'; $update_feeds_verbose = true; else : $update_feeds_display = 'text/html'; $update_feeds_invoke = 'post'; endif; else : $update_feeds_display = 'text/html'; $update_feeds_invoke = 'get'; endif; require_once ('../wp-blog-header.php'); function update_feeds_mention ($feed) { global $update_feeds_display; if ($update_feeds_display=='text/html') : echo "
  • Updating ".$feed['link/name']." from <".$feed['link/uri']."> ...
  • \n"; else : echo "* Updating ".$feed['link/name']." from <".$feed['link/uri']."> ...\n"; endif; flush(); } # -- Don't change these unless you know what you're doing... define ('RPC_MAGIC', 'tag:radgeek.com/projects/feedwordpress/'); // update all // Query secret word from database $rpc_secret = get_settings('feedwordpress_rpc_secret'); header("Content-Type: {$update_feeds_display}; charset=utf-8"); # -- Are we running from an HTTP GET, HTTP POST, or from the command line? if ($update_feeds_invoke != 'cmd') : // We're acessing this from HTTP GET or HTTP POST // Authenticate the user, if possible ... if (isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])) : // try HTTP authentication $login = $_SERVER['PHP_AUTH_USER']; $pass = $_SERVER['PHP_AUTH_PW']; elseif (isset($_POST['log']) and isset($_POST['pwd'])) : // try POST data $login = $_REQUEST['log']; $pass = $_REQUEST['pwd']; endif; if (empty($login) or empty($pass) or !wp_login($login, $pass)) : if ($update_feeds_display=='text/html') : auth_redirect(); // try authentication cookies; if all else fails, redirect to wp-login.php else : echo "update-feeds (".date('Y-m-d H:i:s')."): ERROR: Could not log in as '$login'/pass='$pass']\n"; die; endif; endif; // Henceforward, we can proceed on the assumption that we have an authenticated user $uri = (isset($_REQUEST['uri']) ? $_REQUEST['uri'] : RPC_MAGIC.$rpc_secret); if ($update_feeds_display=='text/html') : echo << update-feeds :: FeedWordPress

    update-feeds: make FeedWordPress check for new syndicated content

    EOHTML; endif; else : // update-feeds has been invoked from the command line; no further // authentication is necessary. (If PAM hasn't already done the // necessary screening for you, you have bigger problems than their // access to FeedWordPress...) $uri = (isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : RPC_MAGIC.$rpc_secret); endif; $feedwordpress =& new FeedWordPress; if ($update_feeds_display=='text/html' or $update_feeds_verbose) : add_action('feedwordpress_check_feed', 'update_feeds_mention'); endif; if ($update_feeds_display=='text/html') : // HTTP GET or HTTP POST: add some web niceties echo "
    \n"; echo " "; echo "\n"; echo "
    \n"; endif; if ($update_feeds_invoke != 'get') : // Only do things with side-effects for HTTP POST or command line if ($update_feeds_display == 'text/html') : echo "
      \n"; endif; $delta = @$feedwordpress->update($uri); if ($update_feeds_display == 'text/html') : echo "
    \n"; endif; if (is_null($delta)) : if ($update_feeds_invoke == 'cmd') : $stderr = fopen('php://stderr', 'w'); fputs($stderr, "update-feeds (".date('Y-m-d H:i:s')."): ERROR: I don't syndicate <$uri>\n"); elseif ($update_feeds_display == 'text/plain') : echo "update-feeds (".date('Y-m-d H:i:s')."): ERROR: I don't syndicate <$uri>\n"; else : echo "

    Error: I don't syndicate $uri

    \n"; endif; elseif ($update_feeds_display=='text/html' or $update_feeds_verbose) : $mesg = array(); if (isset($delta['new'])) : $mesg[] = ' '.$delta['new'].' new posts were syndicated'; endif; if (isset($delta['updated'])) : $mesg[] = ' '.$delta['updated'].' existing posts were updated'; endif; if ($update_feeds_display=='text/html') : echo "

    "; endif; echo "Update complete.".implode(' and', $mesg); if ($update_feeds_display=='text/html') : echo "

    "; endif; echo "\n"; flush(); endif; endif; if ($update_feeds_display=='text/html') : // HTTP GET or HTTP POST: close off web niceties echo <<← Return to WordPress Dashboard

    EOHTML; endif; ?>