WordPress.org

Plugin Directory

Changeset 462778


Ignore:
Timestamp:
11/14/11 18:36:07 (3 years ago)
Author:
F J Kaiser
Message:

0.3 Final, stable, fully translated release using WP List Tables API

Location:
internal-link-checker/trunk
Files:
9 added
4 edited

Legend:

Unmodified
Added
Removed
  • internal-link-checker/trunk/internal-links.php

    r460386 r462778  
    44Plugin URI:     https://github.com/franz-josef-kaiser/Internal-Link-Check 
    55Description:    Adds a meta box to the post edit screen that shows all internal links from other posts to the currently displayed post. This way you can easily check if you should fix links before deleting a post. There are no options needed. The plugin works out of the box. 
    6 Author:         Franz Josef Kaiser 
    7 Author URI:     https://github.com/franz-josef-kaiser 
    8 Version:        0.2 
     6Author:         Franz Josef Kaiser, Patrick Matsumura 
     7Author URI:     https://plus.google.com/u/0/107110219316412982437 
     8Version:        0.3 
     9Text Domain:    ilc 
    910License:        GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 
    1011 
    11     (c) Copyright 2010 - 2011 by Franz Josef Kaiser 
     12    (c) Copyright 2010 - 2011 by Franz Josef Kaiser <mailto: office@unserkaiser.com> 
    1213 
    1314    This program is free software; you can redistribute it and/or modify 
     
    3738 
    3839// init class 
    39 if ( is_admin() ) 
    40     add_action( 'init', array( 'oxoLinkCheck', 'init' ) ); 
    41  
    42 if ( ! class_exists( 'oxoLinkCheck' ) ) 
     40add_action( 'init', array( 'ilcInit', 'init' ) ); 
     41 
     42if ( ! class_exists( 'ilcInit' ) ) 
    4343{ 
     44 
    4445/** 
     46 * Factory 
    4547 * @author Franz Josef Kaiser 
     48 *  
     49 * translation tutorial 
     50 * @link http://wordpress.stackexchange.com/questions/33312/how-to-translate-plural-forms-for-themes-plugins-with-poedit/33314#33314 
    4651 */ 
    47 class oxoLinkCheck 
     52class ilcInit 
    4853{ 
    49     // Counter var for linkin posts 
    50     public $counter; 
    51  
    52     // Container for sql result 
    53     public $sql_result; 
    54  
    55     // Constant for translation .po/.mo files 
    56     const TEXTDOMAIN = 'linkchecker_textdomain'; 
    57  
    58     /** 
    59      * Init - calls the class 
    60      * @return void 
    61      */ 
    62     static public function init() 
    63     { 
    64         $class = __CLASS__ ; 
    65  
    66         // Class available in global scope 
    67         if ( empty ( $GLOBALS[ $class ] ) ) 
     54    /** 
     55     * Plugin Base directory 
     56     * @var (string) 
     57     */ 
     58    public static $dir; 
     59 
     60    /** 
     61     * Relative Path from plugin root dir 
     62     * @var (string) 
     63     */ 
     64    public static $rel_path; 
     65 
     66    /** 
     67     * Used for update notices 
     68     * Fetches the readme file from the official plugin repo trunk. 
     69     * Adds to the "in_plugin_update_message-$file" hook 
     70     * @var (string) 
     71     */ 
     72    public $remote_readme = 'http://plugins.trac.wordpress.org/browser/internal-link-checker/trunk/readme.txt?format=txt'; 
     73 
     74    /** 
     75     * Settings 
     76     * @var (array) 
     77     */ 
     78    public $args = array( 
     79         'element'          => 'li' 
     80        ,'element_class'    => '' 
     81         // Att.: <ol> will be auto converted to <ul>  
     82        ,'container'        => '' 
     83        ,'container_class'  => '' 
     84        ,'nofollow'         => false 
     85        ,'echo'             => true 
     86    ); 
     87 
     88    /** 
     89     * Container for sql result 
     90     * @var (array) 
     91     */ 
     92    public $sql_results; 
     93 
     94 
     95    /** 
     96     * Init 
     97     * Instantiates the class and loads translation files 
     98     *  
     99     * @return void 
     100     */ 
     101    static public function init() 
     102    { 
     103        $class = __CLASS__ ; 
     104 
     105        // Class available in global scope 
     106        if ( empty ( $GLOBALS[ $class ] ) ) 
    68107            $GLOBALS[ $class ] = new $class; 
    69     } 
    70  
    71  
    72     /** 
    73      * Constructor 
    74      */ 
    75     public function __construct() 
    76     { 
    77         add_action( 'admin_init', array( &$this, 'lang' ) ); 
    78         add_action( 'add_meta_boxes', array( &$this, 'add_meta_box' ) ); 
    79     } 
    80  
    81     /** 
    82      * Loads the translation files 
    83      *  
    84      * @return void 
    85      */ 
    86     function lang() 
    87     { 
    88         $dir    = get_stylesheet_directory(); 
    89         $locale = get_locale(); 
    90         $file   = "{$dir}/lang/{$locale}.php"; 
    91  
    92         // Translation 
    93         load_theme_textdomain( 'LANG', "{$dir}/lang" ); 
    94  
    95         locate_template( $file, true ); 
    96     } 
    97  
    98  
     108 
     109        // l10n translation files 
     110        $dir        = basename( dirname( __FILE__ ) ); 
     111        // in plugins directory 
     112        $l10n_file  = load_plugin_textdomain( 'ilc', false, "{$dir}/lang" ); 
     113        // in mu-plugins directory 
     114        if ( ! $l10n_file ) 
     115            load_muplugin_textdomain( 'ilc', "{$dir}/lang" ); 
     116    } 
     117 
     118 
     119    /** 
     120     * Constructor 
     121     *  
     122     * @return void 
     123     */ 
     124    public function __construct() 
     125    { 
     126        # >>>> Class vars 
     127        $this->dir          = plugin_dir_path( __FILE__ ); 
     128        $this->rel_path     = basename( dirname( __FILE__ ) ); 
     129        # <<<< Class vars 
     130 
     131        if ( is_admin() ) 
     132        { 
     133            global $pagenow; 
     134            if ( 'plugins.php' === $pagenow ) 
     135            { 
     136                // Better update message 
     137                $file   = basename( __FILE__ ); 
     138                $folder = basename( dirname( __FILE__ ) ); 
     139                $hook = "in_plugin_update_message-{$folder}/{$file}"; 
     140                add_action( $hook, array( &$this, 'update_message' ), 20, 2 ); 
     141            } 
     142            // avoid loading on every admin $_REQUEST 
     143            // abort if not on post.php (post/page/cpt edit/new) screens 
     144            elseif ( 'post.php' === $pagenow ) 
     145            { 
     146                add_action( 'admin_init',       array( &$this, 'load_extensions' ) ); 
     147                add_action( 'add_meta_boxes',   array( &$this, 'add_meta_box' ) ); 
     148            } 
     149        } 
     150    } 
     151 
     152 
     153    /** 
     154     * Extension/File/Class loader 
     155     *  
     156     * @return void 
     157     */ 
     158    public function load_extensions() 
     159    { 
     160        foreach ( array( 'admin_table' ) as $extension ) 
     161        { 
     162            $file = "{$this->dir}/{$extension}.php"; 
     163            if ( is_readable( $file ) ) 
     164                include_once $file; 
     165        } 
     166    } 
     167 
     168 
     169    /** 
     170     * Plugin Header Comment data 
     171     * 
     172     * @uses   get_plugin_data 
     173     * @param (string) $value | default = 'Version'; Valid: see Header Comment Block 
     174     * @return (string)  
     175     */ 
     176    private function get_plugin_data( $value = 'Version' )  
     177    { 
     178        $plugin_data = get_plugin_data( __FILE__ ); 
     179        return $plugin_data[ $value ]; 
     180    } 
     181 
     182 
     183    /** 
     184     * Wrapper for get_plugin_data() 
     185     *  
     186     * @return (string) $textdomain 
     187     */ 
     188    public function get_textdomain()  
     189    { 
     190        return $this->get_plugin_data( 'TextDomain' ); 
     191    } 
     192 
     193     
    99194    /** 
    100195     * Adds the meta box to the post edit screen 
    101       
    102      * @return void 
    103      */ 
    104     function add_meta_box() 
    105     { 
    106         // do math first 
    107         $this->get_sql_result(); 
    108  
     196     * 
     197     * @return void 
     198     */ 
     199    public function add_meta_box() 
     200    { 
    109201        // add meta box 
    110202        add_meta_box(  
    111             '', 
    112             sprintf( __( 'Posts linking to this posts internally: %d', self::TEXTDOMAIN ), $this->counter ), 
    113             array( &$this, 'meta_box_cb' ), 
    114             'post'  
    115         ); 
     203             'link-check' 
     204            ,__( 'Internal Links', $this->get_textdomain() ) 
     205            ,array( &$this, 'load_table' ) 
     206            ,'post'  
     207        ); 
     208    } 
     209 
     210 
     211    /** 
     212     * Adds a native admin UI table 
     213     * Callback fn for add_meta_box() 
     214     *  
     215     * @return void 
     216     */ 
     217    public function load_table() 
     218    { 
     219        // Action: Overrides the content of the meta box 
     220        if ( has_action( 'internal_links_meta_box' ) ) 
     221        { 
     222            do_action( 'internal_links_meta_box', $this->the_sql_results() ); 
     223            return; 
     224        } 
     225 
     226        // Display table 
     227        $table = new ilcTable(); 
     228        $table->prepare_items(); 
     229        $table->display(); 
     230 
     231        # @todo temp until table nav in place 
     232        echo '<br class="clear" />'; 
     233 
     234        // Display number of posts 
     235        # $count = count( $GLOBALS['wpdb']->last_result ); 
     236        $count = count( $this->the_sql_results() ); 
     237        printf(  
     238             _n( 
     239                 'One post linking to this post.' 
     240                ,'Posts linking to this post: %s' 
     241                ,$count 
     242                ,$this->get_textdomain()  
     243             ) 
     244            ,zeroise( number_format_i18n( $count ), 2 ) 
     245        ); 
    116246    } 
    117247 
     
    120250     * SQL Query 
    121251     * Adds content to two class vars: The resulting array & the counter 
     252     *  
    122253     * @return (object) $links  
    123254     */ 
    124     public function get_sql_result() 
     255    public function get_sql_results() 
    125256    { 
    126257        // get_permalink() cares about rewrite rules 
    127258        $current_link = get_permalink( $GLOBALS['post']->ID ); 
    128         // sql 
    129         $links = $GLOBALS['wpdb']->get_results( " 
    130             SELECT ID, post_title, post_date, post_content  
     259        // SQL: newest first 
     260        return $GLOBALS['wpdb']->get_results( " 
     261            SELECT ID, post_title, post_date, post_content, post_type  
    131262            FROM {$GLOBALS['wpdb']->prefix}posts  
    132263            WHERE post_content  
    133264            LIKE '%{$current_link}%'  
    134             ORDER BY post_date 
     265            ORDER BY post_date DESC 
    135266        " ); 
    136  
    137         // Counter for meta box title 
    138         $this->counter = count( $links ); 
    139  
    140         return $this->sql_result = $links; 
    141     } 
    142  
    143  
    144     /** 
    145      * Meta Box callback function 
    146      *  
    147      * @return (string) $output 
    148      */ 
    149     function meta_box_cb() 
    150     { 
    151         $links = $this->sql_result; 
    152  
    153         $result = array(); 
    154         if ( $links ) 
    155         { 
    156             foreach( $links as $linkin_post ) 
    157             { 
    158                 # @todo Make links unique 
    159                 $link = get_permalink( $linkin_post->ID ); 
    160                 $result[] = "<a href='$link'>{$linkin_post->post_title}</a>"; 
    161             } 
    162         } 
    163         else  
    164         { 
    165             return _e( 'No posts are linking to this post.', self::TEXTDOMAIN ); 
    166         } 
     267    } 
     268 
     269 
     270    /** 
     271     * Wrapper to return the sql results for the admin table class 
     272     *  
     273     * @see WP_List_Table::prepare_items() 
     274     * @return (array) $sql_results 
     275     */ 
     276    public function the_sql_results() 
     277    { 
     278        return isset( $this->sql_results ) ? $this->sql_results : self::get_sql_results(); 
     279    } 
     280 
     281 
     282    /** 
     283     * Builds the output 
     284     * Also used as meta box callback function 
     285     *  
     286     * @uses markup() 
     287     * @return (string) $output 
     288     */ 
     289    function output() 
     290    { 
     291        if ( ! $this->sql_results ) 
     292            return _e( 'No posts are linking to this post.', $this->get_textdomain() ); 
     293 
     294        # >>>> build links array sorted by post type 
     295        $results = array(); 
     296        foreach( $this->sql_results as $post ) 
     297        { 
     298            $link       = get_permalink( $post->ID ); 
     299 
     300            // If no title was set: we care about it 
     301            $no_title   = __( 'No title set', $this->get_textdomain() ); 
     302            $title      = $post->post_title ? $post->post_title : "<em>{$no_title}</em>"; 
     303 
     304            $results[ $post->post_type ][ $post->ID ] = "<a href='{$link}'>{$title}</a>"; 
     305        } 
     306        # <<<< build links array 
    167307 
    168308        // Filter the result or add anything 
    169         $result = apply_filters( 'internal_links_meta_box', $result, $links ); 
    170          
    171         if ( $result ) 
    172         { 
    173             $output = '<ul>'; 
    174                 foreach ( $result as $link ) 
    175                 { 
    176                     $output .= "<li>{$link}</li>"; 
    177                 } 
    178             $output .= '</ul>'; 
    179         } 
     309        $results = apply_filters( 'internal_links', $results, $this->sql_results ); 
     310 
     311        # >>>> markup 
     312        foreach ( $results as $name => $posts ) 
     313        { 
     314            $name    = _n( ucfirst( $name ), ucfirst( $name ).'s', count( $posts ), $this->get_textdomain() ); 
     315            $output .= $this->markup( $posts ); 
     316        } 
     317        # <<<< markup 
     318 
     319        # >>>> return 
     320        if ( $this->args['echo'] ) 
     321            return print $output; 
     322 
     323        return $output; 
     324    } 
     325 
     326 
     327    /** 
     328     * Builds the markup 
     329     *  
     330     * @uses markup_filter() 
     331     * @param (array) $results | SQL Query results ordered 
     332     * @return (string) $output | Html markup 
     333     */ 
     334    public function markup( $results ) 
     335    { 
     336        $output = ''; 
     337        foreach ( $results as $link ) 
     338        { 
     339            $output .= "<%el%%el_class%>{$link}</%el%>"; 
     340        } 
     341 
     342        // In case someone forgot to set a container if the choosen element is 'li' 
     343        if ( $this->args['container'] OR 'li' === $this->args['element'] ) 
     344        { 
     345            $output  = "<%container%%container_class%>{$output}</%container%>"; 
     346        } 
     347 
     348        $output = $this->markup_filter( $output ); 
     349 
     350        return $output; 
     351    } 
     352 
     353 
     354    /** 
     355     * Replaces markup placeholders 
     356     * Deletes placeholders if the settings array contains an empty string 
     357     *  
     358     * @param (string) $input 
     359     * @return (string) $markup 
     360     */ 
     361    public function markup_filter( $input ) 
     362    { 
     363        $markup = strtr(  
     364             $input 
     365            ,array( 
     366                 '%el%'                 => $this->args['element'] 
     367                 // auto correct wrong container types for <li> elements to <ul> 
     368                ,'%container%'          => 'li' === $this->args['element']  ? 'ul' : $this->args['container'] 
     369                ,'%el_class%'           => $this->args['element_class']     ? " class='{$this->args['element_class']}'" : '' 
     370                ,'%container_class%'    => $this->args['container_class']   ? " class='{$this->args['container_class']}'" : '' 
     371                ,'%nofollow%'           => $this->args['nofollow']          ? ' rel="nofollow"' : '' 
     372            )  
     373        ); 
     374 
     375        return $markup; 
     376    } 
     377 
     378 
     379    /* =============== Helper & other ================= */ 
     380 
     381 
     382    /** 
     383     * Displays an update message for plugin list screens. 
     384     * Shows only the version updates from the current until the newest version 
     385     *  
     386     * @param (array) $plugin_data 
     387     * @param (object) $r 
     388     * @return (string) $output 
     389     */ 
     390    public function update_message( $plugin_data, $r ) 
     391    { 
     392        if ( ! is_readable( $this->remote_readme ) ) 
     393            return; 
     394 
     395        // readme contents 
     396        $data       = file_get_contents( $this->remote_readme ); 
     397        $changelog  = stristr( $data, '== Changelog ==' ); 
     398        $changelog  = stristr( $changelog, '== Screenshots ==', true ); 
     399        // only return for the current & later versions 
     400        $curr_ver   = $this->get_plugin_data(); 
     401        $changelog  = stristr( $changelog, "= v{$curr_ver}" ); 
     402 
     403        # >>>> output 
     404        $output  = '<hr /><div style="font-weight: normal;">'; 
     405        $output .= sprintf( __(  
     406                 'The Update from %1$s to %2$s brings you the following new features, bug fixes and additions.' 
     407                ,$this->get_textdomain() ) 
     408            ,$curr_ver 
     409            ,$r->new_version  
     410        ); 
     411        $output .= "<pre>{$changelog}</pre>"; 
     412        $output .= sprintf( __(  
     413                 'You can also check the nightly builds of %1$sour development repository%2$s on GitHub. If you got ideas, feature request or want to help with pull requests, please feel free to do so on GitHub.%3$s' 
     414                ,$this->get_textdomain() ) 
     415            ,'<a href="https://github.com/franz-josef-kaiser/Internal-Link-Check">' 
     416            ,'</a>' 
     417            ,'</div>' 
     418        ); 
     419        # <<<< output 
    180420 
    181421        return print $output; 
    182422    } 
    183 } // END Class oxoLinkCheck 
     423} // END Class ilcInit 
    184424 
    185425} // endif; 
  • internal-link-checker/trunk/readme.textile

    r460386 r462778  
    11h2. Internal Link Checker 
    22 
    3 version: _v0.2_ 
     3version: _v0.3_ 
    44 
    5 **Updates** available via the wp.org plugin repository. 
     5**Updates** available via the official "wp.org plugin repository":http://wordpress.org/extend/plugins/internal-link-checker/. 
    66 
    77Adds a meta box to the post edit screen that shows all internal links from other posts to the currently displayed post. This way you can easily check if you should fix links before deleting a post. There are no options needed. The plugin works out of the box - **just activate**! 
     
    1515h3. How-to 
    1616 
    17 This shows how to modify the output inside the internal link checker meta box: 
     17This shows how to modify the output inside the internal link checker meta box via the action: 
    1818 
    1919<pre> 
    20 function modify_checklink_metabox_content( $result, $links ) 
    21 { 
    22     global $post; 
    23     // Uncomment the follwing line to see what the $links array contains 
    24     // The links array contains all posts (and their respective data) that link to the current post 
    25     /* 
    26     echo '<'.'pre>'; 
    27         print_r( $links ); 
    28     echo '<'.'/pre>'; 
    29      */ 
     20function modify_internallink_metabox_content( $sql_result ) { 
     21    // Uncomment the follwing line to see what the $sql_result array contains 
     22    // The links array contains all posts (and their respective data)  
     23    // that link to the current post 
     24    echo '<'.'pre>'.var_dump( $sql_result ).'<'.'/pre>'; 
    3025 
    3126    // Now handle the result: 
    32     foreach ( $result as $link ) 
     27    foreach ( $sql_result as $link ) 
    3328    { 
    3429        // do stuff 
    3530    } 
    3631 
    37     return $result; 
     32    return print $sql_result; 
    3833} 
    39 add_filter( 'internal_links_meta_box', 'modify_checklink_metabox_content', 10, 2 ); 
     34// Add the action to the admin_init hook 
     35function add_internallink_action() { 
     36    add_action( 'internal_links_meta_box', 'modify_internallink_metabox_content', 10 );  
     37} 
     38add_action( 'admin_init', 'add_internallink_action' ); 
    4039</pre> 
    4140 
     
    4746h3. Languages 
    4847 
    49 Translation ready - So far the translation files don't exist. If you want to help, please contact me. 
     48Translation ready. 
     49 
     50Languages included: 
     51EN/DE (Patrick Matsumura) 
     52 
     53h4. Authors 
     54 
     55"Franz Josef Kaiser":https://github.com/franz-josef-kaiser | "G+":https://plus.google.com/u/0/107110219316412982437 
     56"Patrick Matsumura":https://github.com/patrickmatsumura | "G+":https://plus.google.com/u/0/110601372184256601089 
    5057 
    5158---------------------------------------------------------------- 
     
    5360h4. Changelog 
    5461 
    55 * _v0.1._ First version 
    56 * _v0.1.1._ Should now work with post titles & post slugs/names 
    57 * _v0.1.2._ Meta box content now displays inside an unordered list 
    58 * _v0.1.2._ Added screenshot, readme.txt for wp.org repo & fixed not echoing that there are no links 
    59 * _v0.1.3._ Minor fixes 
    60 * _v0.2._ Moved to a class, added translation files loading fn. 
     62* _v0.1_ First version 
     63* _v0.1.1_ Should now work with post titles & post slugs/names 
     64* _v0.1.2_ Meta box content now displays inside an unordered list 
     65* _v0.1.2_ Added screenshot, readme.txt for wp.org repo & fixed not echoing that there are no links 
     66* _v0.1.3_ Minor fixes 
     67* _v0.2_ Moved to a class, added translation files loading fn. 
     68* _v0.2.1_ Minor fixes, added translation - props patrickmatsumura (see authors file) 
     69* _v0.2.2_ Added authors file, added check for unique links 
     70* _v0.2.4_ Added markup & markup filter functions and a initial settings array for further extension 
     71* _v0.2.5_ Added auto-correction for li elements & container 
     72* _v0.2.6_ Added singular/plural translation strings. Grouped results by post type column. 
     73* _v0.2.6.1_ Reworked translation files. 
     74* _v0.2.6.2_ Avoids loading on every $_REQUEST. Now only loads on post.php in admin (post/page/cpt new/edit) screens 
     75* _v0.2.6.3_ Added mu-plugins directory for l10n lang files loading. 
     76* _v0.2.6.4_ Changed meta box title to "Internal Links" to not have long titles in screen options tab. 
     77* _v0.2.6.5_ Added wrapper function to call plugin data 
     78* _v0.2.6.6_ Moved Text Domain to plugin header comment for easier maintainance and transparency  
     79* _v0.2.7_ Added native WP admin UI table to the meta box  
     80* _v0.2.7.1_ Moved to admin edit post permalinks  
     81* _v0.2.8_ Added better update messages for plugin list screen 
     82* _v0.2.9_ Moved from a filter for the meta box to an action to override the output of the meta box content 
     83* _v0.3_ Language & Typo fixes. Final, stable 0.3 release. 
  • internal-link-checker/trunk/readme.txt

    r460386 r462778  
    22Plugin Name:        Internal Link Checker 
    33Plugin URI:         https://github.com/franz-josef-kaiser/Internal-Link-Check 
    4 Author:             Franz Josef Kaiser 
    5 Author URI:         https://github.com/franz-josef-kaiser 
     4Author:             Franz Josef Kaiser, Patrick Matsumura 
     5Author URI:         https://plus.google.com/u/0/107110219316412982437 
    66Tags:               admin, link, links, meta, box, meta_box, missing, 404  
    77Requires at least:  0.x 
    88Tested up to:       3.3 
    9 Stable tag:         0.2 
     9Stable tag:         0.3 
    1010 
    1111== Description == 
     
    1717== Installation == 
    1818 
    19 No explanation needed - works out of the box. Just activate and be save. 
     19No explanation needed - works out of the box. Just activate and be safe. 
    2020 
    2121== Frequently Asked Questions == 
     
    5151= Languages = 
    5252 
    53 Translation ready - If you want to help translating, please contact me. 
     53Translation ready. 
     54If you want to help translating, please contact me on G+. 
     55 
     56Included: 
     57EN/DE (Patrick Matsumura) 
    5458 
    5559== Changelog == 
    5660 
    57 = v0.1. = 
     61= v0.1 = 
    5862First version 
    5963 
    60 = v0.1.1. = 
    61 Should now work with post titles & post slugs/names. 
     64= v0.1.1 = 
     65Should now work with post titles & post slugs/names 
    6266 
    63 = v0.1.2. = 
    64 Meta box content now displays inside an unordered list. 
     67= v0.1.2 = 
     68Meta box content now displays inside an unordered list 
    6569 
    66 = v0.1.3. = 
    67 Added screenshot, readme.txt for wp.org repo & fixed not echoing if there are no links. 
     70= v0.1.3 = 
     71Added screenshot, readme.txt for wp.org repo & fixed not echoing if there are no links 
    6872 
    69 = v0.2. = 
    70 Moved to class to clean up global namespace. 
    71 Added next step for translations. 
     73= v0.2 = 
     74Moved to class to clean up global namespace 
     75Added next step for translations 
     76 
     77= v0.2.1 = 
     78Minor fixes 
     79Added translation 
     80props Patrick Matsumura 
     81 
     82= v0.2.2 = 
     83Added authors file 
     84Made links unique and minor fixes 
     85 
     86= v0.2.4 = 
     87Added MarkUp & MarkUp filter functions that work based on an initial settings array 
     88Can now be easier extended or used on front 
     89 
     90= v0.2.5 = 
     91Added auto-correction for li elements & container 
     92 
     93= v0.2.6 = 
     94Added singular/plural translation strings 
     95Grouped results by post type column 
     96 
     97= v0.2.6.1 = 
     98Reworked translation files 
     99 
     100= v0.2.6.2 = 
     101Avoids loading on every $_REQUEST. Now only loads on post.php in admin (post/page/cpt new/edit) screens 
     102 
     103= v0.2.6.3 = 
     104Added mu-plugins directory for l10n lang files loading 
     105 
     106= v0.2.6.4 = 
     107Changed meta box title to "Internal Links" to not have long titles in screen options tab 
     108 
     109= v0.2.6.5 = 
     110Added wrapper function to call plugin data 
     111 
     112= v0.2.6.6 = 
     113Moved Text Domain to plugin header comment for easier maintainance and transparency 
     114 
     115= v0.2.7 = 
     116Added native WP admin UI table to the meta box 
     117 
     118= v0.2.7.1 = 
     119Moved to admin edit post permalinks 
     120 
     121= v0.2.8 = 
     122Added better update messages for plugin list screen 
     123 
     124= v0.2.9 = 
     125Check for remote readme file availibility before get file contents on update 
     126The meta box content filter disappeared and was replaced by an action to override the content 
     127 
     128= v0.3 = 
     129Final stable release with new WP Admin Tables class API in use. Typo & Language fixes, fully translated. 
    72130 
    73131== Screenshots == 
Note: See TracChangeset for help on using the changeset viewer.