コード例 #1
0
 /**
  * @ticket 27003
  */
 function test_get_network_by_path()
 {
     global $wpdb;
     $ids = array('wordpress.org/' => array('domain' => 'wordpress.org', 'path' => '/'), 'wordpress.org/one/' => array('domain' => 'wordpress.org', 'path' => '/one/'), 'wordpress.net/' => array('domain' => 'wordpress.net', 'path' => '/'), 'www.wordpress.net/' => array('domain' => 'www.wordpress.net', 'path' => '/'), 'www.wordpress.net/two/' => array('domain' => 'www.wordpress.net', 'path' => '/two/'), 'wordpress.net/three/' => array('domain' => 'wordpress.net', 'path' => '/three/'));
     foreach ($ids as &$id) {
         $id = self::factory()->network->create($id);
     }
     unset($id);
     $this->assertEquals($ids['www.wordpress.net/'], get_network_by_path('www.wordpress.net', '/notapath/')->id);
     $this->assertEquals($ids['www.wordpress.net/two/'], get_network_by_path('www.wordpress.net', '/two/')->id);
     // This should find /one/ despite the www.
     $this->assertEquals($ids['wordpress.org/one/'], get_network_by_path('www.wordpress.org', '/one/')->id);
     // This should not find /one/ because the domains don't match.
     $this->assertEquals($ids['wordpress.org/'], get_network_by_path('site1.wordpress.org', '/one/')->id);
     $this->assertEquals($ids['wordpress.net/three/'], get_network_by_path('wordpress.net', '/three/')->id);
     $this->assertEquals($ids['wordpress.net/'], get_network_by_path('wordpress.net', '/notapath/')->id);
     $this->assertEquals($ids['wordpress.net/'], get_network_by_path('site1.wordpress.net', '/notapath/')->id);
     $this->assertEquals($ids['wordpress.net/'], get_network_by_path('site1.wordpress.net', '/three/')->id);
 }
コード例 #2
0
     if (empty($current_site)) {
         ms_not_installed();
     } elseif ($path === $current_site->path) {
         $current_blog = get_site_by_path($domain, $path);
     } else {
         // Search the network path + one more path segment (on top of the network path).
         $current_blog = get_site_by_path($domain, $path, substr_count($current_site->path, '/'));
     }
 } else {
     // Find the site by the domain and at most the first path segment.
     $current_blog = get_site_by_path($domain, $path, 1);
     if ($current_blog) {
         $current_site = wp_get_network($current_blog->site_id ? $current_blog->site_id : 1);
     } else {
         // If you don't have a site with the same domain/path as a network, you're pretty screwed, but:
         $current_site = get_network_by_path($domain, $path, 1);
     }
 }
 // The network declared by the site trumps any constants.
 if ($current_blog && $current_blog->site_id != $current_site->id) {
     $current_site = wp_get_network($current_blog->site_id);
 }
 // No network has been found, bail.
 if (empty($current_site)) {
     ms_not_installed();
 }
 // @todo Investigate when exactly this can occur.
 if (empty($current_blog) && defined('WP_INSTALLING')) {
     $current_blog = new stdClass();
     $current_blog->blog_id = $blog_id = 1;
 }
コード例 #3
0
/**
 * Add a new network
 *
 * @since 1.3
 *
 * @param array $args  {
 *     Array of arguments.
 *     @type string  $domain           Domain name for new network - for VHOST=no,
 *                                     this should be FQDN, otherwise domain only.
 *     @type string  $path             Path to root of network hierarchy - should
 *                                     be '/' unless WP is cohabiting with another
 *                                     product on a domain.
 *     @type string  $site_name        Name of the root blog to be created on
 *                                     the new network.
 *     @type integer $user_id          ID of the user to add as the site owner.
 *                                     Defaults to current user ID.
 *     @type array   $meta             Array of metadata to save to this network.
 *                                     Defaults to array( 'public' => false ).
 *     @type integer $clone_network    ID of network whose networkmeta values are
 *                                     to be copied - default NULL.
 *     @type array   $options_to_clone Override default network meta options to copy
 *                                     when cloning - default NULL.
 * }
 *
 * @return integer ID of newly created network
 */
function add_network($args = array())
{
    global $wpdb;
    // Backward compatibility with old method of passing arguments
    if (!is_array($args) || func_num_args() > 1) {
        _deprecated_argument(__METHOD__, '1.7.0', sprintf(__('Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'wp-multi-network'), __METHOD__, __FILE__));
        // Juggle function parameters
        $func_args = func_get_args();
        $old_args_keys = array(0 => 'domain', 1 => 'path', 2 => 'site_name', 3 => 'clone_network', 4 => 'options_to_clone');
        // Reset array
        $args = array();
        // Rejig args
        foreach ($old_args_keys as $arg_num => $arg_key) {
            if (isset($func_args[$arg_num])) {
                $args[$arg_key] = $func_args[$arg_num];
            }
        }
    }
    // Parse args
    $r = wp_parse_args($args, array('domain' => '', 'path' => '/', 'site_name' => __('New Network', 'wp-multi-network'), 'user_id' => get_current_user_id(), 'meta' => array('public' => get_option('blog_public', false)), 'clone_network' => false, 'options_to_clone' => array_keys(network_options_to_copy())));
    // Bail if no user with this ID
    if (empty($r['user_id']) || !get_userdata($r['user_id'])) {
        return new WP_Error('network_user', __('User does not exist.', 'wp-multi-network'));
    }
    // Permissive sanitization for super admin usage
    $r['domain'] = str_replace(' ', '', strtolower($r['domain']));
    $r['path'] = str_replace(' ', '', strtolower($r['path']));
    // Check for existing network
    $network = get_network_by_path($r['domain'], $r['path']);
    if (!empty($network)) {
        return new WP_Error('network_exists', __('Network already exists.', 'wp-multi-network'));
    }
    // Insert new network
    $wpdb->insert($wpdb->site, array('domain' => $r['domain'], 'path' => $r['path']));
    $new_network_id = $wpdb->insert_id;
    // If network was created, create a blog for it too
    if (!empty($new_network_id)) {
        if (!defined('WP_INSTALLING')) {
            define('WP_INSTALLING', true);
        }
        // Create the site for the root of this network
        $new_blog_id = wpmu_create_blog($r['domain'], $r['path'], $r['site_name'], $r['user_id'], $r['meta'], $new_network_id);
        // Bail if blog could not be created
        if (is_a($new_blog_id, 'WP_Error')) {
            return $new_blog_id;
        }
        /**
         * Fix upload_path for main sites on secondary networks
         * This applies only to new installs (WP 3.5+)
         */
        // Switch to main network (if it exists)
        if (defined('SITE_ID_CURRENT_SITE') && wp_get_network(SITE_ID_CURRENT_SITE)) {
            switch_to_network(SITE_ID_CURRENT_SITE);
            $use_files_rewriting = get_site_option('ms_files_rewriting');
            restore_current_network();
        } else {
            $use_files_rewriting = get_site_option('ms_files_rewriting');
        }
        global $wp_version;
        // Create the upload_path and upload_url_path values
        if (!$use_files_rewriting && version_compare($wp_version, '3.7', '<')) {
            // WP_CONTENT_URL is locked to the current site and can't be overridden,
            //  so we have to replace the hostname the hard way
            $current_siteurl = get_option('siteurl');
            $new_siteurl = untrailingslashit(get_blogaddress_by_id($new_blog_id));
            $upload_url = str_replace($current_siteurl, $new_siteurl, WP_CONTENT_URL);
            $upload_url = $upload_url . '/uploads';
            $upload_dir = WP_CONTENT_DIR;
            if (0 === strpos($upload_dir, ABSPATH)) {
                $upload_dir = substr($upload_dir, strlen(ABSPATH));
            }
            $upload_dir .= '/uploads';
            if (defined('MULTISITE')) {
                $ms_dir = '/sites/' . $new_blog_id;
            } else {
                $ms_dir = '/' . $new_blog_id;
            }
            $upload_dir .= $ms_dir;
            $upload_url .= $ms_dir;
            update_blog_option($new_blog_id, 'upload_path', $upload_dir);
            update_blog_option($new_blog_id, 'upload_url_path', $upload_url);
        }
    }
    // Clone the network meta from an existing network
    if (!empty($r['clone_network']) && wp_get_network($r['clone_network'])) {
        $options_cache = array();
        // Old network
        switch_to_network($r['clone_network']);
        foreach ($r['options_to_clone'] as $option) {
            $options_cache[$option] = get_site_option($option);
        }
        restore_current_network();
        // New network
        switch_to_network($new_network_id);
        foreach ($r['options_to_clone'] as $option) {
            if (isset($options_cache[$option])) {
                // Fix for bug that prevents writing the ms_files_rewriting
                // value for new networks.
                if ('ms_files_rewriting' === $option) {
                    $wpdb->insert($wpdb->sitemeta, array('site_id' => $wpdb->siteid, 'meta_key' => $option, 'meta_value' => $options_cache[$option]));
                } else {
                    add_site_option($option, $options_cache[$option]);
                }
            }
        }
        unset($options_cache);
        restore_current_network();
    }
    do_action('add_network', $new_network_id);
    return $new_network_id;
}
コード例 #4
0
ファイル: testcase.php プロジェクト: jasonmcalpin/BuddyPress
 function go_to($url)
 {
     global $wpdb;
     global $current_site, $current_blog, $blog_id, $switched, $_wp_switched_stack, $public, $table_prefix, $current_user, $wp_roles;
     // note: the WP and WP_Query classes like to silently fetch parameters
     // from all over the place (globals, GET, etc), which makes it tricky
     // to run them more than once without very carefully clearing everything
     $_GET = $_POST = array();
     foreach (array('query_string', 'id', 'postdata', 'authordata', 'day', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages', 'pagenow') as $v) {
         if (isset($GLOBALS[$v])) {
             unset($GLOBALS[$v]);
         }
     }
     $parts = parse_url($url);
     if (isset($parts['scheme'])) {
         // set the HTTP_HOST
         $GLOBALS['_SERVER']['HTTP_HOST'] = $parts['host'];
         $req = $parts['path'];
         if (isset($parts['query'])) {
             $req .= '?' . $parts['query'];
             // parse the url query vars into $_GET
             parse_str($parts['query'], $_GET);
         }
     } else {
         $req = $url;
     }
     if (!isset($parts['query'])) {
         $parts['query'] = '';
     }
     // Scheme
     if (0 === strpos($req, '/wp-admin') && force_ssl_admin()) {
         $_SERVER['HTTPS'] = 'on';
     } else {
         unset($_SERVER['HTTPS']);
     }
     // Set this for bp_core_set_uri_globals()
     $GLOBALS['_SERVER']['REQUEST_URI'] = $req;
     unset($_SERVER['PATH_INFO']);
     // setup $current_site and $current_blog globals for multisite based on
     // REQUEST_URI; mostly copied from /wp-includes/ms-settings.php
     if (is_multisite()) {
         $current_blog = $current_site = $blog_id = null;
         $domain = addslashes($_SERVER['HTTP_HOST']);
         if (false !== strpos($domain, ':')) {
             if (substr($domain, -3) == ':80') {
                 $domain = substr($domain, 0, -3);
                 $_SERVER['HTTP_HOST'] = substr($_SERVER['HTTP_HOST'], 0, -3);
             } elseif (substr($domain, -4) == ':443') {
                 $domain = substr($domain, 0, -4);
                 $_SERVER['HTTP_HOST'] = substr($_SERVER['HTTP_HOST'], 0, -4);
             }
         }
         $path = stripslashes($_SERVER['REQUEST_URI']);
         // Get a cleaned-up version of the wp_version string
         // (strip -src, -alpha, etc which may trip up version_compare())
         $wp_version = (double) $GLOBALS['wp_version'];
         if (version_compare($wp_version, '4.4', '>=')) {
             if (!($current_site = wp_cache_get('current_network', 'site-options'))) {
                 // Are there even two networks installed?
                 $one_network = $wpdb->get_row("SELECT * FROM {$wpdb->site} LIMIT 2");
                 // [sic]
                 if (1 === $wpdb->num_rows) {
                     $current_site = new WP_Network($one_network);
                     wp_cache_add('current_network', $current_site, 'site-options');
                 } elseif (0 === $wpdb->num_rows) {
                     ms_not_installed($domain, $path);
                 }
             }
             if (empty($current_site)) {
                 $current_site = WP_Network::get_by_path($domain, $path, 1);
             }
             // The network declared by the site trumps any constants.
             if ($current_blog && $current_blog->site_id != $current_site->id) {
                 $current_site = WP_Network::get_instance($current_blog->site_id);
             }
             if (empty($current_site)) {
                 do_action('ms_network_not_found', $domain, $path);
                 ms_not_installed($domain, $path);
             } elseif ($path === $current_site->path) {
                 $current_blog = get_site_by_path($domain, $path);
             } else {
                 // Search the network path + one more path segment (on top of the network path).
                 $current_blog = get_site_by_path($domain, $path, substr_count($current_site->path, '/'));
             }
             // Figure out the current network's main site.
             if (empty($current_site->blog_id)) {
                 if ($current_blog->domain === $current_site->domain && $current_blog->path === $current_site->path) {
                     $current_site->blog_id = $current_blog->blog_id;
                 } elseif (!($current_site->blog_id = wp_cache_get('network:' . $current_site->id . ':main_site', 'site-options'))) {
                     $current_site->blog_id = $wpdb->get_var($wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s", $current_site->domain, $current_site->path));
                     wp_cache_add('network:' . $current_site->id . ':main_site', $current_site->blog_id, 'site-options');
                 }
             }
             $blog_id = $current_blog->blog_id;
             $public = $current_blog->public;
             if (empty($current_blog->site_id)) {
                 // This dates to [MU134] and shouldn't be relevant anymore,
                 // but it could be possible for arguments passed to insert_blog() etc.
                 $current_blog->site_id = 1;
             }
             $site_id = $current_blog->site_id;
             wp_load_core_site_options($site_id);
         } elseif (version_compare($wp_version, '3.9', '>=')) {
             if (is_admin()) {
                 $path = preg_replace('#(.*)/wp-admin/.*#', '$1/', $path);
             }
             list($path) = explode('?', $path);
             // Are there even two networks installed?
             $one_network = $wpdb->get_row("SELECT * FROM {$wpdb->site} LIMIT 2");
             // [sic]
             if (1 === $wpdb->num_rows) {
                 $current_site = wp_get_network($one_network);
             } elseif (0 === $wpdb->num_rows) {
                 ms_not_installed();
             }
             if (empty($current_site)) {
                 $current_site = get_network_by_path($domain, $path, 1);
             }
             if (empty($current_site)) {
                 ms_not_installed();
             } elseif ($path === $current_site->path) {
                 $current_blog = get_site_by_path($domain, $path);
             } else {
                 // Search the network path + one more path segment (on top of the network path).
                 $current_blog = get_site_by_path($domain, $path, substr_count($current_site->path, '/'));
             }
             // The network declared by the site trumps any constants.
             if ($current_blog && $current_blog->site_id != $current_site->id) {
                 $current_site = wp_get_network($current_blog->site_id);
             }
             // If we don't have a network by now, we have a problem.
             if (empty($current_site)) {
                 ms_not_installed();
             }
             // @todo What if the domain of the network doesn't match the current site?
             $current_site->cookie_domain = $current_site->domain;
             if ('www.' === substr($current_site->cookie_domain, 0, 4)) {
                 $current_site->cookie_domain = substr($current_site->cookie_domain, 4);
             }
             // Figure out the current network's main site.
             if (!isset($current_site->blog_id)) {
                 if ($current_blog && $current_blog->domain === $current_site->domain && $current_blog->path === $current_site->path) {
                     $current_site->blog_id = $current_blog->blog_id;
                 } else {
                     // @todo we should be able to cache the blog ID of a network's main site easily.
                     $current_site->blog_id = $wpdb->get_var($wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s", $current_site->domain, $current_site->path));
                 }
             }
             $blog_id = $current_blog->blog_id;
             $public = $current_blog->public;
             if (empty($current_blog->site_id)) {
                 // This dates to [MU134] and shouldn't be relevant anymore,
                 // but it could be possible for arguments passed to insert_blog() etc.
                 $current_blog->site_id = 1;
             }
             $site_id = $current_blog->site_id;
             wp_load_core_site_options($site_id);
             // Pre WP 3.9
         } else {
             $domain = rtrim($domain, '.');
             $cookie_domain = $domain;
             if (substr($cookie_domain, 0, 4) == 'www.') {
                 $cookie_domain = substr($cookie_domain, 4);
             }
             $path = preg_replace('|([a-z0-9-]+.php.*)|', '', $GLOBALS['_SERVER']['REQUEST_URI']);
             $path = str_replace('/wp-admin/', '/', $path);
             $path = preg_replace('|(/[a-z0-9-]+?/).*|', '$1', $path);
             $GLOBALS['current_site'] = wpmu_current_site();
             if (!isset($GLOBALS['current_site']->blog_id) && !empty($GLOBALS['current_site'])) {
                 $GLOBALS['current_site']->blog_id = $wpdb->get_var($wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s", $GLOBALS['current_site']->domain, $GLOBALS['current_site']->path));
             }
             $blogname = htmlspecialchars(substr($GLOBALS['_SERVER']['REQUEST_URI'], strlen($path)));
             if (false !== strpos($blogname, '/')) {
                 $blogname = substr($blogname, 0, strpos($blogname, '/'));
             }
             if (false !== strpos($blogname, '?')) {
                 $blogname = substr($blogname, 0, strpos($blogname, '?'));
             }
             $reserved_blognames = array('page', 'comments', 'blog', 'wp-admin', 'wp-includes', 'wp-content', 'files', 'feed');
             if ($blogname != '' && !in_array($blogname, $reserved_blognames) && !is_file($blogname)) {
                 $path .= $blogname . '/';
             }
             $GLOBALS['current_blog'] = get_blog_details(array('domain' => $domain, 'path' => $path), false);
             unset($reserved_blognames);
             if ($GLOBALS['current_site'] && !$GLOBALS['current_blog']) {
                 $GLOBALS['current_blog'] = get_blog_details(array('domain' => $GLOBALS['current_site']->domain, 'path' => $GLOBALS['current_site']->path), false);
             }
             $GLOBALS['blog_id'] = $GLOBALS['current_blog']->blog_id;
         }
         // Emulate a switch_to_blog()
         $table_prefix = $wpdb->get_blog_prefix($current_blog->blog_id);
         $wpdb->set_blog_id($current_blog->blog_id, $current_blog->site_id);
         $_wp_switched_stack = array();
         $switched = false;
         if (!isset($current_site->site_name)) {
             $current_site->site_name = get_site_option('site_name');
             if (!$current_site->site_name) {
                 $current_site->site_name = ucfirst($current_site->domain);
             }
         }
     }
     $this->flush_cache();
     unset($GLOBALS['wp_query'], $GLOBALS['wp_the_query']);
     $GLOBALS['wp_the_query'] = new WP_Query();
     $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
     $GLOBALS['wp'] = new WP();
     // clean out globals to stop them polluting wp and wp_query
     foreach ($GLOBALS['wp']->public_query_vars as $v) {
         unset($GLOBALS[$v]);
     }
     foreach ($GLOBALS['wp']->private_query_vars as $v) {
         unset($GLOBALS[$v]);
     }
     $GLOBALS['wp']->main($parts['query']);
     $wp_roles->reinit();
     $current_user = wp_get_current_user();
     $current_user->for_blog($blog_id);
     // For BuddyPress, James.
     $this->clean_up_global_scope();
     $GLOBALS['bp']->loggedin_user = NULL;
     $GLOBALS['bp']->pages = bp_core_get_directory_pages();
     do_action('bp_init');
 }
コード例 #5
0
ファイル: bootstrap.php プロジェクト: ryelle/WordPress
 /**
  * @ticket 27003
  * @dataProvider data_get_network_by_path
  *
  * @param string $expected_key The array key associated with expected data for the test.
  * @param string $domain       The requested domain.
  * @param string $path         The requested path.
  * @param string $message      The message to pass for failed tests.
  */
 function test_get_network_by_path($expected_key, $domain, $path, $message)
 {
     $network = get_network_by_path($domain, $path);
     $this->assertEquals(self::$network_ids[$expected_key], $network->id, $message);
 }