WordPress のマルチサイト(ネットワーク)機能を使った2ヶ国語のサイトを作る際に必要になったことなどに関するメモ。
ルートサイトを日本語、追加したサイトを英語にする場合の例。WordPress のインストールは通常のサイトと同じ。インストール後「wp-config.php」に追加の設定をしてマルチサイト化する。
目次
phpMyAdmin で空のデータベースを作成
WordPress 日本語版を WordPress 日本語サイト(http://ja.wordpress.org/)からダウンロード
ダウンロードした .zip ファイルを展開し、ローカル環境のフォルダにコピーして配置。
配置した WordPress にアクセス(ルートに配置した場合は、http://localhost/ 、配置した場所により異なる)
以下のような画面が表示されるので「設定ファイルを作成する」をクリック
以下のような画面が表示されるので「さあ、始めましょう!」をクリック
データベースの設定情報を入力して「送信」をクリック
以下は Xampp のローカル環境の例。
テーブル接頭辞はセキュリティ上の理由で変更する(入力した値は後で必要になるのでひかえておく)
「インストールを実行」をクリック
次の画面でサイトの情報を入力する。
注意
セキュリティ上、ユーザー名は「admin」以外の名前を指定する。
情報を入力したら「WordPress をインストール」をクリック。
インストール完了のメッセージが表示されたら、「ログイン」をクリック
ログイン画面が表示されるので、ユーザー名とパスワードを入力してログインする。
マルチサイトにする設定を行う。
define('WP_ALLOW_MULTISITE', true);
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */ より上の行に記述する
「WordPress サイトのネットワークの作成」の画面が表示されるので以下を実行
「wp-config.php」
「.htaccess」は WordPress ルールを置き換える
元の「.htaccess」
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
置き換え後の「.htaccess」
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L] # END WordPress
上記の設定が完了したらログインしなおす
管理画面上部の「管理バー」から「参加サイト」→「サイトネットワーク管理者」(→「ダッシュボード」)を選択
左サイドバーから「設定」→「ネットワークの設定」を選択
ここでは、ネットワーク名や管理者のメールアドレスを変更することができる。また、以下の項目などを設定する。
あえて必要がない限り、デフォルトの「 新規登録を許可しない」にしておく(スパムの子ブログが作成される可能性があるため)。
また、「新しいサイトまたはユーザーが登録されたらネットワーク管理者にメールで通知する。」にもチェックが入っていることを確認する。(デフォルトでは入っている)
それぞれのサイトで使用するプラグインは「サイトネットワーク管理者」として「新規追加」でインストールしておく必要がある。
ネットワークで有効化
個々のサイトで有効化
「サイトネットワーク管理者」としてインストールのみしておいて(ネットワークで有効化はしない)、個々のサイトで有効化する。
日本語の扱いに関する修正を行うために「WP Multibyte Patch」を有効化する。
「サイト」→「すべてのサイト」を選択すると、1つだけサイト(ルートサイト)が追加された状態になっている
サイトを追加するには「サイト」→「新規追加」を選択
以下は「en」というディレクトリに「English XXXXXX」という(英語の)サイトを追加する例
サイトごとの設定を行うには、画面上部の「参加サイト」からそれぞれのサイトを選択するか、左メニューの「ダッシュボード」→「参加サイト」で各サイトの「ダッシュボード」をクリックして管理が面に切り替える。
サイトごとの言語、キャッチフレーズ、1ページに表示する記事の数等の設定を行う。
変更後は「変更を保存」をクリック。
言語、キャッチフレーズを指定
1ページに表示する記事の数を指定
メディア設定
「設定」→「メディア」を選択して画像サイズ関連の設定をする
パーマリンクの設定を確認
テーマを有効化する
テーマもサイトごとに選択する必要がある。また、各サイトでテーマを使用するには「サイトネットワーク管理者」として有効化しておく必要がある。
以下でオリジナルのテーマを有効にすると、この段階では index.php や style.css に何も記述していないので何も表示されない(真っ白の画面になる)
サイトごとにオリジナルテーマを選択する手間を省きたい場合は wp-config.php に、以下を記述して「標準テーマ」を変更する。
wp-config.php に追記
define('WP_DEFAULT_THEME', '標準にしたテーマ名');
インポート/エクスポート
インポート/エクスポートは、まずルートサイトで機能をインストールしてネットワークで有効化してから、それぞれのサイトごとに行う。
親サイトのパーマリンクの先頭に「blog」が入っているが、これを表示させないようにする方法。
まず、親サイトのパーマリンク設定を「デフォルト」に設定し、その後サイトネットワーク管理者メニューのサイトの編集の設定タブでパーマリンク設定を行う。
マルチサイトの場合、通常のサイトとはテーマの編集の位置が異なる。
header.php や footer.php ではなく functions.php で CSS や jQuery を読み込んで管理する例。
jQueryのロード
jQuery は WordPress のものではなく CDN から読み込み、そのほかに「base.js」、「jquery.magnific-popup.min.js」、「responsiveslides.min.js」をロードする例
functions.php
//jQueryのロード function add_my_scripts() { if(is_admin()) return; //管理画面にはスクリプトは追加しない(管理画面の条件分岐) wp_deregister_script( 'jquery'); //jQueryをCDNから読み込む wp_enqueue_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', array(), '1.10.2', false); wp_enqueue_script( 'jquery-mig', '//cdnjs.cloudflare.com/ajax/libs/jquery-migrate/1.2.1/jquery-migrate.min.js', array(), '1.2.1', false); wp_enqueue_script('base', //「base.js」をロード get_template_directory_uri(). '/js/base.js', array('jquery'), '20140513' ); wp_enqueue_script('mp', //「jquery.magnific-popup.min.js」をロード get_template_directory_uri(). '/js/jquery.magnific-popup.min.js', array('jquery'), '20140513' ); wp_enqueue_script('rs', //「responsiveslides.min.js」をロード get_template_directory_uri(). '/js/responsiveslides.min.js', array('jquery'), '20140513' ); } //add_action('wp_print_scripts', 'add_my_scripts'); Notice エラーがでる add_action('wp_enqueue_scripts', 'add_my_scripts');
訂正
上記の場合「wp_print_scripts」フックを使うとデバグモードでは Notice エラーが発生するので「wp_enqueue_scripts」フックを使うと良い。(2014年5月30日)
IE 用のスクリプトの読み込み
IE 用のスクリプト(html5shiv-printshiv.js, respond.min.js)は footer.php で読み込む。
footer.php
</div><!--/#footer--> <!--[if lt IE 9]> <script src="<?php echo get_template_directory_uri(); ?>/js/html5shiv-printshiv.js" type="text/javascript"> </script> <script src="<?php echo get_template_directory_uri(); ?>/js/respond.min.js" type="text/javascript"> </script> <![endif]--> </body> </html>
CSS のロード
header.php では読み込まず、functions.php で「style.css」、「font-awesome.min.css」、「magnific-popup.css」、「responsiveslides.css」を読み込む例。
functions.php
function register_style() { wp_register_style('style', get_template_directory_uri().'/css/style.css'); wp_register_style('fa', get_template_directory_uri().'/css/font-awesome.min.css'); wp_register_style('mp', get_template_directory_uri().'/css/magnific-popup.css'); wp_register_style('rs', get_template_directory_uri().'/css/responsiveslides.css'); } function add_stylesheet() { register_style(); wp_enqueue_style('style'); wp_enqueue_style('fa'); wp_enqueue_style('mp'); wp_enqueue_style('rs'); } //add_action('wp_print_styles', 'add_stylesheet'); こちらでも問題ないが以下でもOK add_action('wp_enqueue_scripts', 'add_stylesheet');
WordPress が出力するバージョンを削除する
CSS や jQuery のファイルのバージョンを表示させないようにする例。
functions.php
function remove_versions( $src ) { if( strpos( $src, '?ver=' ) ) $src = esc_url(remove_query_arg( 'ver', $src )); return $src; } add_filter( 'script_loader_src', 'remove_versions', 10, 2 ); add_filter( 'style_loader_src', 'remove_versions', 10, 2 );
lang 属性の指定と日本語・英語の切り替え用のリンクの出力の例。
この例の場合、ルートサイトを日本語、サブディレクトリに追加したサイト(/en)を英語としているので、ルートサイトかどうかで判定する。
「get_bloginfo(‘name’)」を使ってその戻り値(サイト名)で判定する。
ルートサイトのサイト名が「マイサイト」の場合以下のようにして判定できる。
<?php if((get_bloginfo('name') === 'マイサイト')) { //ルートサイトなら $is_root = true; $is_root = true; }else{ $is_root = false; } ?>
lang 属性の指定の例
訂正(2014年6月21日)
下記の方法でも「lang 属性」を出力できるが、正しくは「language_attributes()」を使うべき。
<!-- 間違った例 --> <html lang="<?php echo $is_root ? 'ja' : 'en'; ?>">
正しい方法
<html <?php language_attributes(); ?>>
リンクの出力は、「get_site_url(1)」でルートサイトのリンクを取得し、$is_root が真であれば、英語サイトへのリンク(/en)を出力し、そうでなければ日本語サイトへのリンクを出力する。
<a href="<?php echo get_site_url(1); ?><?php echo $is_root ? '/en' : '/'; ?>"><?php echo $is_root ? 'English' : 'Japanese'; ?></a>
各サイトのアドレスはテンプレートにおいて「home_url()」または「site_url()」で取得できる。
この例の場合、サブディレクトリ「/en」に追加したサイトの場合、取得されるアドレスは「http://xxxxxxx/en」になる。
サイトの ID を指定してアドレスを取得するには「get_home_url ($blog_id) 」または「get_site_url($blog_id)」でパラメータにサイトの ID を指定する。
home_url ($path, $scheme) / site_url($path, $scheme)関数
//現在のブログのホームURLを出力する <?php echo home_url( '/' ); ?> <?php echo site_url( '/' ); ?>
get_home_url ($blog_id, $path, $scheme) / get_site_url ($blog_id, $path, $scheme) 関数
//ブログ ID が 2 のホームURLを取得する <?php $blog_home = get_home_url( 2, '/' ); ?> <?php $blog_home = get_site_url( 2, '/' ); ?>
以下のいずれかで取得できる。($mysiteid に格納する例)
$mysiteid = $GLOBALS["blog_id"]; global $blog_id; $mysiteid = $blog_id; global $wpdb; $mysiteid = $wpdb->blogid; global $current_blog; $mysiteid = $current_blog->blog_id;
日本語のサイトの場合には、body にクラス「jp」を追加するには、functions.php に以下のように記述する。(日本語と英語のサイトで共通の CSS ファイルを使用する場合、日本語の文字サイズだけを変更したりする際等に利用できる。)
//body_classクラスに固定ページのスラッグを追加 add_filter('body_class', 'add_my_class'); function add_my_class($classes) { if((get_bloginfo('name') == 'マイサイト')) { $classes[] = 'jp'; } return $classes; }
サイトの言語設定によって出力する値を翻訳できるようにするため、翻訳リソースファイル(.po ファイル)と翻訳ファイル(.mo ファイル)を作成する場合の例。
以下のサイトが参考になります。
翻訳ファイルを用意してプラグインを日本語化する(WordPress Go Go )
poEdit で翻訳ファイルを作る(iDeasilo)
poEdit:翻訳ファイルを編集できるエディタ(Windows、Mac OS X、Linuxに対応)
「Poedit」は編集のみが可能なので、訳語を追加する場合は、
以下は ja.po の例。
# Translation of xxxxxx in Japanese msgid "" msgstr "" "PO-Revision-Date: 2014-05-17 12:47-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.6.5\n" "Project-Id-Version: xxxxxx2014\n" "POT-Creation-Date: \n" "Last-Translator: \n" "Language-Team: \n" "Language: ja\n" msgid "Contact" msgstr "お問い合わせ" msgid "Rules(Q&A)" msgstr "ご利用について(Q&A)"
functions.php に以下を記述(自分のテーマ内の「language」というフォルダに翻訳ファイルが保存されている場合の例)。
load_theme_textdomain( 'テーマ名',get_template_directory().'/language/');
(第一パラメータの「$domain」については、あまりよく理解できていなくて不明な点が多い)
Function Reference/load theme textdomain
翻訳テキストの表示
翻訳テキストを表示または返す関数:__()と_e()
第1引数:翻訳するメッセージ
第2引数:load_theme_textdomain()で指定したドメイン名(テーマ名?)。ドメインを指定しない場合は WordPress 本体の翻訳ファイルを参照するようになる。
__($message, $domain)
翻訳された$messageをreturnで返す(アンダーバーは2つ)
_e($message, $domain)
翻訳された$messageをechoで返す
サイトの言語設定が日本語の場合以下のように記述すると、先に ja.po に登録した翻訳”お問い合わせ”が表示される
<?php _e('Contact', 'ドメイン名(テーマ名?)'); ?>