こんばんわです。
手元に qtransrate のコードがちょうどあったので、勉強がてらに考えてみました。
qTranslate が the_posts フィルタでどーんとデータ内の言語データを整理してしまうので、思いのほか大掛かりなコードになりました。長くなったので、そのまま記載しておきます。
ただもっと良いやり方あるかも知れないので、他の方からフォローがあれば嬉しいです。
以下のコードを、functions.php に書いてから、テンプレート中では、<?php qtransextra::the_title( 'en' ) ?>
のように使ってください。
add_action( 'init', 'qtransextra::init' );
class qtransextra
{
private static $original_posts_data = array();
public static function init() {
if ( is_admin() ) {
return;
}
add_filter( 'the_posts', 'qtransextra::save_original_data', 0 );
}
public static function save_original_data( $posts ) {
if ( is_array( $posts ) ) {
foreach ( $posts as $post ) {
self::$original_posts_data[$post->ID] = (object) array(
'post_title' => $post->post_title,
);
}
}
return $posts;
}
public static function get_the_title( $lang, $post = 0 ) {
global $q_config;
$post = get_post( $post );
$actual_lang = $q_config['language'];
$actual_post_title = $post->post_title;
$q_config['language'] = $lang;
$post->post_title = self::$original_posts_data[$post->ID]->post_title;
$title = get_the_title();
$q_config['language'] = $actual_lang;
$post->post_title = $actual_post_title;
return $title;
}
public static function the_title( $lang, $before = '', $after = '', $echo = true ) {
$title = self::get_the_title( $lang );
if ( strlen( $title ) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
}
トピック投稿者
aq-n
(@aq-n)
上記の通り出来ました!ありがとうございます。
コードの中で
if ( is_admin() ) {
return;
}
としている理由を聞いてもよろしいでしょうか?
もにんぐですー。
主に2つ理由があります。
1つは、qtransextra::save_original_data で行う処理は、the_posts フィルタで qtransrate が現在の言語以外のデータを整理してしまう前に、多言語混在のデータを保存しておくことです。
しかし、ここで、qtransrate は管理画面において言語を整理しません。伴って管理画面で qtransextra::save_original_data は実行しなくても良いかな?と判断しました。
もう1つは、要件を見てフロントサイトでの表示の為の要望だと想像しました。このことから、管理画面での実行は不要だろう、とも考えました。
以上2点だったと思いますー。
トピック投稿者
aq-n
(@aq-n)
そうなんですね~!了解しました。
ありがとうございます!