Plugin Directory

Changeset 1357009


Ignore:
Timestamp:
02/24/2016 03:48:10 AM (10 years ago)
Author:
nuagelab
Message:

Version 2.0.0:

  • Tested up to WordPress 4.4.2
  • Added backup functionnality
  • Removed usage of mysql_* functions in favor of $wpdb
Location:
automatic-domain-changer/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • automatic-domain-changer/trunk/auto-domain-change.php

    r1155463 r1357009  
    55Description: Automatically changes the domain of a WordPress blog
    66Author: NuageLab <wordpress-plugins@nuagelab.com>
    7 Version: 1.0.1
     7Version: 2.0.0
    88License: GPLv2 or later
    99Author URI: http://www.nuagelab.com/wordpress-plugins
     
    1818 */
    1919class auto_domain_change{
     20
    2021    private static $_instance = null;
    2122
     
    6667                require_once(ABSPATH .'wp-includes/pluggable.php');
    6768               
    68                 if (wp_verify_nonce($_POST['nonce'],$_POST['action'])) {
     69                if (wp_verify_nonce(@$_POST['nonce'],@$_POST['action'])) {
    6970                    $parts = explode('+',$_POST['action']);
    7071                    switch ($parts[0]) {
    7172                        case 'backup-database':
    72                             return $this->do_backup();
     73                            if (current_user_can('export')) {
     74                                switch ($_POST['type']) {
     75                                    case 'sql':
     76                                    default:
     77                                        return $this->do_backup_sql();
     78                                    case 'php':
     79                                        return $this->do_backup_php();
     80                                }
     81                            }
    7382                        default:
    7483                            // ignore
     
    203212
    204213        echo '<tr valign="top">';
    205         echo '<td colspan="2"><input type="checkbox" name="accept-terms" id="accept-terms" value="1" /> <label for="accept-terms"'.($error_terms?' style="color:red;font-weight:bold;"':'').'>'.__('I have backed up my database and will assume the responsability of any data loss or corruption.','auto-domain-change').'</label></td>';
     214        echo '<td colspan="2"><input type="checkbox" name="accept-terms" id="accept-terms" value="1" /> <label for="accept-terms"'.($error_terms?' style="color:red;font-weight:bold;"':'').'>'.__('I have backed up my database, checked the backups integrity, know how to restore it, and will assume the responsability of any data loss or corruption.','auto-domain-change').'</label>';
     215        echo '<br>';
     216        echo '<br>';
     217        echo '<p class="backup">';
     218        echo '<button class="adc-backup-button" data-type="sql">'.__('Backup database as SQL','auto-domain-change').'</button>';
     219        //echo '&nbsp;';
     220        //echo '<button class="adc-backup-button" data-type="php">'.__('Backup database as PHP','auto-domain-change').'</button>';
     221        echo '</p>';
     222        echo '</td>';
    206223        //echo '<td colspan="2"><input type="checkbox" name="accept-terms" id="accept-terms" value="1" /> <label for="accept-terms"'.($error_terms?' style="color:red;font-weight:bold;"':'').'>'.__('I have <a id="adc-backup-button" href="">backed up my database</a> and will assume the responsability of any data loss or corruption.','auto-domain-change').'</label></td>';
    207224        echo '</tr>';
     
    217234        wp_nonce_field($action,'nonce');
    218235        echo '<input type="hidden" name="action" value="'.$action.'" />';
     236        echo '<input type="hidden" name="type" value="sql" />';
    219237        echo '</form>';
    220238        echo <<<EOD
    221239<script>
    222240(function($){
    223     $('#adc-backup-button').click(function(ev){
     241    $('.adc-backup-button').click(function(ev){
    224242        ev.preventDefault();
     243        $('#adc-backup-db input[name=type]').val( $(this).attr('data-type') );
    225244        $('#adc-backup-db').submit();
    226245    });
     
    254273        echo '<hr>';
    255274
    256         mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
    257         mysql_select_db(DB_NAME);
    258         mysql_query('SET NAMES '.DB_CHARSET);
    259         if (function_exists('mysql_set_charset')) mysql_set_charset(DB_CHARSET);
    260 
    261         $ret = mysql_query('SHOW TABLES;');
     275        $ret = $wpdb->get_results('SHOW TABLES;');
    262276        $tables = array();
    263         while ($row = mysql_fetch_assoc($ret)) {
    264             $row = array_values($row);
     277        foreach ($ret as $row) {
     278            $row = get_object_vars($row);
    265279            $tables [] = reset($row);
    266280        }
     
    271285
    272286            // Get table indices
    273             $ret = mysql_query('SHOW INDEX FROM '.$t);
     287            $ret = $wpdb->get_results('SHOW INDEX FROM '.$t);
     288
    274289            $id = null;
    275             while ($row = mysql_fetch_assoc($ret)) {
     290            foreach ($ret as $row) {
     291                $row = get_object_vars($row);
    276292                if ($row['Key_name'] == 'PRIMARY') {
    277293                    $id = $row['Column_name'];
     
    291307
    292308            // Process all rows
    293             $ret = mysql_query('SELECT * FROM '.$t);
    294             while ($row = mysql_fetch_assoc($ret)) {
    295                 $fields = array();
    296                 $sets = array();
    297                
    298                 // Process all columns
    299                 foreach ($row as $k=>$v) {
    300                     // Save original value
    301                     $ov = $v;
    302                    
    303                     // Process value
    304                     $v = $this->processValue($v, $old, $new);
    305 
    306                     // If value changed, replace it
    307                     if ($ov != $v) {
    308                         $sets[] = '`'.$k.'`="'.mysql_real_escape_string($v).'"';
     309            $o = 0;
     310            do {
     311                $sql = 'SELECT * FROM ' . $t. ' LIMIT '.$o.',50;';
     312                $ret = $wpdb->get_results( $sql );
     313                foreach ($ret as $row) {
     314                    $row = get_object_vars($row);
     315
     316                    $fields = array();
     317                    $sets   = array();
     318
     319                    // Process all columns
     320                    foreach ( $row as $k => $v ) {
     321                        // Save original value
     322                        $ov = $v;
     323
     324                        // Process value
     325                        $v = $this->processValue( $v, $old, $new );
     326
     327                        // If value changed, replace it
     328                        if ( $ov != $v ) {
     329                            $sets[] = '`' . $k . '`="' . esc_sql( $v ) . '"';
     330                        }
    309331                    }
    310                 }
    311 
    312                 // Update table if we have something to set
    313                 if (count($sets) > 0) {
    314                     $sql = 'UPDATE '.$t.' SET '.implode(',',$sets).' WHERE `'.$id.'`='.$row[$id].' LIMIT 1;';
    315                     mysql_query($sql);
    316                 }
    317             }
     332
     333                    // Update table if we have something to set
     334                    if ( count( $sets ) > 0 ) {
     335                        $sql = 'UPDATE ' . $t . ' SET ' . implode( ',', $sets ) . ' WHERE `' . $id . '`=' . $row[ $id ] . ' LIMIT 1;';
     336                        $wpdb->get_results($sql);
     337                    }
     338                }
     339
     340                $o += count($ret);
     341            } while (count($ret) > 0);
    318342        }
    319343
     
    362386   
    363387    /**
    364      * Change domain. This is where the magic happens.
    365      * Called by admin_page() upon form submission.
     388     * Backup database as SQL
    366389     *
    367390     * @author  Tommy Lacroix <tlacroix@nuagelab.com>
    368391     * @access  private
    369392     */
    370     private function do_backup()
     393    private function do_backup_sql()
    371394    {
    372395        global $wpdb;
     
    379402        header('Content-Disposition: attachment; filename="'.$fn.'"');
    380403
    381         mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
    382         mysql_select_db(DB_NAME);
    383         mysql_query('SET NAMES '.DB_CHARSET);
    384         if (function_exists('mysql_set_charset')) mysql_set_charset(DB_CHARSET);
    385 
    386         $ret = mysql_query('SHOW TABLES;');
     404        $ret = $wpdb->get_results('SHOW TABLES;');
    387405        $tables = array();
    388         while ($row = mysql_fetch_assoc($ret)) {
     406        foreach ($ret as $row) {
     407            $row = get_object_vars($row);
    389408            $row = array_values($row);
    390409            $tables [] = reset($row);
     
    396415
    397416            // Get table indices
    398             $ret = mysql_query('SHOW CREATE TABLE '.$t);
     417            $ret = $wpdb->get_results('SHOW CREATE TABLE '.$t);
    399418            $id = null;
    400             while ($row = mysql_fetch_assoc($ret)) {
    401                 $ct = $row['Create Table'];
     419            foreach ($ret as $row) {
     420                $ct = $row->{'Create Table'};
    402421                echo $ct.';'.PHP_EOL;
    403422            }
    404423
    405424            // Process all rows
    406             $ret = mysql_query('SELECT * FROM '.$t);
    407             while ($row = mysql_fetch_assoc($ret)) {
    408                 $ak = array();
    409                 $av = array();
    410                 foreach ($row as $k=>$v) {
    411                     $ak[] = '`'.mysql_real_escape_string($k).'`';
    412                     if ($v === null) $av[] = 'NULL';
    413                         else $av[] = '"'.mysql_real_escape_string($v).'"';
    414                 }
    415                 printf('INSERT INTO `%1$s` (%2$s) VALUES (%3$s);'.PHP_EOL, $t, implode(',',$ak), implode(',', $av));
    416             }
     425            $o = 0;
     426            do {
     427                $ret = $wpdb->get_results( 'SELECT * FROM ' . $t . ' LIMIT '.$o.',50;' );
     428                foreach ($ret as $row) {
     429                    $row = get_object_vars($row);
     430
     431                    $ak = array();
     432                    $av = array();
     433                    foreach ( $row as $k => $v ) {
     434                        $ak[] = '`' . esc_sql( $k ) . '`';
     435                        if ( $v === null ) {
     436                            $av[] = 'NULL';
     437                        } else {
     438                            $av[] = '"' . esc_sql( $v ) . '"';
     439                        }
     440                    }
     441                    printf( 'INSERT INTO `%1$s` (%2$s) VALUES (%3$s);' . PHP_EOL, $t, implode( ',', $ak ), implode( ',', $av ) );
     442                }
     443                $o += count($ret);
     444            } while (count($ret) > 0);
    417445            echo PHP_EOL;
    418446            echo PHP_EOL;
     
    420448       
    421449        die;
    422     } // do_backup()
     450    } // do_backup_sql()
     451
     452
     453    /**
     454     * Backup database as PHP
     455     *
     456     * @author  Tommy Lacroix <tlacroix@nuagelab.com>
     457     * @access  private
     458     */
     459    private function do_backup_php()
     460    {
     461        global $wpdb;
     462
     463        @set_time_limit(0);
     464
     465        $fn = preg_replace('/[^a-zA-Z0-9_\-]/', '_', preg_replace(',http(|s)://,i','',get_bloginfo('url'))).'-'.date('Ymd-His').'.php';
     466
     467        header('Content-Type: text/plain; charset="UTF-8"');
     468        header('Content-Disposition: attachment; filename="'.$fn.'"');
     469
     470        echo '<?php'.PHP_EOL;
     471        echo '// Put this file at the root of your WordPress installation and execute it.'.PHP_EOL.PHP_EOL;
     472        echo 'require "wp-config.php";' . PHP_EOL;
     473        echo 'global $wpdb;' . PHP_EOL;
     474
     475        $ret = $wpdb->get_results('SHOW TABLES;');
     476        $tables = array();
     477        foreach ($ret as $row) {
     478            $row = get_object_vars($row);
     479            $row = array_values($row);
     480            $tables [] = reset($row);
     481        }
     482
     483        $ifdrop = 'if (isset($_GET["drop"])) $wpdb->get_var("DROP TABLE IF EXISTS `%T%`;"); if ($wpdb->last_error) die("Query failed");'.PHP_EOL;
     484
     485        foreach ($tables as $t) {
     486            // Skip if the table name doesn't match the wordpress prefix
     487            if (substr($t,0,strlen($wpdb->prefix)) != $wpdb->prefix) continue;
     488
     489            // Get table indices
     490            $ret = $wpdb->get_results('SHOW CREATE TABLE '.$t);
     491            $id = null;
     492            foreach ($ret as $row) {
     493                $ct = $row->{'Create Table'};
     494                echo str_replace('%T%', $t, $ifdrop);
     495                printf('$wpdb->get_results('.var_export($ct, true).'); if ($wpdb->last_error) die("Query failed");');
     496                echo PHP_EOL;
     497            }
     498
     499            // Process all rows
     500            $o = 0;
     501            do {
     502                $ret = $wpdb->get_results( 'SELECT * FROM ' . $t . ' LIMIT ' . $o . ',50;' );
     503                foreach ( $ret as $row ) {
     504                    $row = get_object_vars( $row );
     505                    $ak  = array();
     506                    $av  = array();
     507                    foreach ( $row as $k => $v ) {
     508                        $ak[] = '`' . esc_sql( $k ) . '`';
     509                        if ( $v === null ) {
     510                            $av[] = 'NULL';
     511                        } else {
     512                            $av[] = '"' . esc_sql( $v ) . '"';
     513                        }
     514                    }
     515                    $query = sprintf( 'INSERT INTO `%1$s` (%2$s) VALUES (%3$s);', $t, implode( ',', $ak ), implode( ',', $av ) );
     516                    echo '$wpdb->get_results(' . var_export($query,true). '); if ($wpdb->last_error) die("Query failed");';
     517                    echo PHP_EOL;
     518                }
     519                $o += count($ret);
     520            } while (count($ret) > 0);
     521            echo PHP_EOL;
     522            echo PHP_EOL;
     523        }
     524
     525        die;
     526    } // do_backup_php()
    423527
    424528
  • automatic-domain-changer/trunk/languages/auto-domain-change-es_ES.po

    r1131397 r1357009  
    88"Project-Id-Version: Auto Domain Changer\n"
    99"Report-Msgid-Bugs-To: \n"
    10 "POT-Creation-Date: 2014-09-17 10:31-0500\n"
    11 "PO-Revision-Date: 2014-09-17 10:31-0500\n"
     10"POT-Creation-Date: 2015-12-18 12:55-0500\n"
     11"PO-Revision-Date: 2015-12-18 12:57-0500\n"
    1212"Last-Translator: Tommy Lacroix <tlacroix@nuagelab.com>\n"
    1313"Language-Team: NuageLab <wordpress-plugins@nuagelab.com>\n"
     
    1919"X-Poedit-SourceCharset: UTF-8\n"
    2020"X-Poedit-Bookmarks: -1,430,-1,-1,-1,-1,-1,-1,-1,-1\n"
    21 "X-Generator: Poedit 1.5.4\n"
     21"X-Generator: Poedit 1.7.4\n"
    2222"X-Poedit-Basepath: ./\n"
    2323"X-Poedit-KeywordsList: __;_e;_n\n"
    2424"X-Poedit-SearchPath-0: ..\n"
    2525
    26 #: ../auto-domain-change.php:118
     26#: ../auto-domain-change.php:124
    2727#, php-format
    2828msgid ""
     
    3535"\">ignorar</a>."
    3636
    37 #: ../auto-domain-change.php:134 ../auto-domain-change.php:174
     37#: ../auto-domain-change.php:140 ../auto-domain-change.php:180
    3838msgid "Change Domain"
    3939msgstr "Cambiar el dominio"
    4040
    41 #: ../auto-domain-change.php:185
     41#: ../auto-domain-change.php:191
    4242msgid "Change domain from: "
    4343msgstr "Cambiar el dominio de:"
    4444
    45 #: ../auto-domain-change.php:190
     45#: ../auto-domain-change.php:196
    4646msgid "Change domain to: "
    4747msgstr "Cambiar el dominio al:"
    4848
    49 #: ../auto-domain-change.php:196
     49#: ../auto-domain-change.php:202
    5050msgid "Also change secure <code>https</code> links"
    5151msgstr "También cambiar los enlaces seguros <code>https</code>"
    5252
    53 #: ../auto-domain-change.php:201
     53#: ../auto-domain-change.php:207
    5454msgid ""
    5555"Change both <code>www.old-domain.com</code> and <code>old-domain.com</code> "
     
    5959"domain.com</code>"
    6060
    61 #: ../auto-domain-change.php:205
     61#: ../auto-domain-change.php:211
    6262msgid ""
    63 "I have backed up my database and will assume the responsability of any data "
    64 "loss or corruption."
     63"I have backed up my database, checked the backups integrity, know how to "
     64"restore it, and will assume the responsability of any data loss or "
     65"corruption."
    6566msgstr ""
    66 "He hecho una copia de seguridad de mi base de datos y no asumen ninguna "
    67 "responsabilidad por cualquier pérdida o corrupción de datos."
     67"He hecho una copia de seguridad de mi base de datos, he verificado su "
     68"integridad, y asumo todo responsabilidad por cualquier pérdida o corrupción "
     69"de datos."
    6870
    69 #: ../auto-domain-change.php:211
     71#: ../auto-domain-change.php:215
     72msgid "Backup database as SQL"
     73msgstr "Copia de seguridad como SQL"
     74
     75#: ../auto-domain-change.php:217
     76msgid "Backup database as PHP"
     77msgstr "Copia de seguridad como PHP"
     78
     79#: ../auto-domain-change.php:225
    7080msgid "Change domain"
    7181msgstr "Cambiar el dominio"
    7282
    73 #: ../auto-domain-change.php:252
     83#: ../auto-domain-change.php:268
    7484#, php-format
    7585msgid "Old domain: %1$s"
    7686msgstr "Antiguo dominio: %1$s"
    7787
    78 #: ../auto-domain-change.php:253
     88#: ../auto-domain-change.php:269
    7989#, php-format
    8090msgid "New domain: %1$s"
    8191msgstr "Nuevo dominio: %1$s"
    8292
    83 #: ../auto-domain-change.php:285
     93#: ../auto-domain-change.php:298
    8494#, php-format
    8595msgid "Skipping table %1$s because no unique id"
     
    8797"La table %1$s ha sido ignorado, ya que no contiene identificadores únicos"
    8898
    89 #: ../auto-domain-change.php:289
     99#: ../auto-domain-change.php:302
    90100#, php-format
    91101msgid "Processing table %1$s"
    92102msgstr "Procesamiento tabla %1$s"
    93103
    94 #: ../auto-domain-change.php:343
     104#: ../auto-domain-change.php:344
    95105msgid "Back"
    96106msgstr "Volver"
     107
     108#~ msgid ""
     109#~ "I have backed up my database and will assume the responsability of any "
     110#~ "data loss or corruption."
     111#~ msgstr ""
     112#~ "He hecho una copia de seguridad de mi base de datos y no asumen ninguna "
     113#~ "responsabilidad por cualquier pérdida o corrupción de datos."
  • automatic-domain-changer/trunk/languages/auto-domain-change-fr_FR.po

    r1131397 r1357009  
    88"Project-Id-Version: Auto Domain Changer\n"
    99"Report-Msgid-Bugs-To: \n"
    10 "POT-Creation-Date: 2014-09-17 10:31-0500\n"
    11 "PO-Revision-Date: 2014-09-17 10:31-0500\n"
     10"POT-Creation-Date: 2015-12-18 12:53-0500\n"
     11"PO-Revision-Date: 2015-12-18 12:54-0500\n"
    1212"Last-Translator: Tommy Lacroix <tlacroix@nuagelab.com>\n"
    1313"Language-Team: NuageLab <wordpress-plugins@nuagelab.com>\n"
     
    1919"X-Poedit-SourceCharset: UTF-8\n"
    2020"X-Poedit-Bookmarks: -1,430,-1,-1,-1,-1,-1,-1,-1,-1\n"
    21 "X-Generator: Poedit 1.5.4\n"
     21"X-Generator: Poedit 1.7.4\n"
    2222"X-Poedit-Basepath: ./\n"
    2323"X-Poedit-KeywordsList: __;_e;_n\n"
    2424"X-Poedit-SearchPath-0: ..\n"
    2525
    26 #: ../auto-domain-change.php:118
     26#: ../auto-domain-change.php:124
    2727#, php-format
    2828msgid ""
     
    3535"\">ignorer</a>."
    3636
    37 #: ../auto-domain-change.php:134 ../auto-domain-change.php:174
     37#: ../auto-domain-change.php:140 ../auto-domain-change.php:180
    3838msgid "Change Domain"
    3939msgstr "Changer le domaine"
    4040
    41 #: ../auto-domain-change.php:185
     41#: ../auto-domain-change.php:191
    4242msgid "Change domain from: "
    4343msgstr "Changer le domaine de :"
    4444
    45 #: ../auto-domain-change.php:190
     45#: ../auto-domain-change.php:196
    4646msgid "Change domain to: "
    4747msgstr "Changer le domaine à :"
    4848
    49 #: ../auto-domain-change.php:196
     49#: ../auto-domain-change.php:202
    5050msgid "Also change secure <code>https</code> links"
    5151msgstr "Changer également les liens sécurisés <code>https</code>"
    5252
    53 #: ../auto-domain-change.php:201
     53#: ../auto-domain-change.php:207
    5454msgid ""
    5555"Change both <code>www.old-domain.com</code> and <code>old-domain.com</code> "
     
    5959"domain.com</code>"
    6060
    61 #: ../auto-domain-change.php:205
     61#: ../auto-domain-change.php:211
    6262msgid ""
    63 "I have backed up my database and will assume the responsability of any data "
    64 "loss or corruption."
     63"I have backed up my database, checked the backups integrity, know how to "
     64"restore it, and will assume the responsability of any data loss or "
     65"corruption."
    6566msgstr ""
    66 "J'ai fait une copie de sauvegarde de ma base de données et j'assume toute "
     67"J'ai fait un copie de sauvegarde de ma base de données, j'ai vérifié son "
     68"intégrité, je sais comment le remettre en place, et j'assume toute "
    6769"responsabilité en cas de perte ou de corruption de données."
    6870
    69 #: ../auto-domain-change.php:211
     71#: ../auto-domain-change.php:215
     72msgid "Backup database as SQL"
     73msgstr "Sauvegarde de la base de données au format SQL"
     74
     75#: ../auto-domain-change.php:217
     76msgid "Backup database as PHP"
     77msgstr "Sauvegarde de la base de données au format PHP"
     78
     79#: ../auto-domain-change.php:225
    7080msgid "Change domain"
    7181msgstr "Changer le domaine"
    7282
    73 #: ../auto-domain-change.php:252
     83#: ../auto-domain-change.php:268
    7484#, php-format
    7585msgid "Old domain: %1$s"
    7686msgstr "Ancien domaine : %1$s"
    7787
    78 #: ../auto-domain-change.php:253
     88#: ../auto-domain-change.php:269
    7989#, php-format
    8090msgid "New domain: %1$s"
    8191msgstr "Nouveau domaine : %1$s"
    8292
    83 #: ../auto-domain-change.php:285
     93#: ../auto-domain-change.php:298
    8494#, php-format
    8595msgid "Skipping table %1$s because no unique id"
     
    8797"La table %1$s a été ignorée car elle ne contient pas d'identifiants uniques"
    8898
    89 #: ../auto-domain-change.php:289
     99#: ../auto-domain-change.php:302
    90100#, php-format
    91101msgid "Processing table %1$s"
    92102msgstr "Traitement de la table %1$s"
    93103
    94 #: ../auto-domain-change.php:343
     104#: ../auto-domain-change.php:344
    95105msgid "Back"
    96106msgstr "Retour"
     107
     108#~ msgid ""
     109#~ "I have backed up my database and will assume the responsability of any "
     110#~ "data loss or corruption."
     111#~ msgstr ""
     112#~ "J'ai fait une copie de sauvegarde de ma base de données et j'assume toute "
     113#~ "responsabilité en cas de perte ou de corruption de données."
  • automatic-domain-changer/trunk/readme.txt

    r1206460 r1357009  
    44Tags: admin, administration, links, resources, domain change, migration
    55Requires at least: 3.0
    6 Tested up to: 4.2.3
     6Tested up to: 4.4.2
    77Stable tag: trunk
    88License: GPLv2 or later
     
    8383
    8484== Changelog ==
     85= 2.0.0 =
     86* Tested up to WordPress 4.4.2
     87* Added backup functionnality
     88* Removed usage of mysql_* functions in favor of $wpdb
     89
    8590= 1.0.1 =
    86 * Tested up to 4.2.2
     91* Tested up to WordPress 4.2.2
    8792
    8893= 1.0 =
    89 * Tested up to 4.2.1
     94* Tested up to WordPress 4.2.1
    9095
    9196= 0.0.6 =
    9297* Bug fix with the processValue function generating a warning (thanks to @sniemetz for letting us know about this issue)
    9398* Slovak translation (thanks to Marek Letko)
    94 * Tested up to 4.1.1
     99* Tested up to WordPress 4.1.1
    95100
    96101= 0.0.5 =
Note: See TracChangeset for help on using the changeset viewer.