265 lines
8.8 KiB
PHP
265 lines
8.8 KiB
PHP
<?php
|
|
|
|
use Duplicator\Libs\Snap\SnapDB;
|
|
use Duplicator\Libs\Snap\SnapIO;
|
|
use Duplicator\Libs\Snap\SnapURL;
|
|
use Duplicator\Libs\Snap\SnapWP;
|
|
|
|
class DUP_MU
|
|
{
|
|
public static function networkMenuPageUrl($menu_slug, $echo = true)
|
|
{
|
|
global $_parent_pages;
|
|
|
|
if (isset($_parent_pages[$menu_slug])) {
|
|
$parent_slug = $_parent_pages[$menu_slug];
|
|
if ($parent_slug && !isset($_parent_pages[$parent_slug])) {
|
|
$url = network_admin_url(add_query_arg('page', $menu_slug, $parent_slug));
|
|
} else {
|
|
$url = network_admin_url('admin.php?page=' . $menu_slug);
|
|
}
|
|
} else {
|
|
$url = '';
|
|
}
|
|
|
|
$url = esc_url($url);
|
|
|
|
if ($echo) {
|
|
echo esc_url($url);
|
|
}
|
|
|
|
return $url;
|
|
}
|
|
|
|
/**
|
|
* return multisite mode
|
|
* 0 = single site
|
|
* 1 = multisite subdomain
|
|
* 2 = multisite subdirectory
|
|
*
|
|
* @return int
|
|
*/
|
|
public static function getMode()
|
|
{
|
|
if (is_multisite()) {
|
|
if (defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL) {
|
|
return 1;
|
|
} else {
|
|
return 2;
|
|
}
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This function is wrong because it assumes that if the folder sites exist, blogs.dir cannot exist.
|
|
* This is not true because if the network is old but a new site is created after the WordPress update both blogs.dir and sites folders exist.
|
|
*
|
|
* @deprecated since version 3.8.4
|
|
*
|
|
* @return int
|
|
*/
|
|
public static function getGeneration()
|
|
{
|
|
if (self::getMode() == 0) {
|
|
return 0;
|
|
} else {
|
|
$sitesDir = WP_CONTENT_DIR . '/uploads/sites';
|
|
|
|
if (file_exists($sitesDir)) {
|
|
return 2;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $filteredSites
|
|
* @param array $filteredTables
|
|
* @param array $filteredPaths
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getSubsites($filteredSites = array(), $filteredTables = array(), $filteredPaths = array())
|
|
{
|
|
if (!is_multisite()) {
|
|
return array(
|
|
self::getSubsiteInfo(1, $filteredTables, $filteredPaths)
|
|
);
|
|
}
|
|
|
|
$site_array = array();
|
|
$filteredSites = is_array($filteredSites) ? $filteredSites : array();
|
|
|
|
DUP_Log::trace("NETWORK SITES");
|
|
|
|
foreach (SnapWP::getSitesIds() as $siteId) {
|
|
if (in_array($siteId, $filteredSites)) {
|
|
continue;
|
|
}
|
|
if (($siteInfo = self::getSubsiteInfo($siteId, $filteredTables, $filteredPaths)) == false) {
|
|
continue;
|
|
}
|
|
array_push($site_array, $siteInfo);
|
|
DUP_Log::trace("Multisite subsite detected. ID={$siteInfo->id} Domain={$siteInfo->domain} Path={$siteInfo->path} Blogname={$siteInfo->blogname}");
|
|
}
|
|
|
|
return $site_array;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param int $subsiteId
|
|
*
|
|
* @return stdClass|bool false on failure
|
|
*/
|
|
public static function getSubsiteInfoById($subsiteId)
|
|
{
|
|
if (!is_multisite()) {
|
|
$subsiteId = 1;
|
|
}
|
|
return self::getSubsiteInfo($subsiteId);
|
|
}
|
|
|
|
/**
|
|
* Get subsite info
|
|
*
|
|
* @param int $siteId
|
|
* @param array $filteredTables
|
|
* @param array|false $filteredPaths return
|
|
*
|
|
* @return stdClass|bool false on failure
|
|
*/
|
|
public static function getSubsiteInfo($siteId = 1, $filteredTables = array(), $filteredPaths = array())
|
|
{
|
|
if (is_multisite()) {
|
|
if (($siteDetails = get_blog_details($siteId)) == false) {
|
|
return false;
|
|
}
|
|
} else {
|
|
$siteId = 1;
|
|
$siteDetails = new stdClass();
|
|
$home = DUP_Archive::getOriginalUrls('home');
|
|
$parsedHome = SnapURL::parseUrl($home);
|
|
$siteDetails->domain = $parsedHome['host'];
|
|
$siteDetails->path = trailingslashit($parsedHome['path']);
|
|
$siteDetails->blogname = sanitize_text_field(get_option('blogname'));
|
|
}
|
|
|
|
$subsiteID = $siteId;
|
|
$siteInfo = new stdClass();
|
|
$siteInfo->id = $subsiteID;
|
|
$siteInfo->domain = $siteDetails->domain;
|
|
$siteInfo->path = $siteDetails->path;
|
|
$siteInfo->blogname = $siteDetails->blogname;
|
|
$siteInfo->blog_prefix = $GLOBALS['wpdb']->get_blog_prefix($subsiteID);
|
|
if (count($filteredTables) > 0) {
|
|
$siteInfo->filteredTables = array_values(array_intersect(self::getSubsiteTables($subsiteID), $filteredTables));
|
|
} else {
|
|
$siteInfo->filteredTables = array();
|
|
}
|
|
$siteInfo->adminUsers = SnapWP::getAdminUserLists($siteInfo->id);
|
|
$siteInfo->fullHomeUrl = get_home_url($siteId);
|
|
$siteInfo->fullSiteUrl = get_site_url($siteId);
|
|
|
|
if ($siteId > 1) {
|
|
switch_to_blog($siteId);
|
|
}
|
|
|
|
$uploadData = wp_upload_dir();
|
|
$uploadPath = $uploadData['basedir'];
|
|
$siteInfo->uploadPath = SnapIO::getRelativePath($uploadPath, DUP_Archive::getTargetRootPath(), true);
|
|
$siteInfo->fullUploadPath = untrailingslashit($uploadPath);
|
|
$siteInfo->fullUploadSafePath = SnapIO::safePathUntrailingslashit($uploadPath);
|
|
$siteInfo->fullUploadUrl = $uploadData['baseurl'];
|
|
if (count($filteredPaths)) {
|
|
$globalDirFilters = apply_filters('duplicator_global_file_filters', $GLOBALS['DUPLICATOR_GLOBAL_FILE_FILTERS']);
|
|
$siteInfo->filteredPaths = array_values(array_filter($filteredPaths, function ($path) use ($uploadPath, $subsiteID, $globalDirFilters) {
|
|
if (
|
|
($relativeUpload = SnapIO::getRelativePath($path, $uploadPath)) === false ||
|
|
in_array($path, $globalDirFilters)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
if ($subsiteID > 1) {
|
|
return true;
|
|
} else {
|
|
// no check on blogs.dir because in wp-content/blogs.dir not in upload folder
|
|
return !(strpos($relativeUpload, 'sites') === 0);
|
|
}
|
|
}));
|
|
} else {
|
|
$siteInfo->filteredPaths = array();
|
|
}
|
|
|
|
if ($siteId > 1) {
|
|
restore_current_blog();
|
|
}
|
|
return $siteInfo;
|
|
}
|
|
|
|
/**
|
|
* @param int $subsiteID
|
|
*
|
|
* @return array List of tables belonging to subsite
|
|
*/
|
|
public static function getSubsiteTables($subsiteID)
|
|
{
|
|
/** @var \wpdb $wpdb */
|
|
global $wpdb;
|
|
|
|
$basePrefix = $wpdb->base_prefix;
|
|
$subsitePrefix = $wpdb->get_blog_prefix($subsiteID);
|
|
|
|
$sharedTables = array(
|
|
$basePrefix . 'users',
|
|
$basePrefix . 'usermeta'
|
|
);
|
|
$multisiteOnlyTables = array(
|
|
$basePrefix . 'blogmeta',
|
|
$basePrefix . 'blogs',
|
|
$basePrefix . 'blog_versions',
|
|
$basePrefix . 'registration_log',
|
|
$basePrefix . 'signups',
|
|
$basePrefix . 'site',
|
|
$basePrefix . 'sitemeta'
|
|
);
|
|
|
|
$subsiteTables = array();
|
|
$sql = "";
|
|
$dbnameSafe = esc_sql(DB_NAME);
|
|
|
|
if ($subsiteID != 1) {
|
|
$regex = '^' . SnapDB::quoteRegex($subsitePrefix);
|
|
$regexpSafe = esc_sql($regex);
|
|
|
|
$sharedTablesSafe = "'" . implode(
|
|
"', '",
|
|
esc_sql($sharedTables)
|
|
) . "'";
|
|
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$dbnameSafe' AND ";
|
|
$sql .= "(TABLE_NAME REGEXP '$regexpSafe' OR TABLE_NAME IN ($sharedTablesSafe))";
|
|
} else {
|
|
$regexMain = '^' . SnapDB::quoteRegex($basePrefix);
|
|
$regexpMainSafe = esc_sql($regexMain);
|
|
$regexNotSub = '^' . SnapDB::quoteRegex($basePrefix) . '[0-9]+_';
|
|
$regexpNotSubSafe = esc_sql($regexNotSub);
|
|
|
|
$multisiteOnlyTablesSafe = "'" . implode(
|
|
"', '",
|
|
esc_sql($multisiteOnlyTables)
|
|
) . "'";
|
|
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$dbnameSafe' AND ";
|
|
$sql .= "TABLE_NAME REGEXP '$regexpMainSafe' AND ";
|
|
$sql .= "TABLE_NAME NOT REGEXP '$regexpNotSubSafe' AND ";
|
|
$sql .= "TABLE_NAME NOT IN ($multisiteOnlyTablesSafe)";
|
|
}
|
|
$subsiteTables = $wpdb->get_col($sql);
|
|
return $subsiteTables;
|
|
}
|
|
}
|