WordPress.org

Plugin Directory

Changeset 587063


Ignore:
Timestamp:
08/18/12 05:57:53 (20 months ago)
Author:
betzster
Message:

Version 1.1

Location:
jb-shortener/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • jb-shortener/trunk/jb-shortener.php

    r482909 r587063  
    44Plugin URI: http://joshbetz.com/2011/11/jb-shortener/ 
    55Description: Changes the WordPress shorturl and Twitter Tools URL based on a base-36 encode of the post ID. Also includes materials to setup custom shorturl domain. 
    6 Version: 1.0 
     6Version: 1.1 
    77Author: Josh Betz 
    88Author URI: http://joshbetz.com 
    99*/ 
    1010 
    11 add_filter('get_shortlink', 'jb_shortlinks',10,3); 
    12 function jb_shortlinks() { 
    13   global $post; 
    14   $id = base36($post->ID); 
    15   $shorturl = get_option('jb_shorturl'); 
    16   return "$shorturl/$id"; 
     11class JB_Shortlinks { 
     12 
     13    function __construct() { 
     14        add_action( 'init', array( $this, 'init' ) ); 
     15        add_action( 'init', array( $this, 'jb_redirect' ), 1 ); 
     16        add_action( 'admin_init', array( $this, 'jb_shorturl_settings' ) ); 
     17        if ( is_multisite() ) { 
     18            register_activation_hook( __FILE__, array( $this, 'jb_maybe_create_db' ) ); 
     19            register_deactivation_hook( __FILE__, array( $this, 'jb_delete_db_entry' ) ); 
     20        } 
     21    } 
     22 
     23    function init() { 
     24        // Replace core shortlinks with JB shortlinks 
     25        add_filter( 'get_shortlink', array( $this, 'jb_shortlink' ), 10, 4 ); 
     26 
     27        // Get the short URL for Twitter Tools 
     28        add_filter( 'tweet_blog_post_url', array( $this, 'jb_shortenter' ) ); 
     29    } 
     30 
     31    /** 
     32     * Redirect to the correct page based on the short url 
     33     */ 
     34    function jb_redirect() { 
     35        $jb_domain = esc_url( $_SERVER[ 'HTTP_HOST' ] ); 
     36 
     37        if( $jb_domain == get_option( 'jb_shorturl' ) ) { 
     38            $token = trim( esc_url( $_SERVER[ 'REQUEST_URI' ] ), '/' ); 
     39            $domain = esc_url( get_option( 'siteurl' ) ); 
     40 
     41            if ( ! empty( $token ) ) { 
     42                $id = intval( $token, 36 ); 
     43                $permalink = get_permalink( $id ); 
     44 
     45                if( $permalink ) { 
     46                    // Redirect to the permalink 
     47                    wp_safe_redirect( $permalink, 301 ); 
     48                } else { 
     49                    // No post with that ID exists, go home 
     50                    wp_safe_redirect( $domain, 302 ); 
     51                } 
     52            } 
     53            else 
     54                wp_safe_redirect( $domain, 301 ); 
     55 
     56            exit; 
     57        } 
     58    } 
     59 
     60    function jb_shortlink( $shortlink, $id, $context, $allowslugs ) { 
     61        return esc_url( get_option( 'jb_shorturl' ) ) . '/' . self::base36( $id ); 
     62    } 
     63 
     64    function jb_shortenter( $url ) { 
     65        $parts = explode( '/', $url ); 
     66        $slug = $parts[ count( $parts ) - 1 ]; 
     67 
     68        $args = array( 
     69            'name' => $slug, 
     70            'post_type' => 'post', 
     71            'post_status' => 'publish', 
     72            'numberposts' => 1 
     73        ); 
     74 
     75        $post = get_posts( $args ); 
     76        $id = self::base36( $post[0]->ID ); 
     77        $shorturl = esc_url( get_option( 'jb_shorturl' ) ); 
     78 
     79        return "$shorturl/$id"; 
     80    } 
     81 
     82    /** 
     83     * Add our short domain setting to the General settings page 
     84     */ 
     85    function jb_shorturl_settings() { 
     86        add_settings_field( 'jb_shorturl', __( 'Short URL' ), array( $this, 'jb_settings_callback' ), 'general', 'default', array( 'label_for' => 'jb_shorturl' ) ); 
     87        register_setting( 'general', 'jb_shorturl', 'esc_url' ); 
     88    } 
     89 
     90    /** 
     91     * Output a field to define the short domain 
     92     */ 
     93    function jb_settings_callback() { 
     94        echo '<input name="jb_shorturl" id="jb_shorturl" type="text" value="' . $this->get_jb_shorturl() . '" class="code regular-text"> <span class="description">The custom short url for your site</span>'; 
     95    } 
     96 
     97    /** 
     98     * Get the short url 
     99     * 
     100     * If we're in mulisite, look it up in the extra database table. 
     101     * If we're not in multisite, just use get_option 
     102     */ 
     103    function get_jb_shorturl() { 
     104        global $wpdb, $blog_id; 
     105         
     106        if( ! is_multisite() ) 
     107            return get_option( "jb_shorturl" ); 
     108         
     109        $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
     110        $where = $wpdb->prepare( 'blog_id = %s', $blog_id ); 
     111         
     112        if( get_option('jb_shorturl') == $wpdb->get_var( "SELECT domain FROM {$wpdb->jbtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1" ) ) { 
     113            return get_option( 'jb_shorturl' ); 
     114        } else { 
     115            $this->update_jb_shorturl( get_option( 'jb_shorturl' ) ); 
     116        } 
     117    } 
     118 
     119    /** 
     120     * Update the short domain in the extra table 
     121     * 
     122     * This only gets called if we're in multisite because 
     123     * we're using a standard options page otherwise 
     124     */ 
     125    function update_jb_shorturl( $domain ) { 
     126        global $wpdb, $blog_id; 
     127 
     128        $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
     129        $where = $wpdb->prepare( 'blog_id = %s', $blog_id );   
     130 
     131        if( $id = $wpdb->get_var( "SELECT id FROM {$wpdb->jbtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1" ) ) { 
     132            $wpdb->update( $wpdb->jbtable, array( 'domain' => $domain ), array( 'id' => $id ), '%s', '%d' ); 
     133        } else { 
     134            $wpdb->insert( $wpdb->jbtable, array( 'blog_id' => $blog_id, 'domain' => $domain ), array( '%d', '%s' ) ); 
     135        } 
     136    } 
     137 
     138    /** 
     139     * Create a new database table on install if we're in multisite 
     140     */ 
     141    function jb_maybe_create_db() { 
     142        global $wpdb; 
     143 
     144        $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
     145        if ( is_super_admin() || is_site_admin() ) { 
     146            if ( $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->jbtable}'" ) != $wpdb->jbtable ) { 
     147                $created = $wpdb->query( "CREATE TABLE IF NOT EXISTS `{$wpdb->jbtable}` ( 
     148                    `id` bigint(20) NOT NULL auto_increment, 
     149                    `blog_id` bigint(20) NOT NULL, 
     150                    `domain` varchar(255) NOT NULL, 
     151                    PRIMARY KEY  (`id`), 
     152                    KEY `blog_id` (`blog_id`,`domain`) 
     153                    );" ); 
     154                if ( $created ) { 
     155                    '<div id="message" class="updated fade"><p><strong>Shortlink database table created</strong></p></div>'; 
     156                } 
     157            } 
     158        } 
     159    } 
     160 
     161    /** 
     162     * Delete the extra database table on uninstall if we're in multisite 
     163     */ 
     164    function jb_delete_db_entry() { 
     165        global $wpdb; 
     166 
     167        $blog_id = get_current_blog_id(); 
     168        $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
     169        if( is_super_admin() || is_site_admin() ) { 
     170            $where = $wpdb->prepare( 'blog_id = %s', $blog_id );   
     171            $deleted = $wpdb->query( "DELETE FROM {$wpdb->jbtable} WHERE {$where} LIMIT 1" ); 
     172            if( $deleted ) { 
     173                echo '<div id="message" class="updated fade"><p><strong>Shortlinks plugin has been disabled</strong></p></div>'; 
     174            }  
     175        } 
     176    } 
     177 
     178    /** 
     179     * Converts a base 10 number to base36 
     180     */ 
     181    static function base36( $number ) { 
     182        return base_convert( $number, 10, 36 ); 
     183    } 
     184 
    17185} 
    18186 
    19 add_filter('tweet_blog_post_url', 'jb_shortenter'); 
    20 function jb_shortenter($url) { 
    21   $parts = explode('/',$url); 
    22   $count = count($parts); 
    23   $slug = $parts[$count-1]; 
    24   $args=array( 
    25     'name' => $slug_to_get, 
    26     'post_type' => 'post', 
    27     'post_status' => 'publish', 
    28     'showposts' => 1, 
    29     'caller_get_posts'=> 1 
    30   ); 
    31   $my_posts = get_posts($args); 
    32   $id = base36($my_posts[0]->ID); 
    33   $shorturl = get_option('jb_shorturl'); 
    34   return "$shorturl/$id"; 
    35 } 
    36  
    37 add_action('admin_init', 'jb_shorturl_settings'); 
    38 function jb_shorturl_settings() { 
    39   add_settings_field('jb_shorturl', "Short URL", "jb_settings_callback", "general", "default", array("label_for"=>"jb_shorturl")); 
    40   register_setting('general','jb_shorturl', 'esc_url'); 
    41 } 
    42 function jb_settings_callback() { 
    43   echo '<input name="jb_shorturl" id="jb_shorturl" type="text" value="'.get_jb_shorturl().'" class="code regular-text"> <span class="description">The custom short url for your site</span>'; 
    44 } 
    45  
    46 /* UTILITY */ 
    47 function base36($number) { 
    48   return base_convert($number, 10, 36); 
    49 } 
    50  
    51 add_action('init', 'jb_redirect'); 
    52 function jb_redirect() { 
    53   global $wpdb; 
    54    
    55     $jb_domain = $wpdb->escape( $_SERVER[ 'HTTP_HOST' ] ); 
    56     $jb_domain = "http://" . $jb_domain; 
    57  
    58     if( $jb_domain == get_option('jb_shorturl') ) { 
    59       $domain = get_option('siteurl'); 
    60       $token = trim($wpdb->escape( $_SERVER['REQUEST_URI'] ), '/'); 
    61    
    62       if (!empty($token)) { 
    63         $id = base_convert(strip_tags($token), 36, 10); 
    64             $permalink = get_permalink($id); 
    65         if($permalink) { 
    66           wp_redirect("$permalink", 301); 
    67           exit(); 
    68         } 
    69       } else { 
    70         wp_redirect("$domain/", 301); 
    71         exit(); 
    72       } 
    73        
    74     wp_redirect("$domain/", 302); 
    75     exit(); 
    76     } 
    77 } 
    78  
    79 if( is_multisite() ) { 
    80   register_activation_hook( __FILE__, 'jb_maybe_create_db' ); 
    81   function jb_maybe_create_db() { 
    82     global $wpdb; 
    83  
    84     $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
    85     if ( is_super_admin() || is_site_admin() ) { 
    86         if ( $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->jbtable}'") != $wpdb->jbtable ) { 
    87             $created = $wpdb->query( "CREATE TABLE IF NOT EXISTS `{$wpdb->jbtable}` ( 
    88                 `id` bigint(20) NOT NULL auto_increment, 
    89                 `blog_id` bigint(20) NOT NULL, 
    90                 `domain` varchar(255) NOT NULL, 
    91                 PRIMARY KEY  (`id`), 
    92                 KEY `blog_id` (`blog_id`,`domain`) 
    93             );" ); 
    94             if ( $created ) { 
    95                 '<div id="message" class="updated fade"><p><strong>Shortlink database table created</strong></p></div>'; 
    96             } 
    97         } 
    98     } 
    99   } 
    100    
    101   register_deactivation_hook( __FILE__, 'jb_delete_db_entry' ); 
    102   function jb_delete_db_entry() { 
    103     global $wpdb; 
    104      
    105     $blog_id = get_current_blog_id(); 
    106     $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
    107     if( is_super_admin() || is_site_admin() ) { 
    108       $where = $wpdb->prepare( 'blog_id = %s', $blog_id );   
    109       $deleted = $wpdb->query( "DELETE FROM {$wpdb->jbtable} WHERE {$where} LIMIT 1" ); 
    110       if( $deleted ) { 
    111         echo '<div id="message" class="updated fade"><p><strong>Shortlinks plugin has been disabled</strong></p></div>'; 
    112       }  
    113     } 
    114   } 
    115 } 
    116  
    117 function get_jb_shorturl() { 
    118     global $wpdb, $blog_id; 
    119      
    120     if(!is_multisite()) { 
    121         return get_option("jb_shorturl"); 
    122     } 
    123      
    124     $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
    125     $where = $wpdb->prepare( 'blog_id = %s', $blog_id ); 
    126      
    127     if( get_option('jb_shorturl') == $wpdb->get_var( "SELECT domain FROM {$wpdb->jbtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1" ) ) { 
    128         return get_option('jb_shorturl'); 
    129     } else { 
    130         update_jb_shorturl(get_option('jb_shorturl')); 
    131     } 
    132 } 
    133  
    134 function update_jb_shorturl($domain) { 
    135   global $wpdb, $blog_id; 
    136    
    137     $wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
    138   $where = $wpdb->prepare( 'blog_id = %s', $blog_id );   
    139    
    140   if( $id = $wpdb->get_var( "SELECT id FROM {$wpdb->jbtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1") ) { 
    141     $wpdb->update($wpdb->jbtable, array( 
    142       'domain' => $domain 
    143     ), array( 
    144      'id' => $id       
    145     ), '%s', '%d'); 
    146   } else { 
    147         $wpdb->insert($wpdb->jbtable, array( 
    148             'blog_id' => $blog_id, 
    149             'domain' => $domain 
    150         ), array( 
    151             '%d', 
    152             '%s' 
    153         )); 
    154   } 
    155 } 
    156  
    157 ?> 
     187new JB_Shortlinks(); 
  • jb-shortener/trunk/readme.txt

    r482909 r587063  
    33Tags: shorturl, twitter 
    44Requires at least: 3.3 
    5 Tested up to: 3.3 
    6 Stable tag: 1.0 
     5Tested up to: 3.4.1 
     6Stable tag: 1.1 
    77 
    88Changes the Short URL and the Twitter Tools URL for each post on your site using a custom, shortened domain and a base-36 encode of the post ID. 
     
    1010== Description == 
    1111 
    12 This plugin modifies the default short-url functionality to work with a custom shortened domain that you own. It works fully with Twitter Tools, a popular plugin for automatically tweeting about new posts. If you have a twitter plugin that you think we should support, let us know. For the nerds: we're doing a base-36 encode of the post ID as the short-url for each post. 
    13  
    14 *Note*: This plugin no longer requires external hosting of shortening scripts. 
     12Changes the Short URL and the Twitter Tools URL for each post on your site using a custom, shortened domain and a base-36 encode of the post ID. 
    1513 
    1614== Installation == 
     
    21194. Update the "Short URL" in Options->General 
    2220 
    23 If you're running a multisite configuration, copy `sunrise.php` to the `wp-content` folder. If you're running the multisite domain mapping plugin and already have a file called `sunrise.php`, rename it to `dm_sunrise.php`. 
     21If you're running a multisite configuration, copy `sunrise.php` to the `wp-content` folder and set `define('SUNRISE', 'on');` in `wp-config.php`. 
    2422 
    2523== Frequently Asked Questions == 
     
    3432 
    3533== Changelog == 
     34 
     35= 1.1 = 
     36* Now works with multisite installs with subdirectories 
     37* Various optimizations 
     38* Removed explicit support for domain mapping plugin 
    3639 
    3740= 1.0 = 
  • jb-shortener/trunk/sunrise.php

    r482909 r587063  
    11<?php 
    2 if ( !defined( 'SUNRISE_LOADED' ) ) 
    3     define( 'SUNRISE_LOADED', 1 ); 
     2if ( ! defined( 'SUNRISE_LOADED' ) ) 
     3    define( 'SUNRISE_LOADED', true ); 
    44 
    55// let the site admin page catch the VHOST == 'no' 
    66$wpdb->jbtable = $wpdb->base_prefix . 'jb_shortlinks'; 
    7 $jb_domain = "http://".$wpdb->escape( $_SERVER[ 'HTTP_HOST' ] ); 
     7$jb_domain = "http://" . $wpdb->escape( $_SERVER[ 'HTTP_HOST' ] ); 
    88 
    99$where = $wpdb->prepare( 'domain = %s', $jb_domain ); 
     
    1212$jb_short_id = $wpdb->get_var( "SELECT blog_id FROM {$wpdb->jbtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1" ); 
    1313$wpdb->suppress_errors( false ); 
     14 
    1415if( $jb_short_id ) { 
    15     $current_blog = $wpdb->get_row("SELECT * FROM {$wpdb->blogs} WHERE blog_id = '$jb_short_id' LIMIT 1"); 
    16    
    17     $domain = $current_blog->domain; 
    18   $token = trim($_SERVER['REQUEST_URI'], '/'); 
    19    
    20   if (!empty($token)) { 
    21     $id = base_convert(strip_tags($token), 36, 10); 
    22     if($id) { 
    23       header($_SERVER['SERVER_PROTOCOL'].' 301 Moved Permanently'); 
    24       header("Location: http://$domain/?p=$id"); 
    25       exit(); 
    26     } 
    27   } else { 
    28     header($_SERVER['SERVER_PROTOCOL'].' 301 Moved Permanently'); 
    29     header("Location: http://$domain/"); 
    30     exit(); 
    31   } 
    32      
    33   header($_SERVER['SERVER_PROTOCOL'].' 302 Moved Temporarily'); 
    34   header("Location: http://$domain/"); 
    35   exit(); 
    36      
    37 } else { 
    38   if(file_exists(dirname(__FILE__).'/dm_sunrise.php')) 
    39       include('dm_sunrise.php'); 
     16    $site = $wpdb->get_row( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = '$jb_short_id' LIMIT 1" ); 
     17    $domain = $site->domain . $site->path; 
     18    $token = trim( $_SERVER['REQUEST_URI'], '/' ); 
     19 
     20    if ( ! empty( $token ) ) { 
     21        $id = intval( $token, 36 ); 
     22        header( $_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently' ); 
     23        header( "Location: http://$domain?p=$id" ); 
     24    } else { 
     25        header( $_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently' ); 
     26        header( "Location: http://$domain" ); 
     27    } 
     28 
     29    exit; 
    4030} 
    41 ?> 
Note: See TracChangeset for help on using the changeset viewer.