その3の続き。
多言語(マルチリンガル)化でまだ気持ち悪い箇所を発見。
新規投稿時に自動ツイートしてくれるTwitter連携プラグイン「WP to Twitter」がまだ日本語でツイートされていた。これじゃ諸国の方もわけわからんであろう。
万国共通語である英語に統一しても良いのだが、どうせなら記事の言語で判定して、言語別でツイートさせたい。が、当然そんな 不要な リッチな機能はついておらず。
もうテーマのカスタマイズしたから、プラグインのカスタマイズも行けるでしょ。と調子に乗って手を出すことに。
注意!
以下の方法は私の環境でとりあえず上手くいった方法です。もし実施する際は事前にファイルマネージャに入る方法の確認やバックアップを取ることをお奨めします。
既に色々とカスタマイズしている方や、バージョンやプラグインの有無などで上手くいかない可能性もあります。すべて自己責任で行って下さい。責任は負いません。
環境:
WordPress 5.6.1
WP to Twitter 3.5.0 (GPLv2)
方法:
現状整理と対応予定の確認
私が「WP to Twitter」で使用しているテンプレートは以下の通り。
固定文字 → 言語別にしたい
#title# → 記事タイトル。元々英語なので対応しない
#blog# → ブログタイトル。言語別にする
#url# → ショートURL。何もしない
#tags# → ハッシュタグ。言語別にする
なので、固定文字とタイトル、それとタグを言語別ツイートに対応させる。
記事タイトルは元々英語なので、対応しない。というか、おそらくこれは記事IDをそのまま引っ張ってくると思うので、このままでも問題なさそう。
カスタムフィールドの対応は未調査。
それと、更新時は自動ツイートしていないのでそれも対応しない。が、基本的には公開時と同じような対応がとれると思われる。
記事の言語(locale)の取得方法
とりあえず記事の言語、つまりlocaleを取得できなければどうしようもない。
調べたら、以下の方法で取れるとのこと。$POST_IDは記事のID。
get_post_meta( $POST_ID, '_locale', true ) // この書き方でもOK get_post_meta( $post_ID, '_locale' )[0]
このget_post_meta()関数を使用して言語判定を行う。
Bogoの関数を使用した翻訳方法
翻訳を行うためにはBogoの力を借りる必要がある。
プラグインをしらみつぶしして調査したところ、以下の関数が使えるのではと予測。
サイトタイトルとかの翻訳もこうやってるんだなぁ。まぁなんとなくは想像できてはいたが、実際見ると納得。
bogo/includes/pomo.php function bogo_bloginfo_filter( $output, $show ) // 以下でブログタイトルの翻訳ができそう bogo_bloginfo_filter( ブログタイトル, 'name' ); function bogo_translate_term( WP_Term $term ) // 以下でタグなどタクソノミーの翻訳ができそう bogo_translate_term( ターム );
ブログタイトルの言語別ツイート対応
という事で作業開始。
まず、wp-to-twitter.php内のwpt_post_info() 関数の中にブログタイトルを取得している場所があった。
Bogoの関数、bogo_bloginfo_filter()が使えそうだったので、変換。
3/10 追記:以下の処理にlocaleの変換とswitch_to_locale()の追加、およびBogo_POMOのimportの呼び出しを追加。詳しくはページ下部の「追記」へ。
$values['blogTitle'] = get_bloginfo( 'name' ); // mycustomize if ('en_US' == get_post_meta( $post_ID, '_locale', true ) ) { $locale = 'en_US'; } else { $locale = 'ja'; } switch_to_locale( $locale ); Bogo_POMO::import( $locale ); $values['blogTitle'] = bogo_bloginfo_filter( $values['blogTitle'], 'name' ); // mycustomize end
固定文字の言語別ツイート対応
これはちょっとカッコ悪いが、とりあえずWP to Twitterの設定にて固定文字を外す。
で、wpt_tweet()関数にテンプレートを取得している箇所があるので、以下の様に変更。言語別で固定文字を直接記述した。
まぁあまり変えることは無いのでね…許してつかあさい…
wpt_mail( '4c: Post action is publish', 'This event was a post publish action.' . "\n" . 'Modified Date: ' . $post_info['_postModified'] . "\n\n" . 'Publication date:' . $post_info['_postDate'], $post_ID ); // DEBUG. if ( '1' === (string) $post_type_settings[ $post_type ]['post-published-update'] ) { // original // $nptext = stripcslashes( $post_type_settings[ $post_type ]['post-published-text'] ); // mycustomize if ('en_US' == get_post_meta( $post_ID, '_locale', true ) ) { $nptext = stripcslashes( 'New post published.' . $post_type_settings[ $post_type ]['post-published-text'] ); } else { $nptext = stripcslashes( '記事を投稿しました。' . $post_type_settings[ $post_type ]['post-published-text'] ); } // mycustomize end $newpost = true; }
タグの言語別ツイート対応
WordPressのタグをTwitterのハッシュタグに変換する箇所に言語別の対応をする。
これはちょっとわかりづらかった。
wpt_generate_hash_tags()関数にforeachで回している箇所がある。
slugは使用していないのでとりあえずtagだけ対応。
bogo_translate_term()を使用して翻訳。ちょうど$valueがWP_termなので型も問題なさそう。
$source = get_option( 'wpt_tag_source' ); if ( 'slug' === $source ) { // If the tag has an '@' symbol as the first character, assume it is a mention unless set. if ( 0 === stripos( $value->name, '@' ) && ! $term_meta ) { $term_meta = 5; } $tag = $value->slug; } else { // mycustomize if ('en_US' == get_post_meta( $post_ID, '_locale', true ) ) { $value = bogo_translate_term( $value ); } // mycustomize end $tag = $value->name; // If the tag has an '@' symbol as the first character, assume it is a mention unless set. if ( 0 === stripos( $value->name, '@' ) && ! $term_meta ) { $term_meta = 4; } }
これで対応完了。動作確認。
問題点
3/10 追記:以下の問題点は解消しています。作業ログとして残しておきます。
やっぱり問題点というか、気を付けなければいけない事がある。
記事投稿時はWordPressの言語を合わせなくてはいけない。
つまり英語記事の時は、管理画面も英語モードになっていないといけない。日本語のままだとツイートが日本語処理されてしまう。逆もしかり。
まぁ面倒なので、実はこれも解決しようとした。
「WP to Twitter」処理中に強制的に言語変更を行おうとしたが、上手くいかなかった。
以下の様に$localeを設定してもダメ。
// not working if ('en_US' == get_post_meta( $post_ID, '_locale', true ) ) { $locale = 'en_US'; } else { $locale = 'ja'; }
switch_to_locale()関数を挟んでもダメ。
// not working if ('en_US' == get_post_meta( $post_ID, '_locale', true ) ) { switch_to_locale('en_US'); } else { switch_to_locale('ja'); }
ここまでできたのだから、方法はあるはず。でもまぁ動くことは動いたので、ちょっと時間かかりそうであれば諦めるかもしれない…。
3/8 追記
運用して気づいたのだが、これだと予約投稿の際に言語別にツイートが出来ない。
やっぱり不便なので調査。
恐らくだが、localeの切り替え後、BogoのPOMO(翻訳テーブル)を再度読み込む必要がありそうなことまでは分かった。
if ('en_US' == get_post_meta( $post_ID, '_locale', true ) ) { $locale = 'en_US'; } else { $locale = 'ja'; } switch_to_locale( $locale ); Bogo_POMO::import( $locale );
軽くツイートを試してみたところ、上手くいったが、ちょっとこれで合っているのかは不安が残る…
しかも予約投稿が同時の場合、どうなるかはまだ試せていないので、これも自己責任で…
ダメなら少し時間をずらすとかで対処か。
最悪タグを消して、タイトル等は固定でもいいか…
3/10 追記
1回しか試してないが、どうやら同時投稿も問題なさそうか。
とりあえず暫定の対応版として方法に追記しておく。
また何か変な箇所があれば対応していく。