Lessn Shortlinks WordPress Plugin

I recently pur­chased the somad.es domain for use with my own URL short­ener. (Van­ity or own­ing my own URLs: you decide.) I decided to use Alan Hogan’s Lessn More, an improved fork of Shaun Inman’s Lessn. I then decided I wanted to inte­grate the short­link into my Word­Press install, but the exist­ing WP Lessn plu­gin isn’t very good. Its admin page doesn’t adhere to WP secu­rity best prac­tices, it doesn’t use WP’s HTTP API, and it doesn’t prop­erly inte­grate with WP 3.0’s short­link API. In short, it doesn’t do things the WP way.

So, I made my own lit­tle plu­gin. I didn’t want another plu­gin set­tings page, so you have to hard­code your Lessn URL and API key. It inte­grates with the “Get Short­link” but­ton on your write/edit post screen, and the rel­e­vant short­link HTTP header and meta ele­ments are auto-inserted. Only the “post” post_type will get Lessn’d by default, but see the bot­tom of the plu­gin for how to add addi­tional post_types.

<?php
/*
Plugin Name: Lessn Shortlinks
Description: Integrates WP's shortlink functionality with the <a href="http://lessnmore.net/">Lessn More</a> URL shortener. <em>Hasn't been tested with vanilla Lessn, but the API should be compatible.</em> (Edit the file manually to configure)
Version: 1.0
Author: Matt Wiebe
Author URI: http://somadesign.ca/
*/

/**
* SD_Lessn class: integrates WP's shortlink functionality with the Lessn More
* URL shortener.
*
* @uses Lessn More @link http://lessnmore.net/
* @author Matt Wiebe
* @license GPL 2
*
**/

class SD_Lessn {

const API_KEY = 'apikey'; // your Lessn API key
const LESSN_API_BASE = 'http://shorturl.com/-/'; // the API base for your Lessn install
const META_KEY = '_lessnd_url';

private $allowed_types = array('post');

function __construct() {
add_action('publish_post', array($this, 'get_lessnd_url'), 10, 1 );
add_filter('get_shortlink', array($this, 'get_shortlink'), 10, 3 );
}

public function add_post_type( $post_type = '' ) {
if ( $post_type )
$this->allowed_types = array_merge( $this->allowed_types, (array) $post_type );
}

public function get_lessnd_url( $post_id ) {
if ( 'publish' !== get_post_status($post_id) )
return false;

if ( ! in_array( get_post_type($post_id), $this->allowed_types ) )
return false;

if ( $url = get_post_meta( $post_id, self::META_KEY, true) )
return $url;

$params = array(
'api' => self::API_KEY,
'url' => get_permalink($post_id)
);
$api_url = add_query_arg($params, self::LESSN_API_BASE);

$get = wp_remote_get($api_url);

if ( is_wp_error($get) )
return false;

$lessnd_url = wp_remote_retrieve_body($get);

if ( $lessnd_url ) {
update_post_meta( $post_id, self::META_KEY, $lessnd_url );
return $lessnd_url;
}
return false;
}

/**
* @param int $id A post or blog id. Default is 0, which means the current post or blog.
* @param string $contex Whether the id is a 'blog' id, 'post' id, or 'media' id. If 'post', the post_type of the post is consulted. If 'query', the current query is consulted to determine the id and context. Default is 'post'.
*/

public function get_shortlink( $shortlink, $id, $context ) {

if ( 'query' == $context ) {
global $wp_query;
if ( is_singular() ) {
$context = 'post';
$id = $wp_query->get_queried_object_id();
}
}

if ( 'post' !== $context )
return $shortlink;

// Try Lessn'd url.
if ( $try_lessn = $this->get_lessnd_url($id) )
return $try_lessn;
// do_action('elog', $shortlink);
return $shortlink;
}
}

$sd_lessn = new SD_Lessn;

// uncomment line below to add support for the "page" post_type
// $sd_lessn->add_post_type('page');
view raw sd_lessn.php This Gist brought to you by GitHub.

Now, I just need to fig­ure out how to inte­grate short­links for humans rather than just machines.

2 Comments

  1. Alex
    Posted July 6, 2011 at 6:17 pm | Permalink

    Hi Matt,

    I’m try­ing to get your plu­gin to work with my site, and when­ever I click the Get Short­link but­ton, the con­tent of the short­link is my 404 page.

    I added the API key and the API base.

    My lessn is installed at http://example.com/u/ and the back­end of it is at http://example.com/u/-/ … so my API base is:
    const LESSN_API_BASE = ‘http://example.com/u/-/’; // the API base for your Lessn install

    Am I miss­ing something?

    Thanks so much!!

  2. Matt
    Posted July 6, 2011 at 11:44 pm | Permalink

    That seems like it should work. Have you got­ten a link to shorten prop­erly via the API call otherwise?

One Trackback

  1. By Uptonian Thoughts on Twitter — Uptonian Thoughts on January 4, 2012 at 11:20 pm

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*