下記のような構成でWordPressでマルチサイトを設置しました。
サイト構成
/site-root <- サイトのルートのディレクトリ |- .htaccess |- index.php |- /wordpress <- WordPress本体 |- wp-config.php
メインサイトの管理画面のURLは example.com/wordpress/wp-admin/
です。
管理画面からマルチサイトをコントロールする「サイトネットワークの管理」にアクセスすると...
URLが example.com/wp-admin/network/
になりました。
WordPress本体が /wordpress
にあるので、example.com/wordpress/wp-admin/network/
でないのがとても気持ち悪いです...
試しに example.com/wordpress/wp-admin/network/
でアクセスした所問題なくネットワークの管理画面が表示されており、
新規サイト作成のフォームのPOST先もこちらで問題なく動作しているようでした。 (見落としがあるかもしれません)
検索してみると同じような質問(Multisite network admin – URL / redirect error - WordPress Development Stack Exchange)が出ていましたが、解決方法は載っておらず...
WordPressのネットワーク管理画面のコアファイル(/wp-admin/network
)でネットワーク管理画面関連のURLを出力している部分を調べてみた所、network_site_urlという関数を使ってネットワーク管理画面のURLを作成しているようでした。
このnetwork_site_url
関数が定義されているコードを調べた所 network_site_url
フィルターが使用できることが解りました。
network_site_url フィルターを使ってネットワーク管理画面のURLを置き換える
テーマにかかわらず常に実行してほしいのとWordPressのアップデート時に巻き戻ってしまっては困るので wp-config.php
にフィルターを設置して、ネットワーク管理画面のURLを変更するようにします。
/wordpress/wp-config.php
の最下部WordPressの設定を読み込んでいるrequire_once(ABSPATH . 'wp-settings.php');
の下にフィルターを追記します。
<?php //wp-config.php /** Sets up WordPress vars and included files. */ require_once(ABSPATH . 'wp-settings.php'); // ▼ ネットワーク管理画面のURLを変更するフィルター ▼ // Wordpressのディレクトリ define('__WORDPRESS_CORE_DIR__', '/wordpress'); // ネットワーク管理画面のURLを上書き add_filter('network_admin_url', 'rewrite_my_network_admin_url', 10, 2); function rewrite_my_network_admin_url($url, $path) { $networkPath = str_replace( '/wp-admin/', __WORDPRESS_CORE_DIR__ . '/wp-admin/', $url ); return $networkPath; }
これでネットワークの管理画面はexample.com/wordpress/wp-admin/network/
になり、管理画面内からのリンクやフォームのPOST先のURLもwordpress
ディレクトリがある状態にすることができました!
WordPressの関数やフィルターを利用するコードを require_once(ABSPATH . 'wp-settings.php');
より上に書いてしまうとエラーになってしまうので、必ずwp-settings.php
の読み込みより下に記述しなければならないようです。
本当は.htaccess
のRewriteRuleで書き換えたほうがスマートなのだと思うのですが、マルチサイトにした状態で上手くネットワーク管理画面関連だけのURLを書き換える技術力が今野私に無かったので、フィルターで出力自体を変更してしますというパワープレイに出ているので、とてもバッドノウハウな気がしてます。
現状確認できる範囲では問題なく動作しているようですが、何か不具合がある可能性は否めません。
そして、サブサイトを作成すると管理画面のURLは example.com/<sub-site>/wp-admin/
になってしまうので、WordPressのマルチサイトはそもそもサイト直下に直接WordPressのコアファイルを展開して使用する想定になってるっぽいなと思いました。
良い解決方法があればお待ちしています。
[参考]
<?php // /wp-includes/link-template.php#L3256 function network_site_url( $path = '', $scheme = null ) { if ( ! is_multisite() ) return site_url($path, $scheme); $current_network = get_network(); if ( 'relative' == $scheme ) $url = $current_network->path; else $url = set_url_scheme( 'http://' . $current_network->domain . $current_network->path, $scheme ); if ( $path && is_string( $path ) ) $url .= ltrim( $path, '/' ); /** * Filters the network site URL. * * @since 3.0.0 * * @param string $url The complete network site URL including scheme and path. * @param string $path Path relative to the network site URL. Blank string if * no path is specified. * @param string|null $scheme Scheme to give the URL context. Accepts 'http', 'https', * 'relative' or null. */ return apply_filters( 'network_site_url', $url, $path, $scheme ); }
出典: https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/link-template.php#L3256
- Multisite network admin – URL / redirect error - WordPress Development Stack Exchange
- network_site_url() | Function | WordPress Developer Resources
- https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/link-template.php#L3256

- 作者: pha
- 出版社/メーカー: 大和書房
- 発売日: 2017/12/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る