Pubwich is an open-source PHP Web application that allows you to aggregate your published data from multiple Websites and services into a single HTML page.
Duplicate cfg/config.sample.php
to cfg/config.php
. (Optional: if you want to use a custom theme, duplicate themes/default
to themes/your_theme_name
and edit the PUBWICH_THEME
constant in cfg/config.php
to "your_theme_name"
.
Edit the newly created config.php to fill the blank spaces with your informations (API keys, usernames, site’s URL, etc.) and to modify the arguments passed to Pubwich::setServices()
. See the Services configuration section of this file.
Modify your crontab file (by running crontab -e
) and add the following line:
*/<N> * * * * <PHP> -f <ABSOLUTE_PATH>/cron/cron.php
Then replace the following elements:
<N>
→ Cache expiration (in minutes)
<PHP>
→ The path to PHP executable binary (usually /usr/bin/php
or /usr/local/bin/php
, use which php
to find it)
<ABSOLUTE_PATH>
→ Absolute path to Pubwich directory
Example: */10 * * * * /usr/bin/php -f /home/myusername/public_html/pubwich/cron/cron.php
Change the permissions on the cache directory to make it writeable for all (chmod -R 0777 cache
).
Everything should be working now (when browsing to your server!).
There are a few things that you’ll need to consider when upgrading to Pubwich 1.4; Notably, Twitter OAuth support and a new templating language.
Before Pubwich 1.4, you needed to enter your Twitter username and password in order to make request to its API. This is called “Basic Authentication”. But since Twitter dropped support for this kind of authentication in june 2010, Pubwich doesn’t support it anymore. A small tutorial is available to show you how to create a Twitter application, get OAuth application keys and access tokens.
After you are done configuring Pubwich 1.4 to work with Twitter, you can remove your Twitter username
and password
parameters from your configuration file.
Every theme has a functions.php
file that contains at least the basic template for what Pubwich calls a “box”. Along with that boxTemplate
function, you can define other templates, such as how an item is rendered for a specific service. Before Pubwich 1.4, you could use this template syntax:
function Atom_myblog_itemTemplate() {
return '<li><a href="{%url%}">{%title%}</a> - {%content%}</li>'."\n";
}
But now, with the new Mustache.php template engine, you have to use this syntax:
function Atom_myblog_itemTemplate() {
return '<li><a href="{{{url}}}">{{{title}}}</a> - {{{content}}}</li>'."\n";
}
So, basically, instead of {%variable%}
, you have to use {{{variable}}}
. The new template engine allows us to use conditionnals, loops and other kinds of cool stuff.
In Pubwich’s config.php
file, a service looks like this:
array( 'Flickr', 'photos', array(
'method' => 'FlickrUser',
'title' => 'Flick<em>r</em>',
'description' => 'latest photos',
'total' => 16,
'key' => '________',
'userid' => '________',
'username' => '__________',
'row' => 4,
)
),
Where Flickr
is the service, photos
is the variable and FlickrUser
is the method.
These parameters can be used for all services:
title
→ The box title.description
→ The box description.total
→ The number of items to display.
url
→ The feed URL.link
→ The website URL.
username
→ The Delicious.com username.
username
→ The Dribbble username.method
→DribbbleShots
.
No specific parameters
id
→ The Facebook user ID.key
→ The Facebook API key.username
→ The Facebook username.
row
→ The number of photos per row. Pubwich adds the classlast-in-row
to each row’s last photo.sort
→ The order in which to sort the photos. See this page for all the possible values.key
→ The Flickr API key.method
→ EitherFlickrUser
,FlickrGroup
,FlickrTags
userid
→ The Flickr user ID. Use this page to find it.
groupid
→ The Flickr group ID. Use this page to find it.
tags
→ The tags as anarray()
or a string with comma separated values.
username
→ The GitHub usernamemethod
→ EitherGithubRecentActivity
,GithubRepositories
andGithubGists
No specific parameters
No specific parameters
No specific parameters
userid
→ The Goodreads user ID.size
→ The size for each book cover.
username
→ The Gowalla username.password
→ The Gowalla password.key
→ The Gowalla API key.method
→ EitherGowallaUser
,GowallaUserStamps
,GowallaUserTopSpots
No specific parameters
No specific parameters
No specific parameters
username
→ The Last.fm username.key
→ The Last.fm API key.method
→ EitherLastFMRecentTracks
,LastFMWeeklyAlbums
,LastFMTopAlbums
No specific parameters
size
→ The size of each album covers.
size
→ The size of each album covers.
username
→ The Pinboard username.secret
→ The Pinboard secret token (grab it from your RSS feed URL).
username
→ The Readernaut username.method
→ EitherReadernautBooks
,ReadernautNotes
size
→ The size of each book covers.
No specific parameters
username
→ The Readernaut username.key
→ Your API key. Go to this page and extract the key from one of the JSON feeds URL.method
→RedditLiked
No specific parameters
url
→ The feed URL.link
→ The website URL.
method
→ EitherSlideShareUserSlideshows
key
→ The SlideShare API keysecret
→ The SlideShare shared secret
username
→ The SlideShare username.
method
→ EitherStatusNetUser
,StatusNetSearch
root
→ The StatusNet root URL (default ishttp://identi.ca
)username
→ The StatusNet username.password
→ The StatusNet password.
No specific parameters
terms
→ The search query.
text
→ The text to display.
-
method
→ EitherTwitterUser
,TwitterSearch
-
oauth
→ The OAuth configuration array. Example:'oauth' => array( 'app_consumer_key' => '', 'app_consumer_secret' => '', 'user_access_token' => '', 'user_access_token_secret' => '' ),
username
→ The Twitter username.
terms
→ The search query.
username
→ The Vimeo username.
username
→ The YouTube username.
When Pubwich is ready to display its data, it first looks into the theme’s functions.php
file to see if custom template functions are defined. There are currently four kinds of template functions: box templates, item templates, column templates and layout templates.
Box templates control the way whole boxes are displayed. There are a few different ways to define them:
boxTemplate()
(applies to all boxes, must be defined infunctions.php
)<Service>_boxTemplate()
<Service>_<Method>_boxTemplate()
<Service>_<Variable>_boxTemplate()
<Service>_<Method>_<Variable>_boxTemplate()
Example:
function boxTemplate() {
return '
<div class="boite {{class}}" id="{{id}}">
<h2><a rel="me" href="{{{url}}}">{{{title}}}</a> <span>{{{description}}}</span></h2>
<div class="boite-inner">
<ul class="clearfix">
{{{items}}}
</ul>
</div>
</div>';
}
Item templates control the way each box item is displayed. Each service has its own default templates, but using the following function names, you can redefine them:
<Service>_itemTemplate()
<Service>_<Method>_itemTemplate()
<Service>_<Variable>_itemTemplate()
<Service>_<Method>_<Variable>_itemTemplate()
Example:
function Twitter_TwitterUser_itemTemplate() {
return '<li class="clearfix {{#in_reply_to_screen_name}}reply{{/in_reply_to_screen_name}}"><span class="date"><a href="{{{link}}}">{{{date}}}</a></span>{{{text}}}</li>'."\n";
}
There’s currently no documentation about which tag you can put between {{{}}}
braces for which service. In the meantime, you can check a service file (located in lib/Services/<Service>.php
) and look for the populateItemTemplate
function.
The column template defines how each column is rendered. You don’t have to define this template; the default used by Pubwich is this:
'<div class="col{{{number}}}">{{{content}}}</div>'
Where {{{number}}}
is replaced by the column number and {{{content}}}
is replaced by the column content (the boxes). For instance, you could put this in your functions.php
file:
funtion columnTemplate() {
'<div class="column column-{{{number}}}"><div class="column-inner">{{{content}}}</div></div>';
}
The layout template defines the columns layout. Again, you don’t have to define this template; the default layout used by Pubwich is this (eg. if you defined 3 columns in your config.php
file):
'{{{col1}}} {{{col2}}} {{{col3}}}'
So each column is displayed one after the other. But if you’d like to change that layout, you can use this:
function layoutTemplate() {
return '<div class="first-column">{{{col1}}}</div><div class="other-columns">{{{col2}}} {{{col3}}}</div>';
}