WordPress 2 för iPhone

Det här inlägget gjordes via applikationen ”WordPress 2” på iPhone. Det är en helt ny applikation, av någon underlig anledning har man valt att inte bara uppgradera den befintliga WordPress-appen. Många nyheter, de viktigaste är det nya gränssnittet, som är mycket trevligare än det gamla, samt det nya kommentarsgränssnittet med gravatarer.

Här kommer en omotiverad bild, som test 🙂

Skapa enkel widget i WordPress

Det är enkelt att göra en widget i WordPress. Man kan givetvis göra den hur avancerad som helst, men själva grunden är enkel och jag ska visa hur det går till.

Du vet säkert att en widget är en plugin-liknande funktion som man kan placera någonstans på sin WordPress-sajt, ofta hamnar den i sidomenyn. Vanliga exempel är ”Arkiv”, ”Taggmoln” eller ”Senaste flickr-bilderna”.

Det fungerar så att man i ett tema har definierat ett antal utrymmen där man kan placera widgets, dessa utrymmen kallas för ”sidebars”. Sidebars kan man placera i sidomenyn, footern eller egentligen var som helst i temat. I varje ”sidebar” kan sen sajt-administratören dra in en eller flera widgets.
Hos mig ser det ut så här, under ”Utseende” -> ”Widgets”.

Widgets i WordPress dashboard
Widgets i WordPress dashboard

Från och med WordPress 2.8 har det blivit lättare att skapa egna widgets. Man utgår från basklassen WP_Widget och implementerar en del av metoderna.
De här metoderna måste man implementera:

class My_Widget extends WP_Widget {
	function My_Widget() {
		// widget actual processes
	}

	function widget($args, $instance) {
		// outputs the content of the widget
	}

	function update($new_instance, $old_instance) {
		// processes widget options to be saved
	}

	function form($instance) {
		// outputs the options form on admin
	}
}
register_widget('My_Widget');

Jag tänkte bygga en widget som visar min senaste status-uppdatering från sajten Yo!. Genom att logga in på yo.se och gå till URL:en http://yo.se/widget/, får man en HTML-snutt som egentligen gör hela jobbet åt oss när det gäller att visa senaste status. den ser ut så här:

Windyjonas

Det allra enklaste hade förstås varit att klippa in den här koden i en text-widget, men då hade det här inte blivit ett exempel på hur man skapar en WordPress-widget, så vi struntar i det och går vidare 🙂

Jag kallar widgeten för ”Yo Status”, så min widgetklass ska få namnet ”Yo_Status_Widget” och de metoder jag ska implementera blir följaktligen:

  • Yo_Status_Widget() – konstruktor
  • widget() – funktionen som ska skicka ut widget-koden till webbläsaren
  • update() – Det ska gå att konfigurera widgeten. update() ser till så att man kan ändra aliasnamn (yo-användare)
  • form() – Skapar formuläret för att ändra aliasnamn

Yo_Status_Widget()

Skapa ett WP_Widget-objekt med rätt metainfo och options. ”classname” nedan är alltså css-klassen i det omslutande HTML-elementet.

function Yo_Status_Widget() {
	$widget_ops = array('classname' => 'widget_yo_status', 
            'description' => 'Display status from Yo! (http://yo.se)' );
	$this->WP_Widget('yo-status', __('Yo Status'), $widget_ops);
}

widget()

function widget($args, $instance) {
	extract($args, EXTR_SKIP);

	echo $before_widget;
	$alias = empty($instance['alias']) ? ' ' :
          apply_filters('widget_alias', $instance['alias']);
   ?>
    

update()

Den här funktionen anropas efter att användaren matat in ett yo-alias och klickat på "Spara"

function update($new_instance, $old_instance) {
	$instance = $old_instance;
	$instance['alias'] = strip_tags($new_instance['alias']);

	return $instance;
}

Formuläret som möjliggör ändring av yo-användare.

form()

	function form($instance) {
		$instance = wp_parse_args( (array) $instance, array( 'alias' => '') );
		$alias = strip_tags($instance['alias']);
?>
		

Resultat

Till slut bakar jag ihop alltihop till en ny plugin. Det hade i och för sig gått att deklarera hela widgeten i functions.php, men jag föredrar att inte röra temafilerna så mycket.
Jag gjorde en plugin av alltihop genom att skapa filen /wp-contents/plugins/yo-status/yo-status.php. En del av outputen i widget()-metoden är här utbruten i en egen metod.

 'widget_yo_status', 'description' => 'Display status from Yo! (http://yo.se)' );
		$this->WP_Widget('yo-status', __('Yo Status'), $widget_ops);
	}
 
	function yo_status($alias) {
		?>
		

yo_status($alias); echo $after_widget; } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['alias'] = strip_tags($new_instance['alias']); return $instance; } function form($instance) { $instance = wp_parse_args( (array) $instance, array( 'alias' => '') ); $alias = strip_tags($instance['alias']); ?>

Resultatet syns längst ner i högersplaten, eller om jag ändrat något, så såg det en gång ut så här:

Exempel på hur Yo Status kan se ut
Exempel på hur Yo Status kan se ut

Bildhantering i WordPress 2.9

Matt Mullenweg har vid ett flertal tillfällen antytt att det kommer att läggas mycket jobb på mediehanteringen i WordPress. Ett stort steg är den nya möjligheten att redigera bilder, en nyhet som kommer med WordPress 2.9. Tidigare har man, hjälpligt, kunnat ändra storlek på bilderna och inte så mycket mer. Men i och med den nya versionen av WordPress (som inte är släppt än, ska jag kanske säga), så ska det gå att göra enklare bildredigering, det går att beskära bilder, rotera, vända och skala upp och ner.

Så här ser det ut i den senaste officiella WordPress-versionen (2.8.4) när man vill redigera bilder:
redigera media, i WordPress 2.8.4

I den senaste utvecklar-versionen (från WordPress svn) ser det helt annorlunda ut:

Bildredigering i WordPress 2.9
Bildredigering i WordPress 2.9

Notera de nya valen för att grafiskt markera ett område och beskära, fungerar riktigt bra!

Läs mer om nyheterna i WordPress 2.9.

WordPress under attack

Äldre versioner av WordPress är sårbara för en attack som cirkulerar just nu. Om du hittar extra adminkonton på din WordPress-installation, eller om dina permalänksinställningar (Inställningar -> Permalänkar) plötsligt fått det underliga suffixet /%&(%7B$%7Beval(base64_decode($_SERVER%5BHTTP_REFERER%5D))%7D%7D|.+)&%/ då har du blivit attackerad och ”smittad”.

Uppdatera nu, även om du inte blivit attackerad! Ja, det är så allvarligt. Om du redan blivit angripen, läs Lorelles instruktioner om hur du återställer din WordPress-miljö

WordPress 2.8.4, en säkerhetsuppdatering

Det är många wordpressuppdateringar nu. Igår kom det en säkerhetsuppdatering igen och den nya versionen heter 2.8.4.
Om du kör 2.8.3 så är det definitivt läge att uppdatera, men om du väljer att inte uppdatera, så se i alla fall till att epostadressen till din admin-användare stämmer.
Sårbarheten i 2.8.3 och tidigare versioner går nämligen ut på att man kan nollställa admin-lösenordet och få ett nytt lösenord utskickat via mail.

Läs mer här och kanske framförallt här.

Blogga från din iPhone till WordPress

Du vet väl att du kan WordPress-blogga från din iPhone? Det mesta som går att göra i den vanliga administrationspanelen går också att göra via en applikation för iPhone. Saker som att skriva inlägg och sidor, förhandsgranska, redigera, välja bilder, välja kategorier med mera.
Så här gör du för att komma igång, jag förutsätter att du har en iPhone och att du har en fungerande WordPress-blogg, antingen på wordpress.com eller på egen domän.

Ladda hem programmet WordPress for iPhone från iTunes app store (antingen från iTunes eller direkt från app store i telefonen)

Om du använde iTunes, så måste du förstås synka telefonen nu, så att programmet hamnar på din iPhone.

Starta WordPress-programmet på iPhone
Första bilden ser ut något i stil med:

Programmets startbild
Programmets startbild

Välj ”Set up your blog”, och du hamnar här:

Lägg till ny blogg
Lägg till ny blogg

Fyll i adressen till din blogg, och användaruppgifterna, och välj ”Save”. Om allt har fungerat så kommer du tillbaka till startsidan igen, men nu har din blogg lagts till som ett av alternativen i listan. Om du får felmeddelandet “We could not find the XML-RPC service for your blog”, så måste du gå till administrationspanelen för din blogg och aktivera protokollet XML-RPC, det gör du under ”Inställningar” -> ”Skriva” -> ”Fjärrstyrd publicering” -> ”XML-RPC”, kryssa i den rutan där det står ”Aktivera WordPress, Movable Type, MetaWeblog och Blogger XML-RPC publiceringsprotokoll.”. Om du fortfarande har problem, se om du kan hitta en lösning i FAQ:n.
När allt fungerar kommer det att se ut så här:

Bloggen finns nu med i listan
Bloggen finns nu med i listan

Välj din blogg, då hamnar du här:

Inne i bloggen, startsida
Inne i bloggen, startsida

Härifrån kan du alltså välja att skapa eller redigera inlägg och sidor, du kan också granska kommentarer härifrån.
Välj ”posts” för att komma till inläggen.

Blogginläggen

Om du vill skapa ett nytt inlägg, så väljer du ikonen längst ner till höger i bilden här ovanför.

Skapa nytt blogginlägg
Skapa nytt blogginlägg

Så, nu är det bara att fylla i titel, kategorier, etiketter och innehåll precis som vanligt.
Du kan lägga till bilder via knappen ”Photos”.
Välj sen ”Save” för att publicera, syns inte i bilden ovan, men den dyker upp när man börjar lägga till innehåll.

Lycka till! Mer instruktioner kan man få via videoklippen WordPress for iPhone och Introducing WordPress for iPhone 1.2 eller via den officiella hemsidan för WordPress for iPhone.

Mobilblogga med WordPress och Flickr

Flickr and WordPress, a perfect match
Flickr and WordPress, a perfect match

För de som vill blogga via sin telefon finns det en mycket enkel lösning, skaffa en iPhone och installera WordPress for iPhone. Men nu är det inte alla som har en iPhone och även med en sådan vill man ibland ha en enklare lösning. Om du exempelvis bara vill mobilblogga en bild snabbt och smidigt, så vore det perfekt om det gick att helt enkelt eposta den bilden och få den att automatiskt komma upp på bloggen.
Det finns en sådan lösning för bloggar på wordpress.com, med funktionen Post by email. Tyvärr finns det inte för wp-org-bloggar (även om Matt antyder att det kan vara på gång).

Det finns ett inbyggt sätt att blogga via email för wordpress.org-bloggar, men det är krångligt och det stöder inte bilder.

Det är här Flickr kommer in i bilden, man kan eposta bilder till sitt flickr-konto och låta dem automatiskt hamna på en blogg.

Så här gör du:

  1. Skaffa ett flickr-konto
  2. Logga in till ditt nya flickr-konto och lägg till din blogg
  3. Gå till sidan för att ladda upp via epost, där får du en hemlig epostadress för att ladda upp bilder antingen bara till flickr eller direkt till din blogg (bilderna kommer förstås att hamna på flickr också). Du kan välja hur stora bilderna ska bli och hur de ska placeras i blogginläggen. Tyvärr kan man inte välja bredd helt fritt, utan det är 100×75, 240×180 eller 500x375px som gäller.
  4. Prova. Ta en bild och maila den till din hemliga epostadress och se om den dyker upp på bloggen. Glöm inte att aktivera xmlrpc-protokollet i admin-panelen.
Blogga via Flickr
Blogga via Flickr

GR2WP – Google reader shared items till WordPress

I kategorin Tips så delar jag med mig av intressanta inlägg som jag hittat via mina RSS-flöden i Google Reader.

Det finns flera andra som har liknande funktion på sina bloggar, de använder då exempelvis FeedWordPress, SharedItems2WP eller WP-o-Matic. Av olika anledningar passade ingen av dessa lösningar mig perfekt, mest för att jag ville ha full kontroll över flödet och för att det var så länge sen jag programmerade i perl …

Som jag nyss avslöjade, så skrev jag alltså ett perl-script som hämtar min shared items-feed från google reader (via XML::Atom::Syndication::Feed) och sen trycker jag in en post med de senaste bloggtipsen i WordPress (via XMLRPC::Lite).

Effekten blir den här.

Gå till Google reader, hitta ett intressant inlägg och välj ”Share with note”.

Share with note i google reader
Share with note i google reader

Lägg till en anteckning och spara.

Kör sen perlscriptet gr2wp.pl (Google Reader To WordPress).
Då skapas ett WP-inlägg med alla nya utdelade bloggposter.

Resultatet i WordPress
Resultatet i WordPress

Alla ”Jonas tipsar”-inlägg

Här kommer perlscriptet. Du får gärna använda och modifiera det helt fritt. Jag har utgått från ett script som postade google-reader shared items till delicious.

#!/usr/bin/perl -w

use strict;
use LWP::Simple;
use XML::Atom::Syndication::Feed;
use XMLRPC::Lite;
use XML::XPath;
use WordPress::XMLRPC;
use HTML::Entities;
use Time::Local;

######## CONFIGURATION ########
my $debug = 0;
# Your Google Shared Items Feed URL
my $feed_url = 'yourgoogleshareditemsfeedurl';

# A local file location for the feed
my $feed_file = '/path/to/localfeedfile.xml';

# Timestamp file
my $ts_file = "/path/to/gr2wp_timestamp.lis";

# WordPress post title
$wp_title = "post title";

# WordPress post categories (example: ['Fashion','Beauty'])
# (The categories must exist before posting)
@wp_categories = ['category'];

# WordPress user
$wp_user = 'username';

# WordPress password
$wp_pwd = 'password';

# WordPress proxy (URL to xmlrpc.php, don't forget to activate xmlrpc protocol in blog!)
$wp_proxy = 'http://sitename/xmlrpc.php';

######## END CONFIGURATION ########

# start time handling
my @now = localtime;
my $time = timelocal(@now);

# Subtract one week (default if no timestamp file found)
my $default_start = $time - 7 * 24 * 60 * 60; 

my $start_date;

# fetch last startdate or, if not found, pick a date one week ago
if (-e $ts_file) {
	open FP, "<$ts_file" or die "Could not open file $ts_file: $! \n";
	$start_date = ()[0];
	close FP;
	chomp $start_date;
	$start_date =~ s/\s//g;
} else {
	$start_date = $default_start;
}

print "Start date: ", $start_date, "\n" if $debug;
print "now: ", $time, "\n" if $debug;

# Set the google reader namespace URI
my $gr = 'http://www.google.com/schemas/reader/atom/';

#snag a local copy of the shared items feed
my $status = getstore($feed_url,$feed_file);
	die "Error $status fetching the Google Reader feed." unless is_success($status); 

# Init the wordpress API
my $o = WordPress::XMLRPC->new({
username => $wp_user,
password => $wp_pwd,
proxy => $wp_proxy,
});

#parse the shared items feed
my $feed = XML::Atom::Syndication::Feed->new($feed_file);
my @entries = $feed->entries;

# loop through items in the feed
my $buf = "
    "; my $post_count = 0; foreach my $entry (@entries) { # grab the title, link, and source title my $postTitle = encode_entities($entry->title->body); my $postLink = $entry->link->href; my $sourceTitle = encode_entities($entry->source->title->body); # get the time this item was shared my $shareTime = $entry->get_attribute($gr,'crawl-timestamp-msec'); # convert from milliseconds to seconds $shareTime = $shareTime/1000; # skip item if it was shared before the start date next if $shareTime < $start_date; $post_count++; #grab any notes my $xp = $entry->as_xml; # get the notes, this should probably be simplified ... my $notes = encode_entities($1, "\200-\377") if $xp =~ m/annotation>(.*?)<\/content>/; # Remove the "CDATA" bit, if present $notes = $1 if $notes =~ m//s; print "Title: $postTitle\n" if $debug; print "Link: $postLink\n" if $debug; print "Source: $sourceTitle\n" if $debug; # Create the post content $buf .= "
  • $sourceTitle: $postTitle
  • "; if ($notes) { $buf .= "
    "; $buf .= "$notes"; $buf .= "
    "; } } $buf .= "
"; #Delete the local copy of the feed unlink($feed_file); # timestamp my $ymd = sub{sprintf '%04d-%02d-%02d', $_[5]+1900, $_[4]+1, $_[3]}->(localtime); my $content_hashref; $content_hashref->{title} = "$wp_title - $ymd"; $content_hashref->{categories} = @wp_categories; $content_hashref->{description} = $buf; # Post to wordpress if ($post_count > 0) { $o->newPost($content_hashref, 1); open FP, ">$ts_file" or die "Could not open file $ts_file for writing: $!\n"; print FP $time; close FP; } else { print "No posts\n"; } # Debugging purposes, write post to local file gr2wp_debug.lis if ($debug) { open OFP, ">gr2wp_debug.lis"; print OFP $buf; close OFP; }

För enkelhetens skull kör jag perl-scriptet en gång om dagen, via crontab.