WordPressマルチサイトにおいて、WordPress関数を外から呼び出す時のエラー回避方法

  • WordPress

wp-load.phpwp-blog-header.php でWordPressの関数を読み込もうとした時に、マルチサイト化していると「データベース接続エラー」になってしまい WordPress が動きませんでした。

原因

データベーステーブル wp_blogs のパスと、現在アクセスしているページの$_SERVER['REQUEST_URI']が違うことで発生していました。
現在アクセスしているブログ(current blog)が判定できなくなりデータベースに接続できなくなるようです。

解決策

例として、ウェブルートの index.php でWordPress関数を使いたい、しかしWordPress が/wpディレクトリにインストールされている時を想定して解説していきます。

まず確認

WordPress マルチサイトの設定が書かれているコアファイル、/wp_include/ms_settings.phpを見てみると下記のような記述がありました。

if ( defined( 'SUNRISE' ) ) {
 include_once( WP_CONTENT_DIR . '/sunrise.php' );
} 

どうやら、定数SUNRISEを設定して、/wp-content 内に sunrise.php を置いておくと sunrise.php で設定を上書きできるようです。こちらのファイルは通常存在しないファイルなので、自分で作成しましょう。

ファイルの作成とコードの追記

(1)/wp_content/sunrise.php

sunrise.php に下記コードを追記します。

<?php
    $current_site = new stdClass;
    $current_site->id     = SUNRISE_SITE_ID;
    $current_site->domain = SUNRISE_SITE_DOMAIN;
    $current_site->path   = SUNRISE_SITE_PATH;
 
    $current_blog = get_site_by_path( $current_site->domain, $current_site->path ); 

(2)/index.php (関数を読み込みたいファイル)

<?php 
 
define('WP_USE_THEMES', false);
 
//sunrise.php用の定義
define('SUNRISE_SITE_DOMAIN', $_SERVER['HTTP_HOST']); //ドメイン
define('SUNRISE_SITE_ID', 1); //読み込みたいブログID
define('SUNRISE_SITE_PATH', '/wp/'); //wordpressフォルダのパス
 
//sunrise.phpの読み込みを有効化
define('SUNRISE', true);
 
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
 
?> 

こちらで index.php の方で WordPress 関数を呼び出すことができました。読み込みたいブログID、WordPressフォルダパスは環境にあわせて変更してください。