WordPress Amazon Associates Link Builder リンク日本語文字化け対策

Amazon Associates Link Builder を使って、WordPressにアソシエイトのリンクを張っているのですが、いつの間にか文字化けするようになってしまいました。原因が、MariaDB(MySQL)のアップグレードのせいなのか、php7.1のアップグレードのせいなのか、わかりませんが、これまでのAmazonのリンクの日本語が全部「?????」という文字に化けてしまいました。いろいろやっていて直ったので、載せておきます。ただ、どれが効果があったのか分かりませんが、下記の設定をしているうちに直りました。※設定を変えてもブラウザ上の表示はすぐには反映されず、数時間放置していたら直っていました。キャッシュか何かで更新に時間がかかるようです。

■MariaDB(MySQL)のデーターベースの文字設定を変更する。
・mysql起動
[root@centos7 ~]# mysql
・現状の確認
MariaDB [(none)]> show variables like “chara%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |←utf8になていない
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |←utf8になていない
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.001 sec)

MariaDB [(none)]> show databases;
MariaDB [(none)]> show create database `ワードプレスのデータベース名`;

+------------------+------------------------------------------------------------------------------+
| Database         | Create Database                                                              |
+------------------+------------------------------------------------------------------------------+
| wordpress_name   | CREATE DATABASE `wordpress_name` /*!40100 DEFAULT CHARACTER SET latin1 */    |←utf8になっていない
+------------------+------------------------------------------------------------------------------+
1 row in set (0.000 sec)

・ワードプレスのデータベースの文字コードをutf8mb4に変更する。
MariaDB [(none)]> ALTER DATABASE `ワードプレスのデータベース名` default character set utf8mb4;
MariaDB [(none)]> show create database `ワードプレスのデータベース名`;

+------------------+------------------------------------------------------------------------------+
| Database         | Create Database                                                              |
+------------------+------------------------------------------------------------------------------+
| wordpress_name   | CREATE DATABASE `wordpress_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 */   |←変わった
+------------------+------------------------------------------------------------------------------+
1 row in set (0.000 sec)

・ワードプレスのデータベース内のテーブルについて確認してみた。
MariaDB [(none)]> SHOW TABLE STATUS FROM ワードプレスのデータベース名;

・wp_Aalb_Asin_Responseという名前のテーブルの文字コードがlatin1だったので、これもutf8mb4にしてみた。
MariaDB [(none)]> ALTER TABLE wp_Aalb_Asin_Response CONVERT TO CHARACTER SET utf8mb4;

■character_set_databaseの文字コードが変わらなかったので、server.cnfで直接設定してみた。
[root@centos7 /etc/my.cnf.d]# vi server.cnf
[mysqld]
character-set-server=utf8mb4  ←追加
・mysqlの再起動
[root@centos7 ~]# systemctl restart mysql.service
・確認
[root@centos7 ~]# mysql
MariaDB [(none)]> show variables like “chara%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.001 sec)

MariaDB [(none)]> exit

■php.iniの設定を変更
[root@centos7 /etc]# vi php.ini

[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
; http://php.net/mbstring.language
;mbstring.language = Japanese
mbstring.language = Japanese

; Use of this INI entry is deprecated, use global internal_encoding instead.
; internal/script encoding.
; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*)
; If empty, default_charset or internal_encoding or iconv.internal_encoding is used.
; The precedence is: default_charset < internal_encoding < iconv.internal_encoding
;mbstring.internal_encoding =
mbstring.internal_encoding = UTF-8

; Use of this INI entry is deprecated, use global input_encoding instead.
; http input encoding.
; mbstring.encoding_traslation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is: default_charset < intput_encoding < mbsting.http_input
; http://php.net/mbstring.http-input
;mbstring.http_input =
mbstring.http_input = pass

; Use of this INI entry is deprecated, use global output_encoding instead.
; http output encoding.
; mb_output_handler must be registered as output buffer to function.
; If empty, default_charset or output_encoding or mbstring.http_output is used.
; The precedence is: default_charset < output_encoding < mbstring.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
; http://php.net/mbstring.http-output
;mbstring.http_output =
mbstring.http_output = UTF-8

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
;       portable libs/applications.
; http://php.net/mbstring.encoding-translation
;mbstring.encoding_translation = Off
mbstring.encoding_translation = On

; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
; http://php.net/mbstring.detect-order
;mbstring.detect_order = auto
mbstring.detect_order = auto

; substitute_character used when character cannot be converted
; one from another
; http://php.net/mbstring.substitute-character
;mbstring.substitute_character = none
mbstring.substitute_character = none

・httpd再起動
[root@centos7 ~]# systemctl restart httpd.service

■Amazon Associates Link Builderのphpファイル変更
[root@centos7 /home/ユーザー/public_html/wordpress/wp-content/plugins/amazon-associates-link-builder/sql]# vi sql_helper.php

    public function create_table( $columns, $index = array(), $primary_key = "" ) {
        if ( $this->table_not_exists( $this->database_name, $this->table_name ) ) {
            $columns_param = implode( ", ", $columns );
            $index_param = ! empty( $index ) ? ", KEY " . implode( ", KEY ", $index ) : "";
            $primary_key_param = ! empty( $primary_key ) ? ", PRIMARY KEY  $primary_key" : "";

            $parameters = $columns_param . $index_param . $primary_key_param;
            //$create_table_query = "CREATE TABLE {$this->table_name} ( $parameters )";
            $create_table_query = "CREATE TABLE {$this->table_name} ( $parameters ) CHARACTER SET = utf8mb4";

            //To use dbDelta function
            require_once( ABSPATH . "/wp-admin/includes/upgrade.php" );
            dbDelta( $create_table_query );
        }
    }

■変更後すぐにはブラウザに適用されなかったのでしばらく放置。

UNIX

Posted by 伊藤 輝樹