WordPressのスラッグはデフォルトでは記事のタイトルがURLエンコードされて使われますが、できれば英数字にしたいところです。記事IDや投稿日時、乱数などを使うという手もありますが、タイトルを英語に翻訳して使うのが一番セクシーでしょう(流行りに乗りました)。
しかし都度記事タイトルを英文に翻訳するのは英語が得意でなければとても大変です。
そこでタイトルをIBM Watsonの翻訳APIを使って自動で英文にしてくれるプラグインが「Simple Slug Translate」です。
作者様が日本人なので使い方も分かりやすいです。
IBMのアカウント取得やAPIキーの発行などの作業は必要ですが、解説通りに進めていくと迷うことはないと思います。
ADs
自動で翻訳となるとどの程度の精度なのかが気になるところです。
そこで実際に翻訳しづらい記事タイトルを作成して試してみました。
テーマユニットテストデータはWordPressのテーマ作成者向けのテスト用記事データです。
その中で一番長い件名を使ってみました。
1行分しか想定されていない見出しのデザインだと文字がはみ出してしまってあら大変。ものすごく長い日本語のタイトルが付いた記事の表示テストです。複数行になっても問題ないデザインだといいですね。あと前後の記事へのリンクを出力している場合や、パンくずリストを実装している場合なども表示にズレがないか確認しておきましょう。” はロックされています。
1行分しか想定されていない見出しのデザインだと文字がはみ出してしまってあら大変。ものすごく長い日本語のタイトルが付いた記事の表示テストです。複数行になっても問題ないデザインだといいですね。あと前後の記事へのリンクを出力している場合や、パンくずリストを実装している場合なども表示にズレがないか確認しておきましょう。
↓
it-is-very-hard-to-find-out-that-the-design-of-the-headlines-is-only-one-line-of-design-this-is-a-display-test-of-an-article-with-a-very-long-title-of-japanese-its-a-good-design-to-be-a-multi-line-de
単語間はハイフンで区切られ、200文字以内で切られます。
読める英文になっているのではないでしょうか。いい感じです。
日本語として成立していない(という表現は語弊があるかもしれませんが)文章はどうでしょうか。
長文といえば寿限無です。
寿限無寿限無五劫のすりきれ海砂利水魚の水行末雲来末風来末食う寝るところに住むところやぶら小路のぶら小路パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナの長久命の長助
↓
the-longevity-of-a-fish-with-a-limit-of-five-kko-is-the-long-life-of-pampopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopopo
このポポポポポポポポポポポポ…はどこから来たのでしょう(;´∀`)
しかしそれっぽい感じにはなりました。
世界的に長い単語といえばメリー・ポピンズのあれです。
スーパーカリフラジリスティックエクスピアリドーシャス
↓
supercaliflazyrysticexpialidochus
正しくは「Supercalifragilisticexpialidocious」なので綴りに違いはありますが、読めそうな単語になりました。すごい。
アニソンはどうでしょう
(このセクションはJ様から請求書が届いたら消します)
曖昧3センチ そりゃぷにってコトかい? ちょっ! らっぴんぐが制服…だぁぁ不利ってこたない ぷ。 がんばっちゃ♥やっちゃっちゃ そんときゃーっち&Release ぎョッ 汗(Fuu)々(Fuu)の谷間に Darlin’ darlin’ F R E E Z E!!
「もってけ!セーラー服」
作詞:畑亜貴
作曲:神前暁
歌:平野綾・加藤英美里・福原香織・遠藤綾
↓
are-you-sure-youre-three-inches-of-ambiguity%e3%80%80ow-uniform-no-its-not-disadvantaged-its-a-ppu-ganbakando-yattochakansaganaganagatara-fuu-fuu-darlin-darlin-darlin-darlin-darlin
記号は翻訳されないようです。
タイトルに使わないようにするか、自前で変換するフィルターフックを書けばなんとかなるかもしれません。
「随分遠いね。元来どこから登るのだ」と一人ひとりが手巾で額を拭きながら立ち留どまった。
夏目漱石 虞美人草
↓
thats-a-long-way-offwhere-the-man-is-coming-from-where-he-comes-from-he-stopped-wiping-his-forehead-with-his-hand
手巾(ハンケチ)がhis handとなってしまいました。漢字は難しいのかもしれません。
J様から請(ry
ほっぺたぷにぷに つるぺた! つるぺた!! アイツは所謂 「幼女の世界」 偽善者ぶってる仮面を剥いだら 「スクール水着も喰べなs (らめぇええええええええええええ)」 ネギが嫌いとか言ってるヤツには■■からネギを□っさすぞぉ↑
作詞:cosMo(暴走P)
作曲:cosMo(暴走P)
編曲:cosMo(暴走P)
唄:初音ミク
↓
ive-got-a-ticket-for-the-pup-tsurupeta-hes-called-the-young-womans-world-peeling-off-the-masquerel-dont-be-a-school-swimsuit-yes-yes-yes-he-says-he-doesnt-like-the-green-onion
「らめぇええええええ」が「yes yes yes」でしょうか。
しかし「つるぺた」が「tsurupeta」と翻訳されたのはさすがです。
さすがに無理があるケースはさておき、普通の日本語なら大体は意味の通る英文になりそうですので、十分実用範囲かなと思います。
このように「Simple Slug Translate」は大変便利なプラグインなのですが、記事が投稿されたタイミングで翻訳を行うため、過去の記事についてはスラッグが日本語であってもそのままです。
記事公開後にスラッグを変更するのはSEO的にはあまりよくないですが、過去記事に対して翻訳の処理を適用されるには以下の処理をプラグインフォルダ内のsimple-slug-translate.phpに追加します。
まずplugins_loaded()内にsend_headersで実行するためのアクションを追加。
1 2 3 4 5 |
add_action( 'admin_menu', array( $this, 'admin_menu' ) ); add_action( 'admin_init', array( $this, 'admin_init' ) ); add_filter( 'name_save_pre', array( $this, 'name_save_pre' ) ); add_filter( 'wp_insert_term_data', array( $this, 'wp_insert_term_data' ), 10, 3 ); add_action('send_headers',array($this,'update_slug')); //追加 |
次に「update_slug」関数を定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public function update_slug(){ if($_GET['translate'] == 1){ foreach ( $this->options['post_types'] as $post_type ) { $posts = get_posts(array( 'post_type' => $post_type, 'numberposts' => -1 )); foreach($posts as $post){ if(preg_match( "/%/u", $post->post_name) ){ $post_name = $this->call_translate( $post->post_title ); //wp_update_postを実行する前に念の為var_dumpで確認したほうが安全 //var_dump($post_name); wp_update_post( array( 'ID' => $post->ID, 'post_name' => $post_name, ) ); } } } } } |
そして管理画面のURLの末尾に「?translate=1」と追加して更新すれば、過去記事のスラッグが英語に翻訳されます(もともと英語だったスラッグはそのままです)。
ADs
貴重なスクリプトと記事をありがとうございます。
後半の、過去の記事を翻訳できる!
という箇所にとても興奮して実行させて頂きましたが、
translate の宣言がありませんエラーが出ただけとなってしまいました…
実行時に、記されておりますように、
wp-admin の後に、?translate=1を追記して実行したのですが、エラーでした。
関数の置き場所も前後変えてみたりしました。
なにか環境の変化などあるのでしょうか。
お手数をおかけして申し訳ありませんが、
何かヒント的なこと伺えますと、幸いです。
よろしくお願いします。