こんにちは!ウェブサバイバー運営のYeah-Manです!先日マルチサイト構築で実際にあった事案なのですが、『WordPressでマルチサイト化をした際、子サイトでメディアを登録してもメディア画像が表示されないという現象』が発生しました。最終的には解決したのですが、その解決方法についての備忘録です!ニッチすぎるのでケースとしてはないかもしれませんが、なんでもログを取るというのは大事だと思ったので記事にしました!

それではいってましょー!!!

その時の状況整理と、発生した内容の紹介

まずは状況を整理し、実際に発生した内容を紹介していきたいと思います。
順番にご紹介していきますね!

マルチサイト要件

この時作成したマルチサイトは以下のような要件でした。

  1. 多言語サイトで日本語を親ブログ、英語を子ブログとして作成
  2. サブディレクトリ運用
  3. 特殊要件はなく、デフォルトのマルチサイトでOK

そんな特殊な要件はないものでした。

作成手順

日本語サイトはすでに出来上がっていましたので、wp-config.phpへ『define(‘WP_ALLOW_MULTISITE’, true);』を記述。
通常通りサイトネットワークを有効化します。有効化時のhtaccess等はサイトネットワーク有効化時のものをコピペで利用しました。

次に英語のコンテンツですが、以下手順で考えていました。
1. ネットワークにプラグイン『NS Cloner』を追加
2. そのままNS Clonerを使って日本語サイトをマルっとコピー
3. 中身を書き換えていく

NS Clonerとはマルチサイトを作成する時、サイトをマルっとコピーしてくれる便利プラグインで、今回は日本語サイトにコンテンツがたくさんあったため、利用させていただいた次第です。

で、そのまま『よぉ〜し。あとは中身を書き換えてくぞぉ〜』ということで気にせず作業を続行していきます。

事件発生

さて、構築も終わって英語版だけ画像を差し替える箇所があったため、修正した該当画像をメディアに新規登録して差し替え、画面を確認したところで気がつきました。

『あれ?画像が出ない』

imgのパスを確認したところ、『wp-content/uploads/sites/子ブログID/2021/02/』ではなく『/子ブログのサブディレクトリ名/files/2021/02』になっていました。

そんな設定をした記憶はないのですが、ディレクトリを確認しても『/子ブログのサブディレクトリ名/files/』なんてディレクトリは存在しません。
代わりにwp-content/直下に『blogs.dir』という見慣れないディレクトリが。。。

blogs.dirの様子

どのように解決したか

まずは検索して調べていくと処理の順番を調べて記事にされているブログを発見!そちらの情報を頼りにファイルを追いかけて行きました。

wp-includes内『ms-default-constants.php』でそれっぽい処理を発見

該当ファイルの10行目〜44行目でどうもそれっぽい処理を発見。27行目から41行目あたりでUPLOADBLOGSDIRというuploadsのフォルダパスを入れる定数へ『blogs.dir』を挿入したりと処理をしています。22行目にget_site_optionで『ms_files_rewriting』が存在しなかったらreturnで以降の処理をスキップという形になっており、このms_files_rewitingって行がデータベースのテーブルにあるか早速調査してみました。

該当ソースは以下です。


/**
 * Defines Multisite upload constants.
 *
 * Exists for backward compatibility with legacy file-serving through
 * wp-includes/ms-files.php (wp-content/blogs.php in MU).
 *
 * @since 3.0.0
 */
function ms_upload_constants() {
	// This filter is attached in ms-default-filters.php but that file is not included during SHORTINIT.
	add_filter( 'default_site_option_ms_files_rewriting', '__return_true' );

	if ( ! get_site_option( 'ms_files_rewriting' ) ) { 
		return;
	}

	// Base uploads dir relative to ABSPATH.
	if ( ! defined( 'UPLOADBLOGSDIR' ) ) {
		define( 'UPLOADBLOGSDIR', 'wp-content/blogs.dir' );
	}

	// Note, the main site in a post-MU network uses wp-content/uploads.
	// This is handled in wp_upload_dir() by ignoring UPLOADS for this case.
	if ( ! defined( 'UPLOADS' ) ) {
		$site_id = get_current_blog_id();

		define( 'UPLOADS', UPLOADBLOGSDIR . '/' . $site_id . '/files/' );

		// Uploads dir relative to ABSPATH.
		if ( 'wp-content/blogs.dir' === UPLOADBLOGSDIR && ! defined( 'BLOGUPLOADDIR' ) ) {
			define( 'BLOGUPLOADDIR', WP_CONTENT_DIR . '/blogs.dir/' . $site_id . '/files/' );
		}
	}
}

過去に作成したマルチサイトと比較して、どうも該当はwp_sitemetaのms_files_rewriting

調査した結果、今回作成したマルチサイトには該当の行自体存在せず。過去に作成したマルチサイトにはありました!というわけで早速phpMyAdminを使って行を追加!値を0に設定しました!

※上記はテーブルに行を足して追記した時の様子

結果、無事解決しました!

これでメディアへ画像を登録してみたところ、無事解決されているのを確認できました!
ふぃーーーーー!あぶないあぶない!

はじめてのケースでしたので、一時は『どうしたもんかねぇぇ。。。。』と焦りましたw

WordPressのマルチサイトは便利だけど癖があるので要注意

さて、ここまで記事にしてみましたが、改めて呼んでも根本の原因で思い当たる箇所が『NS Cloner』による複製しか思いつかないのですが、はっきりとしたことはわかりません。