diff --git a/lib/Config/Database.php b/lib/Config/Database.php index 1fba7cd9b3..aa77a7db1c 100644 --- a/lib/Config/Database.php +++ b/lib/Config/Database.php @@ -32,6 +32,7 @@ class Database { $driver_options = array( 'TIME_ZONE = "' . Env::$db_timezone_offset . '"', 'sql_mode=(SELECT REPLACE(@@sql_mode,"ONLY_FULL_GROUP_BY",""))', + 'NAMES ' . Env::$db_charset . ' COLLATE ' . ENV::$db_collation, ); $current_options = ORM::for_table("") ->raw_query('SELECT @@session.wait_timeout as wait_timeout') @@ -91,4 +92,4 @@ class Database { define('MP_STATISTICS_FORMS_TABLE', $statistics_forms); } } -} \ No newline at end of file +} diff --git a/lib/Config/Env.php b/lib/Config/Env.php index a98c81220d..a9b24cdba4 100644 --- a/lib/Config/Env.php +++ b/lib/Config/Env.php @@ -28,6 +28,8 @@ class Env { static $db_username; static $db_password; static $db_charset; + static $db_collation; + static $db_charset_collate; static $db_timezone_offset; static $required_permission = 'manage_options'; @@ -62,7 +64,9 @@ class Env { self::$db_name = DB_NAME; self::$db_username = DB_USER; self::$db_password = DB_PASSWORD; - self::$db_charset = $wpdb->get_charset_collate(); + self::$db_charset = $wpdb->charset; + self::$db_collation = $wpdb->collate; + self::$db_charset_collate = $wpdb->get_charset_collate(); self::$db_source_name = self::dbSourceName(self::$db_host, self::$db_socket, self::$db_port); self::$db_timezone_offset = self::getDbTimezoneOffset(); } @@ -90,4 +94,4 @@ class Env { $mins -= $hrs * 60; return sprintf('%+03d:%02d', $hrs * $sgn, $mins); } -} \ No newline at end of file +} diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index d7fd69b633..d8ff36bf26 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -438,6 +438,7 @@ class Menu { wp_enqueue_media(); wp_enqueue_script('tinymce-wplink', includes_url('js/tinymce/plugins/wplink/plugin.js')); wp_enqueue_style('editor', includes_url('css/editor.css')); + $this->displayPage('newsletter/editor.html', $data); } diff --git a/lib/Config/Migrator.php b/lib/Config/Migrator.php index 9d4a2509c6..636926f559 100644 --- a/lib/Config/Migrator.php +++ b/lib/Config/Migrator.php @@ -12,7 +12,7 @@ require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); class Migrator { function __construct() { $this->prefix = Env::$db_prefix; - $this->charset = Env::$db_charset; + $this->charset_collate = Env::$db_charset_collate; $this->models = array( 'segments', 'settings', @@ -369,7 +369,7 @@ class Migrator { $sql = array(); $sql[] = "CREATE TABLE " . $table . " ("; $sql = array_merge($sql, $attributes); - $sql[] = ") " . $this->charset . ";"; + $sql[] = ") " . $this->charset_collate . ";"; return implode("\n", $sql); } diff --git a/lib/Config/Populator.php b/lib/Config/Populator.php index 44dd1a4270..896b4559ca 100644 --- a/lib/Config/Populator.php +++ b/lib/Config/Populator.php @@ -42,7 +42,7 @@ class Populator { } function up() { - global $wpdb; + $this->convertExistingDataToUTF8(); array_map(array($this, 'populate'), $this->models); @@ -308,4 +308,60 @@ class Populator { ) ); } + + /* + * MailPoet versions 3.0.0-beta.31 and older used the default MySQL connection + * character set, which usually defaults to latin1, but stored UTF-8 data. + * This method converts existing incorrectly stored data that uses the + * default character set, into a new character set that is used by WordPress. + */ + public function convertExistingDataToUTF8() { + global $wpdb; + + if(!version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.31', '<=')) { + // Data conversion should only be performed only once, when migrating from + // older version + return; + } + + $source_charset = $wpdb->get_var('SELECT @@GLOBAL.character_set_connection'); + $destination_charset = $wpdb->get_var('SELECT @@SESSION.character_set_connection'); + + if($source_charset === $destination_charset) return; + + $tables = array( + 'segments' => array('name', 'type', 'description'), + 'settings' => array('name', 'value'), + 'custom_fields' => array('name', 'type', 'params'), + 'sending_queues' => array('type', 'newsletter_rendered_body', 'newsletter_rendered_subject', 'subscribers', 'status'), + 'subscribers' => array('first_name', 'last_name', 'email', 'status', 'subscribed_ip', 'confirmed_ip', 'unconfirmed_data'), + 'subscriber_segment' => array('status'), + 'subscriber_custom_field' => array('value'), + 'newsletters' => array('hash', 'subject', 'type', 'sender_address', 'sender_name', 'status', 'reply_to_address', 'reply_to_name', 'preheader', 'body'), + 'newsletter_templates' => array('name', 'description', 'body', 'thumbnail'), + 'newsletter_option_fields' => array('name', 'newsletter_type'), + 'newsletter_option' => array('value'), + 'newsletter_links' => array('url', 'hash'), + 'forms' => array('name', 'body', 'settings', 'styles'), + ); + + foreach($tables as $table => $columns) { + $query = "UPDATE `%s` SET %s"; + $columns_query = array(); + foreach($columns as $column) { + $columns_query[] = sprintf( + '`%1$s` = convert(cast(convert(`%1$s` using `%2$s`) as binary) using %3$s)', + $column, + $source_charset, + $destination_charset + ); + } + $wpdb->query(sprintf( + $query, + $this->prefix . $table, + implode(', ', $columns_query) + )); + } + } + }