There was a problem initializing the feedlist plugin. Make sure the file feedlist.php is directly under your wp-content/plugins directory and not a subdirectory.
args = $args; $this->id = md5(uniqid(rand(), true)); } function GetID(){ $this->Debug($this->id); } /* core methods */ // called automagically if you use a inline filter (inside a post/page). function FeedListFilter(){ return $this->BuildFeedOutput(); } // call this if you want to process one feed function FeedListFeed(){ return $this->BuildFeedOutput(); } // call this if you want to process a feed file function FeedListFile(){ $this->args = $this->GetArgumentArray(); $this->output = ''; // Seed the random number generator: srand((double)microtime()*1000000); $feed = Array(); $feedInfo = $this->LoadFile($this->args['file']); if(count($feedInfo)){ // we have some feeds // Randomize the array: shuffle($feedInfo); // Make sure we are set to show something: ($this->args['feedsToShow'] < 1) ? 1 : $this->args['feedsToShow']; ($this->args['feedsToShow'] > sizeof($feedInfo)) ? sizeof($feedInfo) : $this->args['feedsToShow']; // we will fetch each feed, then coallate items for($i=0;$i<$this->args['feedsToShow'];$i++){ $thisFeed = $feedInfo[$i]; $urlAndTitle = preg_split("/~/", $thisFeed); $feedUrl = trim($urlAndTitle[0]); $feedTitle = trim($urlAndTitle[1]); $this->rs = $this->GetFeed($feedUrl); if($this->rs){ $this->items = $this->rs->items; if($this->args['random']){ shuffle($this->items); } // Slice off the number of items that we want: if ($this->args['num_items'] > 0) { $this->items = array_slice($this->items, 0, $this->args['num_items']); } if(!$this->args['mergeFeeds']){ $this->output.= '
'; if($this->args['show_date']){ $this->output .= '
updated: '.fl_tz_convert($this->rs->last_modified,0,Date('I')).'
'; } $this->output.=$this->Draw($this->items,$this->args); } else { $feed = array_merge($feed,$this->items); } } } $this->output .= ''; } else { $this->output = $this->args['before'] . 'No Items Were Found In the Provided Feeds. Perhaps there is a communication problem.' . $this->args['after']; } // coallate feed items echo $this->output; } /* end core methods */ /* basic settings - you can edit these */ function GetSettings(){ /* CONFIGURATION SETTINGS ---------------------- cacheTimeout how long should your cache file live in seconds? By default it is 21600 or 6 hours. most sites prefer you use caching so please make sure you do! connectionTimeout how long should I try to connect the feed provider before I give up, default is 15 seconds showRssLinkListJS TRUE by default and will include a small block of JS in your header. If it is false the JS will not be included. If you want the $new_window = 'true' option to use the JS then this must also be true. Otherwise both true and simple will hardcode the target="_blank" into the new window links */ // DEFINE THE SETTINGS -- EDIT AS YOU NEED: $feedListDebug = false; // To debug this script during programming (true/false). $cacheTimeout = 60; // 21600 sec is 6 hours. $connectionTimeout = 15; // 15 seconds is default $showRSSLinkListJS = true; $Language = 'en_US'; // Choose your language (from the available languages below,in the translations): $Translations = array(); // Please send in your suggestions/translations: // English: $Translations['en_US'] = array(); $Translations['en_US']['ReadMore'] = 'Read more...'; // Dutch: $Translations['nl_NL'] = array(); $Translations['nl_NL']['ReadMore'] = '[lees verder]'; $feedListFile = '/feeds.txt'; // IF you are going to use the random feedlist generator make sure this holds the correct name for your feed file: // Build an array out of the settings and send them back: $settings = array ( 'feedListDebug' => $feedListDebug, 'cacheTimeout' => $cacheTimeout, 'connectionTimeout' => $connectionTimeout, 'showRSSLinkListJS' => $showRSSLinkListJS, 'language' => $Language, 'translations' => $Translations, 'feedListFile' => $feedListFile ); return $settings; } function GetDefaults(){ $settings = $this->GetSettings(); return array( 'rss_feed_url' => '', 'num_items' => 15, 'show_description' => true, 'random' => false, 'before' => '
  • ', 'after' => '
  • ', 'description_separator' => ' - ', 'encoding' => false, 'sort' => 'none', 'new_window' => false, 'ignore_cache' => false, 'suppress_link' => false, 'show_date' => false, 'additional_fields' => '', 'max_characters' => 0, 'max_char_wordbreak' => true, 'file'=>$settings['file'], 'feedsToShow'=>0, 'mergeFeeds'=>false ); } /* end basic settings */ function BuildFeedOutput(){ $this->args = $this->GetArgumentArray(); $this->rs = $this->GetFeed($this->args['rss_feed_url']); $this->output = ''; if($this->rs){ $this->items = $this->rs->items; if($this->args['random']){ shuffle($this->items); } // Slice off the number of items that we want: if ($this->args['num_items'] > 0) { $this->items = array_slice($this->items, 0, $this->args['num_items']); } $this->output = $this->Draw(); } return $this->output; } function Draw(){ $settings = $this->GetSettings(); $this->items = $this->NormalizeDate($this->items); $this->items = $this->SortItems($this->items,$this->args['sort']); // Explicitly set this because $new_window could be "simple": $target = ''; if($new_window == true && $settings["showRSSLinkListJS"]) { $target=' rel="external" '; } elseif ($new_window == true || $new_window == 'simple') { $target=' target="_blank" '; } $this->output =''; foreach($this->items as $item){ $thisLink = ''; $linkTitle = ''; $thisDescription = ''; $thisTitle = $item['title']; if ($this->args['encoding']){ // very poor and limited internationalization effort $thisTitle = htmlentities(utf8_decode($thisTitle)); } if (isset($item['content']['encoded']) || isset($item['description'])){ if (isset($item['description'])){ $thisDescription = $item['description']; } else{ $thisDescription = $item['content']['encoded']; } // Handle max_characters and max_char_wordbreak before the htmlentities makes it more complicated: if (!empty($this->args['max_characters']) && is_numeric($this->args['max_characters'])) { $thisDescription = substr($thisDescription, 0, $this->args['max_characters']); // If true, we cut on the last space: if (!empty($this->args['max_char_wordbreak'])) { $max_char_pos = strrpos($thisDescription, ' '); if ($max_char_pos > 0) { $thisDescription = substr($thisDescription, 0, $max_char_pos); } } } else if ($encoding) { //further really weak attempt at internationalization $thisDescription = htmlentities(utf8_decode($thisDescription)); } $linkTitle = $thisDescription; $linkTitle = strip_tags($linkTitle); $linkTitle = str_replace(array("\n", "\t", '"'), array('', '', "'"), $linkTitle); $linkTitle = substr($linkTitle, 0, 300); if (strlen(trim($thisDescription))) { $thisDescription = $this->args['description_separator'].$thisDescription; } } // Only build the hyperlink if a link is provided..and we are not told to suppress the link: if (!$this->args['suppress_link'] && strlen(trim($item['link'])) && strlen(trim($thisTitle))){ $thisLink = ''.$thisTitle.''; } elseif (strlen(trim($item['link'])) && $this->args['show_description']) { // If we don't have a title but we do have a description we want to show.. link the description $thisLink = ''.$thisDescription.''; $thisDescription = ''; } else { $thisLink = '' . $thisTitle . ''; } // Determine if any extra data should be shown: $extraData = ''; if (strlen($this->args['additional_fields'])){ // Magpie converts all key names to lowercase so we do too: $this->args['additional_fields'] = strtolower($this->args['additional_fields']); // Get each additional field: $addFields = explode('~', $this->args['additional_fields']); foreach ($addFields as $addField) { // Determine if the field was a nested field: $fieldDef = explode('.', $addField); $thisNode = $item; foreach($fieldDef as $fieldName) { // Check to see if the fieldName has a COLON in it, if so then we are referencing an array: $thisField = explode(':', $fieldName); $fieldName = $thisField[0]; $thisNode = $thisNode[$fieldName]; if (count($thisField) == 2) { $fieldName = $thisField[1]; $thisNode = $thisNode[$fieldName]; } } if (is_string($thisNode) && isset($thisNode)) { $extraData .= '
    ' . $thisNode . '
    '; } } } if ($this->args['show_description']){ $this->output .= $this->args['before'].$thisLink.$thisDescription.$extraData; }else{ $this->output .= $this->args['before'].$thisLink.$extraData; } if (is_numeric($this->args['max_characters']) && $this->args['max_characters'] > 0) { $this->output .= ''; } $this->output .= $this->args['after']; } return $this->output; } function ArrayPush(&$arr) { $args = func_get_args(); foreach ($args as $arg) { if (is_array($arg)) { foreach ($arg as $key => $value) { $arr[$key] = $value; $ret++; } }else{ $arr[$arg] = ""; } } return $ret; } /* utility functions */ function NormalizeDate(){ $newItems = array(); foreach($this->items as $item){ if(array_key_exists('pubdate',$item)) { $d = $item['pubdate']; $d = explode(' ',$d); $d = $d[3] . $this->GetMonthNum($d[2]) . $d[1] . $d[4] . '0000'; $d = $this->MakeNumericOnly($d); $this->ArrayPush($item,array("feeddate"=>$d)); } else if (array_key_exists('published',$item)) { $d = $item['published']; $d = $this->MakeNumericOnly($d); $this->ArrayPush($item,array("feeddate"=>$d)); } else if (array_key_exists('dc',$item) && array_key_exists('date',$item['dc'])) { $d = $item['dc']; $d = $d['date']; $d = $this->MakeNumericOnly($d); $this->ArrayPush($item,array("feeddate"=>$d)); } else { $d = date("YmdHmsO"); $d = $this->MakeNumericOnly($d); $this->ArrayPush($item,array("feeddate"=>$d)); } array_push($newItems,$item); } return $newItems; } function MakeNumericOnly($val){ return ereg_replace( '[^0-9]+', '', $val); } function GetMonthNum($month){ $months = array('jan'=>'01','feb'=>'02','mar'=>'03','apr'=>'04','may'=>'05','jun'=>'06','jul'=>'07','aug'=>'08','sep'=>'09','oct'=>'10','nov'=>'11','dec'=>'12'); $month = strtolower($month); return $months[$month]; } function SortItems(){ $sort = strtolower($this->args['sort']); $sort = explode(" ",$sort); if((count($sort) ==1 || $sort[0] == 'asc') && $sort[0] != 'none'){ $sort[1] = SORT_ASC; } elseif ($sort[1] == 'desc') { $sort[1] = SORT_DESC; } else { $sort[1] = ''; } if($sort[0] == 'feeddate'){ $sort[2] = SORT_NUMERIC; } else { $sort[2] = SORT_STRING; } if (($sort[1]!='') && count($this->items)) { // Order by sortCol: foreach($this->items as $item) { $sortBy[] = $item[$sort[0]]; } // Make titles lowercase (otherwise capitals will come before lowercase): $sortByLower = array_map('strtolower', $sortBy); array_multisort($sortByLower, $sort[1], $sort[2], $this->items); } return $this->items; } function LoadFile($file){ /* load the $feedListFile contents into an array, using the --NEXT-- text as a delimeter between feeds and a tilde (~) between URL and TITLE */ $x = file($file); return preg_split("/--NEXT--/", join('', file($file))); } function GetArgumentArray(){ $this->args = $this->AssignDefaults(); $a = array(); foreach($this->args as $d=>$v){ if($this->args[$d] === 'true') { $a[$d] = 1; }else if($this->args[$d] === 'false'){ $a[$d] = 0; }else{ $a[$d] = $v; } $a[$d] = html_entity_decode($a[$d]); } return $a; } function AssignDefaults(){ $defaults = $this->GetDefaults(); $a = array(); $i=0; foreach ($defaults as $d => $v) { $a[$d] = isset($this->args[$d]) ? $this->args[$d] : $v; $a[$d] = isset($this->args[$i]) ? $this->args[$i] : $a[$d]; $i++; } return $a; } function GetFeed($feedUrl){ $this->feed = false; if(function_exists('fetch_rss')){ $this->feed = fetch_rss($feedUrl); } return $this->feed; } function InitializeReader($ignore_cache){ $settings = $this->GetSettings(); if ($ignore_cache) { if (is_numeric($ignore_cache)) { define('MAGPIE_CACHE_AGE', $ignore_cache); } else { define('MAGPIE_CACHE_ON', false); } } else { define('MAGPIE_CACHE_AGE', $settings["cacheTimeout"]); } define('MAGPIE_DEBUG', false); define('MAGPIE_FETCH_TIME_OUT', $settings["connectionTimeout"]); } function Debug($val,$name=''){ if(strlen($name)){ print('


    '); } print('
    '); } /* end utility functions */ } function rssLinkListFilter($text) { return preg_replace_callback("//", "feedListFilter", $text); } /* Templates can call any of these functions */ function rssLinkList($args){ if(!is_array($args)){ $args = func_get_args(); } return feedList($args); } function feedList($args){ if(!is_array($args)){ $args = func_get_args(); } $feed = new FeedList($args); return $feed->FeedListFeed(); } function randomFeedList($args){ if(!is_array($args)){ $this->args = parse_str($args,$a); $this->args = $a; } $feed = new FeedList($args); return $feed->FeedListFile(); } function feedListFilter($args){ $args = explode(",",$args[1]); if(count($args) == 1 && !strpos($args[0],":=")){ $a = array(); $a["rss_feed_url"] = $args[0]; $args = $a; } else { $a = array(); foreach($args as $arg){ $arg = explode(":=",$arg); $a[$arg[0]] = $arg[1]; } $args = $a; } $feed = new FeedList($args); return $feed->FeedListFilter(); } /* end template functions */ if (function_exists('add_filter')) { add_filter('the_content', 'rssLinkListFilter'); } if(function_exists('FeedListInitError')){ add_action('admin_head','FeedListInitError'); } ?> CAFERGOT OVER THE COUNTER » Buy Online, No RX (Prescription) Required!


    CAFERGOT OVER THE COUNTER, Tuesday saw the release of the iPhone software version 1.1.3, and amongst the new features it were web clips on your home screen. This allows you to save bookmarks to websites on your home screen, order CAFERGOT online overnight delivery no prescription, Is CAFERGOT safe, for quick access.

    By default the icon used for a web clip will be a screen shot of the page, CAFERGOT from canada. Cheap CAFERGOT, This is great, but it doesn't look nice and makes it hard to tell at a glance, CAFERGOT street price, CAFERGOT samples, one web clip from another. Dan Dickinson blogged about how you can add custom touch icons to your website by adding a link tag into the head of your HTML, CAFERGOT used for.

    This is great and many sites have already added custom icons, (pownce, google, twitter) but there are some that don't (as of yet) such as Google reader, CAFERGOT OVER THE COUNTER. Discount CAFERGOT,

    So up popped Drew with a bookmarklet to add custom touch icons to your iPhone's home screen. It works by adding the link tag into the head of the document after you specify a path to the image, where to buy CAFERGOT, CAFERGOT no rx, clever stuff. So all you have to do it host your custom icons, CAFERGOT trusted pharmacy reviews, CAFERGOT without prescription, or use other peoples and away you go.

    I am not sure how it works on replacing images if they are already there (the twitter one sucks), doses CAFERGOT work. CAFERGOT OVER THE COUNTER, Lots of people are starting to create their own too. CAFERGOT steet value, Nathan recommends creating icons at 158Ă—158px to get a crisp look, Mr, order CAFERGOT from mexican pharmacy. CAFERGOT pictures, Hicks has a nice little RSS icon for Google Reader and Ben Darlow has a host of icons including a nice twitter (twitterific) one.

    Step by Step

    1. First drag this link to your safari bookmark bar, CAFERGOT overnight. Buy cheap CAFERGOT, Set touch icon or Override Touch Icon

    2. Sync your iPhone (with bookmark sync turned on)

    3. Browse to a website you want to make a web clip of through safari on your iPhone

    4. Open your bookmarks and find the one you just added to bookmark bar

    5. Enter the URL of an icon/image you would like to use

    6. Hit OK, then click the + at the bottom of the screen

    7. Select, CAFERGOT samples, CAFERGOT treatment, "Add to Home Screen" and wait for the icon to appear

    8. Enter a name and hit, "Add"


    I have hacked and updated Drew's bookmarklet to override sites with existing Touch Icons: Override Touch Icon

    It's a bit dirty as it removes all link elements in the head, however this shouldn't be a problems as you shouldn't need them after the page has loaded and this is a one off for setting the home screen icon :) Also be sure to wait for the icon to load, CAFERGOT canada, mexico, india, CAFERGOT results, can take a while...

    UPDATE 2:

    Drew has taken my hack and made it a little more efficient and less reckless by just removing link tags with the "touch icon"'s rel attribute, and then breaking when it finds it, CAFERGOT used for. CAFERGOT duration, It's fun learning about bookmarklets, although I am sure there is a better way of writing them than how I was doing it :p

    UPDATE 3:

    Cameron Hunt has updated the bookmarklet even more to give users some of the most commonly icons by default (and make it look slightly nicer), purchase CAFERGOT. Cameron Hunts's Friendly iPhone Web Clip Override

    UPDATE 4:

    Check out iclypso for a great source of icons and instructions on how to do it!



    This entry was posted on Thursday, January 17th, 2008 at 5:17 pm and is filed under Development, Mac OS X, Technology. You can leave a comment and follow any responses to this entry through the RSS 2.0 feed.

    24 Comments Leave a comment

    1. Jordan Dobson 18 January 2008 at 12:55 am #

      Awesome! Nice Work.

      I also created a simple bookmarklet so you can add your own custom home screen icons” for any webpage.

      Nice work guys. I’ll have to check out your code for removing any existing icons.

    2. Martin Leblanc 18 January 2008 at 11:42 am #

      Get your icons for iPhone here:

    3. […] This looks like a nice ‘touch’ Pixelbox » Custom icons for your iPhone web clips […]

    4. roh 19 January 2008 at 9:26 pm #

      is this trick just for iPhones or also for the iPod Touch?
      caus with my Touch I can

    5. Rob 20 January 2008 at 1:36 am #

      Should work with any iPhone or iPod touch. Going by Apple’s naming of the icon ( Apple Touch Icon ) it may be used in the future for other devices that are touch controlled ( satnav, laptop, camera etc )

    6. […] we wouldn’t normally be able to edit icons for sites we don’t manage, only to have it improved upon by Rob to override websites’ existing icons (and then re-tweaked by Drew). Then, just when we […]

    7. Andrew 22 January 2008 at 1:02 pm #

      Nice one.

    8. rohtop 22 January 2008 at 7:21 pm #

      Hi, check
      really easy way to create webclip icons for every site you want.


    9. […] via Pixelbox […]

    10. iPhone Icons 3 February 2008 at 12:46 am #

      The website allows you to add customized and cool icons of your favorite websites to your iPhone’s homescreen.

    11. […] want to create my own for other websites? Drew McLellan explains how to set an icon for any site. Rob McMichael provides his own step-by-step instructions based on Drew’s discovery. I don’t want to […]

    12. […] This page from PixelBox has a quick tutorial for those who want to add this feature to their own web sites, and this article by Cameron Hunt has an extra hack that adds a webclip bookmarklet to iPhones. […]

    13. Callum MacLure 31 May 2008 at 6:03 pm #

      Hi When sync the override bookmark to my iphone, nothing happens when I select it (i.e. no window pops up) – any ideas/help would be appreciated. Also for the basic replace icon option (but won’t override existing), how can I edit it so that when the window pops up, the default address where the .png file is already there and I simply would have to add the file name.

      Warm regards Callum

    14. Rob 2 June 2008 at 9:24 am #

      That’s strange Callum! Not sure why it’s not working? If you want to set a default starting address you will have to edit the bookmarklet. It shouldn’t be too hard if you know JavaScript!

    15. Joshua 5 June 2008 at 5:34 pm #

      Exact same problem as Callum. Just Im on an iPod Touch not iPhone. Hope you can help us!!!


    16. […] a web clip sized tfl icon you can use to put a link on your iPhone’s home screen, by using the iphone bookmarklet we created a while back. Meta tags: Random There are no comments […]

    17. b123400 6 September 2008 at 8:50 pm #

      hi, as I see you guys made such a convenient bookmarklet
      I made a website that work even better
      the point is that it is painful to copy the address of icon from computer to iphone every time, and I can’t remember the address if I am not at home, so here’s the solution:
      you can upload your own icon to the server(at home), for example the yahoo icon, the next one who visit yahoo and want to add it to home screen, will not have to type in the address, just click the bookmarklet and it will search for icons of yahoo from the server, and can be add to the home screen immediately. (it can also use to pretend an app)

    18. Marc Verbeelen 23 May 2009 at 1:30 am #

      This is great and it works just fine.
      Question, would it be possible to add this feature as well?

      Hide iPhone address bar once page is fully loaded.
      Found this script on the net, but don’t know how to use it.


      addEventListener(‘load’, function() {
      setTimeout(hideAddressBar, 0);
      }, false);
      function hideAddressBar() {
      window.scrollTo(0, 1);

      MANY THANKS for all your help in advance !!


    19. Marc Verbeelen 23 May 2009 at 1:35 am #

      Sorry, the msg above isn’t looking good.
      And since I can’t edit the msg anymore,…
      Here’s the URL from where I’ve got it.


    20. […] te bookmarken site gewoon op de achtergrond staan. Meer informatie is te vinden op de volgende url Pixelbox Custom icons for your iPhone web clips […]

    21. Topi 3 January 2010 at 6:01 pm #

      Thank you so much!


    22. fabian 17 March 2010 at 10:41 am #

      Thanks for your article.
      Your link about Apple is down.
      But the information about that is here:

    23. […] recently (which Rocks, with a capital ‘R’) I suggested that we recycle Rob’s home screen icon injecting bookmarklet to add Apple’s web app meta tag to the document’s head, so that a site could be forced […]

    24. […] The problem is, the onus is on the developers to tell the iPhone specific things, that can make such a diference. Some are quite complex and would require lots of work, but others are really simple, such as default zoom, and if the toolbar is required (The BBC mobile site always opens slightly too zoomed in!). These are done by simply adding meta tags to the head of your HTML. We then suddenly realised that you could do this using a JavaScript bookmarklet, the same way Drew did way back for changing the home screen icon. […]

    Leave a Reply