Yesterday I wrote about a problem that I’m having with a WordPress plugin that I’m working on, and I said that I think it’s a bug in WordPress. Here are some more information about it.

What the plugin is supposed to do

The plugin should cross-post/syndicate any new post to Twitter. There are a lot of plugins already that does this, but I wanted a few special features.

  • If a post has a title, post the title and a link back to the blog to Twitter. (If the title is too long for Twitter, truncate it.)
  • If a post doesn’t have a title and is 140 characters or less, post all of it to Twitter.
    • If it is more than 140 characters long, truncate it and post the truncated text plus a link back to the blog to Twitter.

So far so good. This all works as intended. There is however one more thing that it’s supposed to do:

  • If I’m posting a link post, a link to the thing I’m linking to, not a link back to my site, should be posted to Twitter along with the title of my post.
    This is accomplished by the use of Post Formats. I give every link post Post Format link.

The technical part

The plugin hooks into the publish_post action and early on in its code it checks if ( get_post_format( $ID ) == 'link' ). If it returns true an XPath query retrieves the href of the first <a> element and uses this instead of the permalink in the Twitter post.

The XPath part works just fine in all my tests.

The problem

As long as I post from the WordPress Admin interface, everything works as intended. The problem occurs when I post using the Press This bookmarklet. When I post this way, if ( get_post_format( $ID ) == 'link' ) never returns true, regardless of the post format.

If I create the post using Press This but instead of publishing I save it as a draft and then publish from the Admin panel, it works as intended.

Do you have a solution?

If so, please let me know.

The code is available on GitHub but I’ve kept the repository private since I’m a little bit embraced by the code, but let me know if you’d like to check it out and I’ll add you to the repo.

I’m working on a WordPress plugin to syndicate my posts to Twitter. I know, there are lots of plugins that does that already but none of the ones I’ve found does it the way I want, so I decided to roll my own. I’ve got the basics working and have been using it on my site for quite some time now. However, I’ve encountered a problem. Here’s how I want it to work:

When I publish a link post, instead of posting a link back to my site to Twitter, it should post the link to the site that I’m linking to. The plugin ”knows” whether it’s a link post or not based on

At first glance this works fine and it worked in development. However, ones I started using it on my site I realized that it only worked some of the times and other times it wouldn’t recognize a link post.

Tonight I’ve managed to narrow it down. It seems like the problem occurs when I post with the ”Press this” bookmarklet. If I do that, even a post that clearly has been givet the ”link” post format still returns false for if ( get_post_format( $ID ) == 'link' ). If I post the exact same content using the WordPress dashboard the post is recognized as a link post and everything else works as intended.

Is this a bug in WordPress? I should investigate this further but right now I need to go to bed, so I’m throwing the question out to you, smart people on the internet, instead.

Almost a year ago I wrote about WordPress’ Link Manager. It’s an old feature of WP that seems to get very little use these days. But it is a way to collect links to websites and, this is the important part, their corresponding RSS/Atom feeds, and get an OPML file os the websites in question.

Collected links can be put in categories and every category has its own OPML. You can find the OPML for all my links here.

OPML is one of the file formats that can feed a river in River 5. As far as I know the OPML that River 5 reads needs to be in the lists folder in your River 5 installation, so at first glance that seems to rule out using WordPress’ OPML feature.

The not so secret sauce that makes it work is the ”include” node in OPML. In my lists folder I have and OPML file for each and every river I want River 5 to generate. Each of those files contain a single <outline> node that links to the corresponding category among my WP links.

For example, my ”Everything feed”:

This tells River 5 to include everything it finds at the URL http://blog.henrikcarlsson.se/wp-links-opml.php which, as I just mentioned, is the full list of links that I collect in my sites link manager.

So whenever I want to add or remove a link (site/blog/etc) I just use WordPress’ link manager. That makes it very simple to add and remove stuff and therefore I’m more likely to try to add new sites to the mix and see if they add to my satisfaction or not.

Today I started working on a WordPress plugin (I’ll tell you more about it soon). To do that I needed to brush up a bit on my plugin-writing skills. I’ve always found making WordPress plugins unnecessary frustrating but as I searched for some articles about it today I found this:

Since WordPress 2.8, building widgets has been a matter of extending WordPress’ own widget class, WP_Widget, resulting in your custom widget only having to focus on 4 main functions:

  1. Initialisation (__construct) – handles actions to take when the widget is first created such as enqueueing specific javascript or stylesheets in the output
  2. Front-end display (widget) – handles the generation of the widget’s HTML output
  3. Back-end form (form) – handles the generation of the form controls that make up the widgets edit interface in the Admin interface
  4. Update (update) – handles the form submission from the back-end form, updating stored data as necessary

How To Build WordPress Widgets Like A Pro – WPMU DEV

I had completely missed this. In my mind plugins was still this boiler-plate filled bag of hurt. Instead all you got to do is subclassing WP_Widget and replacing a couple of methods. Wow!

As I took the approach suggested in the article and based my code on the sample code in it, I got up and running super-quick. A beta version of the plugin is actually running on my local machine already, after maybe an hours worth of work. The fact that it was so easy makes me very happy and gives me the urge to write more plugins.

I think Dave Winer really nails it with this quote and elaboration:1

A.J. Liebling said, famously: ”Freedom of the press is guaranteed only to those who own one.” That’s so true, and with blogging everyone can own their own, and therefore be free. However, we’re trading that in for a bit more engagement.

Dave Winer. (2015)

I will link to this post on twitter so likely most of you who read it will find it there. You’re likely tweeting quite a lot yourself, and that is a good thing. I don’t think you should stop tweeting, and I’m pretty sure Dave doesn’t think that either. I am, however, saying that you should also use your own ”printing press” from time to time.

Use your blog for some of your writing!2 Don’t have a blog? Get one!

I have a lot of bad things to say about WordPress, but if you want an easy-to-setup, easy-to-manage blog you should give it a try. (This site is a WordPress site.) It’s optimal if you self-host it. That way you definitely own every word on it.

Don’t feel like self-hosting? Get an account at WordPress.com. Yes, you are using somebody else’s ”printing press” but at least that somebody is somebody who is dedicated to open publishing and to ensure that you own what you write and that you can write whatever the hell you want.

Afraid that nobody will read what you write if it’s not on Twitter or Facebook or Instagram or [insert whatever]? Write in on your blog and then link to it on your social networks of choice?

You can even use a tool such as Dave’s Radio3 that allows you to make a link blog, or a list of short status updates, and simultaneously publish to Twitter, Facebook, WordPress and an RSS-feed. It’s a great tool that I use for most of my tweeting these days. That way, what I tweet also ends of as link-posts or status-posts here on the blog as well.

But what if I really don’t like WordPress?

There are other options, for both self-hosted and hosted solutions. If you decide to go with a hosted one, the most important thing is to make sure that it has a clear and easy way for you to export everything you write in full fidelity.


  1. I should admit that I’d never heard of neither Liebling nor the famous saying before. 
  2. If you find yourself writing more than two consecutive tweets about the same thing, maybe it is not something that you be tweeted. Maybe it should be written as a blog post instead. 

Well, maybe I’m exaggerating a bit, but today (or yesterday since it’s passed midnight here) I did what I should have done long before and checked out Markdown. According to its creator John Gruber it’s

a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).

It is both a way to write plain text documents so that their content is somewhat formatted and a tool to convert this text to xhtml.

The reason I checked this out today (or was it yesterday?) was an article in Macworld called Forget fancy formatting: Why plain text is best. It made some good points about why plain text is almost always better than something written in for example Microsoft Word or Apple Pages.

[Plain text is] timeless. My grandchildren will be able to read a text file I create today, long after anybody can remember what the heck a .dotx file is.

The article then mentioned some tools that was great for plain text writing, among them Byword which according to the article ”has baked-in support for Markdown”. I’d heard about Markdown before, mostly from Merlin Mann in the Back To Work podcast so now I finally made myself find out what it was. (Finding out was as easy as clicking the link in the Macworld article.)

The concept behind Markdown seemed really great, so I decided to try it, and to buy Byword. So far I’ve just made some test documents with the Byword/Markdown combination (as well as writing this blog post) and I must say it seems pretty great. I do a whole lot of writing in my work and most of it is just simple text documents that I’ve used to write in Microsoft Word (yes, I actually do like Word) but I guess the bulk of my writing this upcoming semester will be done full-screen in Byword using Markdown and then exporting the appropriate format. (Apart from xhtml, Byword also exports as .doc, .pdf, .rtf and Latex.)

One more thing

I also found out that although Markdown is written in Perl there is a php version and that version also works as a WordPress plugin. So this very blogpost is written in Byword, marked up (or down?) with Markdown and will then be pasted into a post in my blog, where you will read it.

I just picked up my secondary computer and logged in on this blog. The first thing I saw was WordPress telling me that I use an old browser. Since Safari 5.1 is out, apparently 5.0.5 is considered old. This is a fairly aggressive mode (I prefer to see things like IE6/7/8 and Firefox 3 as old) but I love it.

Good work WordPress! Anything that make people update their browsers more often is great.

I somras bytte jag webbhotell, från dåliga Scorpion Data till bra Binero. Det gjorde mitt liv lättare på alla sätt och vis, bortsett från en detalj. Helt plötsligt slutade autouppdateringen av WordPress att fungera för mig.

När WordPress släpps i en ny version så talar alla WordPress-bloggars kontrollpanel om detta för sina administratörer och frågar om en uppdatering ska göras. Det finns två sätt att göra detta på. Antingen genom att ladda ner WP och sedan ersätta den befintliga installationen på din webbserver. Detta är en inte helt självklar process eftersom du måste se till att inte råka radera filer du vill behålla (teman, uppladdad media etc).

Den enklare lösningen är att låta WordPress autouppdatera sig själv vilket har fungerat ypperligt, tills jag bytte till Binero. Jag har provat att söka efter en lösning i deras WIKI och FAQ men utan att lyckas. Dock hade jag fram tills idag inte brytt mig om att maila eller twittra till deras support.

Idag frågade JohanTwitter om någon annan hade problem med att uppdatera till WordPress 3.0.4. Eftersom jag vet att Johan också använder Binero så passade jag på att vidarebefordra frågan till @binero, kontot på twitter som de använder för support. Vi fick mycket snabbt ett svar som löste Johans problem. Jag antar att det även kommer lösa problemet för mig.

Om du har samma problem så kan du läsa lösningen här. I korthet så går det ut på att lägga in följande kod någonstans i din wp-config.php-fil.

define( 'FS_METHOD', 'direct' );
define( 'FS_CHMOD_DIR', 0755 );
define( 'FS_CHMOD_FILE', 0644 );

Det här är ett något nördigt blogginlägg. (Det är väl i och för sig nästan samtliga mina inlägg.) För att du ska kunna tillgodogöra dig det ordentligt så bör du nog ha en grundläggande uppfattning om vad Gnu General Public Licence (GPL), ”Copyleft” och Free Software/Open Source innebär. Jag ska dock försöka att löpande förklara dessa begrepp något.

Eftersom det varit Arvikafestival (läs mera under Arvikafestival-taggen) så har jag inte varit så närvarande på internet som jag brukar de senaste dagarna. Därför hade jag fram tills igår kväll helt missat att det uppstått en strid i WordPress-världen. Denna strid har börjat kring huruvida WordPress-temat Thesis måste licensieras som GPL eller inte.

En av grundbultarna i GPL är att mjukvara med denna licens som distribueras (vare sig detta görs gratis eller till en kostnad) ska finnas tillgänglig även som källkod. Den som tillskansar sig mjukvaran och källkoden genom ett köp eller genom att ”bara” ladda ner en gratismjukvara ska ha rätten att modifiera källkoden hur som helst samt även vidaredistribuera sin modifierade version. Denna modifierade version måste dock också tillgängliggöras enligt GPL.

Detta är viktigt att komma ihåg att free i Free Software inte betyder gratis, det betyder fri. På engelska brukar man tala om att skilja på free som i free speech och free som i free beer. Free Software är free som i free speech. Det kan vara ”free beer” också, men det måste inte vara det. För att ta ölanalogin vidare så kan man säga att en öl som vore GPL eller Free Software (Free Maltware? 🙂 ) skulle levereras med receptet till kunden, alldeles oavsett hur mycket eller lite ölen kostade. Stadens lokala krögare kan sedan brygga eget öl enligt receptet, modifiera det om h*n vill, och sedan sälja till krogbesökarna under förutsättning att receptet fortfarande gavs ut tillsammans med ölen.

Jag skulle vilja påstå att i det sammanhang vi nu diskuterar så kan termerna Free Software, GPL-programvara och Open Source användas som synonymer.

Thesis är alltså ett WordPress-tema. WordPress är licensierat via GPL, det är inte Thesis. Två frågor uppstår då i sammanhanget.

  1. Är det olagligt (bryter det mot WordPress licenssavtal) att licensiera Thesis som något annat än GPL-mjukvara?
  2. Är alla WordPress-teman tvingade av GPL att själva licensieras och distribueras som GPL?

Den första frågan är enklast och minst kontroversiell att besvara. Som bevisats (här, t.ex.) så innehåller Thesis mycket kod som är tagen direkt ur eller kopierad och modifierad från WordPress-källkod. Det är alltså en vidareutveckling och modifiering av en GPL-mjukvara vilket givetvis innebär att även modifikationen, alltså Thesis, måste licensieras enligt GPL.

Fråga två blir mera komplicerad och mera av en ideologisk fråga. Det inlägget i debatten som var tyckte var mest givande var Drew BlasBeyond Thesis: Does the GPL go too far, and what makes a derivative work?” Det var även Blas som gjorde jämförelsen mellan Thesis-källkod och WordPress som jag länkade till ovan.

Så vida jag inte missförstår något bland tekniska termer och amerikanska juridiska termer så är Blas av samma åsikt som jag. Thesis är tveklöst ett ”derivative work” av WordPress och måste därför licensieras i enlighet med GPL. Däremot kan GPL aldrig tvinga samtliga temautvecklare att GPLa sina arbeten. Ett WordPress-tema är tätt integrerat med WordPress, absolut. Mark Jaquith (som är av motsatt åsikt) skriver följande (källa):

Theme code combines with WordPress code in a way that makes them one functional unit. This is what makes WordPress themes so powerful and flexible.

Detta är ett riktigt nonsenspåstående som kan användas för vilket plugin eller liknande till vilket program som helst. När jag mixar ett stycke musik i Logic och använder mig av min Focusrite Liquid Mix som audio-plugins så integrerar dessa som en enhet, vilket gör det så kraftfullt. Det innebär inte på något sätt att Apple, ägare till Logic, genom sin licens har någon bestämmanderätt över Focusrites arbete. Likaså kan samma exempel användas på vilken välskriven mjukvara och ett operativsystem som helst. Detta skulle då innebära att all mjukvara som kan köras på GNU/Linux måste vara GPL eftersom applikationen länkas tätt samman med operativsystemet och för användaren framstår som en enhet.

En annan sak som komplicerar frågan ytterligare är de olika upphovsrättslagar som existerar i olika länder. GPL är skriven för amerikansk lagstiftning och fungerar kanske därmed inte som den ska i övriga länder.

Andy Skelton skriver också ett intressant inlägg (länk) om hur GPL-kravet på PHP-filerna i ett WordPress-tema kan kringås genom att man skapar ett GPL-tema som sköter all kommunikation med WordPress-kärnan och sedan till kommersiella tema som bara arbetar med output från det GPL:ade temat.

Även perpetual beta skriver ett inlägg som ligger i linje med mina åsikter och övertygelser i frågan. (länk) Intressant parentes från pb:

(In fact, if any one thing “incorporates” another, it’s most likely WordPress incorporating the theme, by use of the PHP include() call, rather than the other way around.)

Som jag har förstått det så var hela grundidén med GPL att hindra en eller annan intressent från att låsa in mjukvara i en licens som gynnade dem. Alltså är det djupaste ironi att WordPress försöker sig på samma sak nu.

Nu är det viktigt att betona att Free Software-rörelsen och WordPress-samhället är just rörelser. Det är inte en människa eller en organisation med en enhetlig åsikt. Men om merparten av Free Software-förespråkarna börjar argumentera i samma linje som många av WordPress-utvecklarna verkar göra så kommer det allvarligt att påverka FS framtid, just för att resonemanget även skulle gälla program som körs på GNU/Linux (eller vilket annat GPL-operativsystem som helst). Jag kan mycket väl tänka mig att det skulle få många att tänka efter en gång extra innan de började utveckla för en Open Source-plattform.

Jag för min del älskar för närvarande WordPress. Men jag skulle helt klart fundera på att börja använda något annat om det visar sig att allt jag gör i form av temat och plugins kommer styras av WordPress licens istället för mina önskemål.

Hur som helst så vore det spännande om någon temautvecklare som inte GPL:at sitt tema (men inte heller kopierat kod direkt ur WordPress som Thesis har gjort) tvingades till domstol av WordPress. Då skulle det åtminstone finnas ett prejudikat i efterhand. Min gissning är att WordPress skulle få storstryk i en sådan rättegång. Flera av de bloggartiklar som jag har länkat till här visar på liknande fall (utan GPL) där parten som var i WordPress sits har fått stryk i rättgång.

Så min åsikt är alltså att Thesis tveklöst har gjort en modifiering av en GPL-programvara (WordPress) och därmed måste de licensiera Thesis på samma sätt. Däremot gäller inte detta för alla WP-teman. Ett WordPress-tema kan helt klart säljas med en kommersiell licens.

Designen av den nya bloggen går framåt. I stora drag är den klar men det är några saker till som jag vill fixa lite med. Framförallt så är det att jag vill ta in hela hemsidan i WordPress. Just nu är det bara själva bloggen som är där. Musiken och Om Kalkyl är två separata php-sidor. För att göra det så snyggt som möjligt så kräver det en hel del webbdesignande, men slutresultatet blir förhoppningsvis riktigt bra.

Nu är det nog dags att slå ihop datorn för idag. I morgon ska jag göra fler inspelningar. Lite mera elgitarr, några akustiska gitarrer och sång. Jag hinner knappast allt, men åtminstone något. Sen har jag resten av helgen på mig att göra det jag inte hinner i morgon.

Igår hittade en eller flera spambots till den här bloggen vilket resulterade i cirka 350 kommentarer med länkar till siter som säljer ”läkemedel”. Tack vare Johan har jag sedan tidigare WordPress-pluginen ”Akismet” aktiverad, så samtliga kommentarer markerades som spam och blev aldrig publicerade.

Problemet är att ingen spamfilter är perfekt. Å ena sidan kan det missa spam, vilket är lätt åtgärdat. Å andra sidan så kan det markera legitima kommentarer som spam, vilket är värre. Därför vill jag helst gå igenom listan över spam innan jag tömmer den men när den är över 200 kommentarer lång, som den var i morse, så är det inte så kul. Alltså raderade jag allt som Akismet markerat som Spam.

Så om du vet med dig att du skrev någon kommentar här på bloggen under gårdagskvällen som du inte hittar nu, skriv den igen. Den försvann nog tyvärr med all spam.

För några veckor sedan försökte jag installera ”WordPress.com Stats” på den här bloggen för att kunna se hur många besökare jag har. Installationen gick smärtfritt precis som den brukar i WordPress. Dock fick jag aldrig några besök. Någon vecka gick utan en enda besökare, vilket kändes rätt besynnerligt (jag visste att några läste den, men tydligen utan att registreras som besökare). Gång på gång kollade jag alla inställningar i pluginen men utan att hitta något fel.

För cirka en vecka fick jag den självklara snilleblixten att kolla upp FAQ-sidan för pluggen. Där hittade jag följande:

What if the stats don’t start showing up? Do I need anything special in my theme?
Yes, your theme must have a call to
< ?php wp_footer(); ?> at the very bottom right before the </body>-tag.

Där var alltså svaret. Eftersom jag designat och programmerat temat till den här bloggen själv så hade jag tidigare missat detta. Så om du har samma problem (besöksstatistik som inte registreras), se till att wp_footer() anropas.