Archive for the プラグイン Category

WordPressの多言語化プラグイン”qTranslate”の設定と使い方。その1

WordPressを多言語化するプラグインqTranslateの管理画面の設定について見ていきます。

インストールしてから設定すること

まず、インストールするといきなり管理画面が英語になります。メニューも何もかも全部です。「あれ?日本語で使えないの?」と思ったのですが、できました。

qTranslateでは、「このサイトでは何語を使うのか」というのをまず設定します。

管理画面 > 設定 > Languagesと進んだ上で、下の方にあるLanguagesの欄で、使う言語を選びます。最初は英独中文となっているので、EnableボタンやDisableボタンを押します。

写真の例では、日英のみにしてみます。

次に、同じ画面の一番上、Default Language / Orderのところで、デフォルト言語を選択&順番を決めます。

この順番というのは、投稿画面などのタイトルなどの表示順です。

デフォルトで使う言語と順番を別々に指定できるということです。デフォルトを日本語にすると、管理画面が全部日本語になりました。

ちなみに、サイドメニューの一番下に、下の画像のようなメニューが現れて、英語をクリックすると管理画面が英語になります。

なので、日本人とイギリス人が同じ管理画面を使ってサイトを管理する場合にもちゃんと使えるということですね。便利すぎます。

言語別のURLの設定

qTranslateでは、以下の3つの形式で言語別のコンテンツを表示させることができます。

  1. example.com/somethinghere?lang=en
  2. example.com/en/somethinghere
  3. en.example.com/somethinghere

いちばん後ろに?lang=xxが付くパターン、ドメイン直後に/xx/が付くやり方、xx.example.com/なサブドメインコースの3つです。

これは、Advanced Settings > URL Modification Modeのところで設定します。

デフォルトの言語は、example.com/example.com/ja/の両方で表示されるようです。

また、Detect Browser Languageという欄で、ブラウザの言語を取得してリダイレクトさせる設定が可能みたいです。

日付がバグるのを治す

qtranslateで日本語を導入したときに、日付がぐちゃぐちゃになる場合の対処という記事にまとめたので、これをやります。

投稿してみる

実際に投稿してみます。

投稿画面は、以下の写真のようになります。

日本語、英語のタイトルを入れて、画像をUPしてみました。画像には日本語でキャプションを入れて。。

その後、「ビジュアル/HTML」の並びにある英語タブをクリックすると、以下のように、英語コンテンツは空白になっています。

なので、英語コンテンツを入れていきます。画像は、アップロード済みなので選択してみるとキャプションに日本語が入っているので、削除して英語を入れます。

公開してチェックしてみると、

日本語表示

英語表示

ちゃんと表示されました。
ちなみに、カテゴリーが「その他」と”other”にちゃんとなっているのは、投稿 > カテゴリーの項目で設定しているからです。

言語別に非表示にすることはできるの?

できました。

デフォルトでは、たとえば、「英語表示の時に日本語しかないコンテンツを表示させる」をやると以下のように(日本語)タイトルとなります。

英語表示で無理やり日本語の投稿を表示させる。

サイドバーにも、日本語コンテンツが表示されています。

英語表示時のサイドバー

これを、General Settings > Hide Untranslated ContentHide Content which is not available for the selected language. というところにチェックを入れると、サイドバーからは表示が消えます。

日本語表示がサイドバーの最新記事から消えたとこ

今後の課題

  • キャッシュ系プラグインどうなるの?
  • カスタムポストタイプはどうなるの?
  • カスタムフィールドは?
  • テンプレートファイルには、どう書くのさ?
  • マルチサイトは?(これは今のところ不要なのでまた今度必要が生まれたら)

といったことを調べていきたいと思います。

カスタムフィールド、無理っぽいのですがねぇ。。

@hissyNさんなんとかしてくださいm(__)m。

qTranslateが投稿のデータをどうやって保存してるのか、データベースを覗いてみたよ。

WordPressを多言語対応させてくれるプラグインのqTranslate、便利なんですが、すっごい不思議です。

そもそもひとつひとつの投稿はどうなっているのでしょう。

データベースを見てみました。

なるほどなるほど。

<!--:ja-->WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !<!--:-->
<!--:en-->Hello World.

This is the first post of your blog.<!--:-->

コメントタグみたいなものが挿入されてました。ソースを見ると。。。

別に普通に見えている。the_contentフィルターに何かをしているみたいです。

qtranslateで日本語を導入したときに、日付がぐちゃぐちゃになる場合の対処

WordPressを多言語対応させるプラグイン、qtranslateで日付や時間の表示が上手くいかない場合、下記をやってみましょう。

設定 > Languages > 対象の国旗 > Editと進んで、好きなフォーマットを入力する。

で、Save Changeをクリック!

これでちゃんと表示されました。

それでも上手くいかない場合、Advanced Setting > Date / Time Conversionをチェックして、一番上のUse emulated date function.が選択されているかどうかを確認してみましょう。

WP Super Cacheの解説であるreadme.txtを、いいとこ取りで乱暴に和訳した。

主要なところ、自分に興味が有るところだけを抽出して乱暴に訳したのをコピペ。

結構役に立つんじゃないかと思います。

間違っていたら、コメントか @shinichiNまでお願いします。

== Description ==
This plugin generates static html files from your dynamic WordPress blog. After a html file is generated your webserver will serve that file instead of processing the comparatively heavier and more expensive WordPress PHP scripts.
動的なWordPressから静的なhtmlファイルを生成します。htmlファイルが生成されてからは、ウェブサーバはWordPressの重たい処理を実行する代わりにこの静的ファイルを供給します。
Continue reading WP Super Cacheの解説であるreadme.txtを、いいとこ取りで乱暴に和訳した。

安全なプラグイン用管理画面メモ

プラグインで管理画面を作る時に、ユーザにフォームに入力してもらったり、セレクトやラジオボタンなどで選択してもらってそれをデータベースに保存する時、色々なセキュリティ上の設定が必要ですが、それらについてメモします。

管理画面の作り方については、@lilyfanjpさんのこの記事にあるPDFが参考になります。

これを見ただけで僕が分からなかった部分については、@MakeGoodTimeさんに教わったりして、理解できましたので、ここで共有させてもらいます。

まずは、セレクトフォームの場合を用意して、のちのち数字、URL、メールアドレス、文字列、日付などを増やしていければと思います。

ここをコピペすれば最低限安心できる感じで。

例のフォーム

例として簡単なフォームを作ります。

<form action="" method="post">
<table>
<tr valign="top">
<th scope="row"><label for="xxx">果物</label></th>
<td>
	<select name="fruits" id="fruits">
		<?php
		$select_options = array(
		array('value' => 'apple', 'text'=>'apple'),
		array('value' => 'banana', 'text'=>'banana'),
		array('value' => 'orange', 'text'=>'orange')
		);
		foreach ($select_options as $select_option) : ?>
		<option value="<?php echo esc_attr($select_option['value']); ?>" <?php if(get_option('fruits') == $select_option['value']){ echo ' selected="selected"' } ?>><?php echo esc_attr($select_option['text']); ?></option>
		<?php endforeach; ?>
	</select>
</td>
</tr>
</table>
<p class="submit"><input type="submit" name="Submit" class="button-primary" value="変更を保存" /></p>
<form>

これで、りんご、バナナ、オレンジから一つを選んでもらうフォームができます。actionは空、methodはpostです。htmlタグは、管理画面の他のページに合わせてます。

値を保存する方法

オプションテーブルに値を保存する場合は、セキュリティを無視すると以下。

update_option('fruits', '$_POST['fruits']');

POST値を受け取って、update_option()する。

入力された値を検証すると、以下。

$fruits = $_POST['fruits'];
if ( isset( $fruits ) && in_array( $fruits, array('apple', 'banana', 'orange' ) ) ) {
	update_option('fruits', $fruits);
}

とします。セレクトの場合は想定されているものが決まっているので、それ以外の可能性を全て排除しています。

wp_nonce_field()とcheck_admin_referer()

POSTの値が、本当にこの画面から送られてきているかを、WordPressに確認してもらうために、wp_nonce_field()check_admin_referer()を使います。

wp_nonce_field()の方を、formの中に書きます。
すると送信した時に、POSTに、_wp_http_referer_wpnonceが自動的に含まれます。

一方のcheck_admin_referer()は、update_optionなどその値をどこかに保存したり出力する、リスクが発生する処理の直前に設置します。

今回の例だと、下記のようになります。

<?php
$fruits = $_POST['fruits'];
if ( isset( $fruits ) && in_array( $fruits, array('apple', 'banana', 'orange' ) ) ) {
	check_admin_referer('example'); // ←ココと、
	update_option('fruits', $fruits);
}
?>
<form action="" method="post">
<table>
<tr valign="top">
<th scope="row"><label for="xxx">果物</label></th>
<td>
	<select name="fruits" id="fruits">
		<?php
		$select_options = array(
		array('value' => 'apple', 'text'=>'apple'),
		array('value' => 'banana', 'text'=>'banana'),
		array('value' => 'orange', 'text'=>'orange')
		);
		foreach ($select_options as $select_option) : ?>
		<option value="<?php echo esc_attr($select_option['value']); ?>" <?php if(get_option('fruits') == $select_option['value']){ echo ' selected="selected"' } ?>><?php echo esc_attr($select_option['text']); ?></option>
		<?php endforeach; ?>
	</select>
</td>
</tr>
</table>
<?php wp_nonce_field('example'); // ココ。 ?>
<p class="submit"><input type="submit" name="Submit" class="button-primary" value="変更を保存" /></p>
<form>

出力するときの注意

コデックスのデータ検証を参考にする。

文字列を出力する

	$text = get_option('the_key');
	$safe_text = esc_html($text);
	echo $safe_text;

esc_html関数

Encodes < > & ” ‘ (less than, greater than, ampersand, double quote, single quote). Will never double encode entities.

Always use when escaping user-input, in forms especially.

esc_htmlとesc_attrについて。

@ ちょっと違います。使い分けは出力される場所で決まります。esc_html() はベタの HTML 部分、esc_attr() は img alt="…" などタグの属性値の中身を出力するときに使います。
@lilyfanjp
IKEDA Yuriko

書きかけ。。。ここに出力時の注意を足していく。