| // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or | // | modify it under the terms of the GNU Lesser General Public | // | License as published by the Free Software Foundation; either | // | version 2.1 of the License, or (at your option) any later version. | // | | // | This library is distributed in the hope that it will be useful, | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | // | Lesser General Public License for more details. | // | | // | You should have received a copy of the GNU Lesser General Public | // | License along with this library; if not, write to the | // | Free Software Foundation, Inc. | // | 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | // +----------------------------------------------------------------------+ /** * Converts wordpress encodings * * IMPORTANT! * Remember to dumpy your database first * * mysqldump --opt DB_NAME * * Or use phpMyAdmin: * http://www.zerokspot.com/docs/howto.phpmyadmin.backup_and_restore/ * http://www.phpmyadmin.net/documentation/#faq6_3 * * Do NOT run this script more then once * * Place this script inside the wp-content folder of your blog and * access it via the browser, e.g. http://yoursite.com/blog/wp-content/convert-encoding.php * * Remember to remove it afterwards. * * @author Markus Tacker * @link http://m.tacker.org/blog/64.script-to-convert-wordpress-content-encoding.html */ // You have to remove the line below to make this script work // By removing the line you accept the license agreement stated above die('Please follow the instructions in ' . $_SERVER['PHP_SELF']); error_reporting(E_ALL); ini_set('display_errors', 1); /** * @var string Target encoding */ $new_encoding = 'UTF-8'; /** * @var string New collation for the table */ $new_mysql_collation = 'utf8_general_ci'; /** * @var string New character set for the table */ $new_mysql_encoding = 'utf8'; /** * You would set this switch to true if you have used this script before * and Your titles contain invalid non-ascii charactes like "für" * Your database entries are utf-8 encoded and need to be decoded, not converted. * * @var bool UTF-8 decode your content instead */ $decode = false; require_once '../wp-config.php'; // Connect $DBC = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); mysql_select_db(DB_NAME, $DBC); $result = mysql_query('SHOW TABLES FROM ' . DB_NAME, $DBC); echo '
';
    echo 'Mode is ' . (($decode) ? 'decode' : 'convert') . "\n";
    echo 'New encoding is ' . $new_encoding . "\n";
    echo 'New encoding for mysql is ' . $new_mysql_encoding . "\n";
    echo 'New collation for mysql is ' . $new_mysql_collation . "\n";
    while ($row = mysql_fetch_row($result)) {
        // Skip Non-WP tables
        if (!empty($table_prefix) && substr($row[0], 0, strlen($table_prefix)) != $table_prefix ) continue;
        // Convert the tables encoding
        $sql = 'ALTER TABLE ' . ek($row[0]) . ' DEFAULT CHARACTER SET ' .  $new_mysql_encoding . ' COLLATE ' . $new_mysql_collation;
        mysql_query($sql);
        // Convert the fields
        $sql = 'SHOW CREATE TABLE ' . ek($row[0]);
        $result2 = mysql_query($sql);
        $table_sql = mysql_fetch_assoc($result2);
        foreach (explode("\n", $table_sql['Create Table']) as $line) {
            $line = trim($line);
            if (!preg_match('/ character set ([^ ]+)/', $line, $match_cs)) continue;
            $line = preg_replace('/collate [0-9a-z_]+/i', '', $line); // Remove old collate
            preg_match('/^`[^`]+`/', $line, $match_field);
            $sql = 'ALTER TABLE ' . ek($row[0])
            . ' CHANGE ' . $match_field[0] . ' '
            . str_replace($match_cs[0], ' character set ' . $new_mysql_encoding . ' COLLATE ' .  $new_mysql_collation, substr($line, 0, -1));
            mysql_query($sql);
        }
        // Convert its data
        $result_data = mysql_query('SELECT * FROM ' . $row[0]);
        echo $row[0] . ' ';
        while ($data = mysql_fetch_assoc($result_data)) {
            $sql = 'UPDATE ' . $row[0];
            // Build set
            $set = array();
            foreach ($data as $key => $val) {
                if ($decode) {
                    $set[] = ek($key) . '=' . ev(utf8_decode($data[$key]));
                } else {
                    $set[] = ek($key) . '=' . ev(mb_convert_encoding($data[$key], $new_encoding));
                }
            }
            $sql .= ' SET ' . join(', ', $set);
            // Build where
            $where = array();
            foreach ($data as $key => $val) {
                if (!preg_match('/^[0-9]+$/', $val)) continue; // Use only numbers in where
                $where[] = ek($key) . '=' . ev($data[$key]);
            }
            if (empty($where)) continue 2; // Table has no numeric fields, skip it
            $sql .= ' WHERE ' . join(' AND ', $where);
            $query_result = mysql_query($sql, $DBC);
            if (!$query_result) {
                die( 'Query failed: ' . $sql . ' (' . mysql_error() . ')' );
            }
            echo '.';
            flush();
        }
        echo "\n";
    }
    echo "All done.\n";
    echo 'Remember to remove this script!' . "\n";
    echo '
'; // Disconnect mysql_close($DBC); function ek($string) { global $DBC; return "`" . mysql_real_escape_string($string, $DBC) . "`"; } function ev($string) { global $DBC; return "'" . mysql_real_escape_string($string, $DBC) . "'"; }