這篇學(xué)習(xí)的主要內(nèi)容是Multiview,在我們學(xué)習(xí)iphone旋轉(zhuǎn)的時(shí)候,介紹過(guò)多個(gè)view的使用方法,不過(guò)這里的view和旋轉(zhuǎn)屏幕中所指的多個(gè)view是不同的,旋轉(zhuǎn)屏幕中涉及到的多個(gè)view是在一個(gè)xib文件中的,而我們這里所指的mulitview,則是指多個(gè)xib,在多個(gè)xib中進(jìn)行view的切換,也就是從一個(gè)xib切換到另一個(gè)xib,而每個(gè)xib中只有一個(gè)view。
另外的一個(gè)不同點(diǎn)體現(xiàn)在創(chuàng)建項(xiàng)目的時(shí)候,到目前為止,我們創(chuàng)建的所有項(xiàng)目的template都是single view,這次創(chuàng)建的項(xiàng)目將使用新的template。
Multiview applicatin的基本架構(gòu),一般來(lái)說(shuō),一個(gè)multiview application會(huì)有一個(gè)主要的controller來(lái)控制view的呈現(xiàn),這個(gè)主要的controller可以是toolbar(iphone上的Safari打開(kāi)后,地下的一排按鈕就是toolbar)或者是tab bar(iphone打開(kāi)phone,最下面一個(gè)一個(gè)的tab),或者其他的一些控件,他們控制到底那個(gè)view應(yīng)該顯示,那個(gè)view應(yīng)該被隱藏,也就是說(shuō),至少需要3個(gè)view才能實(shí)現(xiàn)view的切換,一個(gè)主要的controller view,2個(gè)其他的用于切換的view,主要的controller view是一直顯示在屏幕上的,而其他的view中,只有1個(gè)會(huì)顯示出來(lái),其他的都被隱藏。ok,下面開(kāi)始一步一步實(shí)現(xiàn)multiview吧,再說(shuō)下去會(huì)越來(lái)越糊涂的。
0)項(xiàng)目簡(jiǎn)介
今天要做的例子中包含3個(gè)view,一個(gè)controller view,我們會(huì)使用toolbar,2個(gè)用于切換的view,一個(gè)藍(lán)色底,一個(gè)黃色底,他們中間都有一個(gè)button,單擊button會(huì)有一個(gè)警告框彈出,告訴用戶當(dāng)前顯示的是哪個(gè)view。
1)創(chuàng)建一個(gè)工程,選擇Empty Application

這次不再選擇Single View Application,而選擇Empty Application,項(xiàng)目中的所有文件我們都會(huì)手動(dòng)進(jìn)行添加。
單擊Next按鈕,之后的操作和創(chuàng)建Single View項(xiàng)目一樣,設(shè)定項(xiàng)目名稱“View Switcher”,設(shè)定項(xiàng)目保存路徑,項(xiàng)目創(chuàng)建完成。
2)添加View Controller
由于我們使用的模板是Empty Application,因此當(dāng)創(chuàng)建完項(xiàng)目后,只有以下一些文件

里面并沒(méi)有我們需要的controller view,也沒(méi)有任何xib文件,這些都是需要我們手動(dòng)添加的。使用快捷鍵command+N或者菜單欄File>New>New File...,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇UIViewController subclass,點(diǎn)擊Next按鈕

填寫(xiě)類名BIDSwitchViewController,其他都是默認(rèn)選項(xiàng)(注意最后一個(gè)checkbox,如果選擇了,則將創(chuàng)建一個(gè)和BIDSwitchViewController關(guān)聯(lián)的xib文件,我們?cè)谶@里可以選上,但是為了弄清楚view controller和xib文件是如何關(guān)聯(lián)在一起的,在這個(gè)項(xiàng)目中我們暫時(shí)不選,后面我們會(huì)手動(dòng)連接這兩個(gè)文件),點(diǎn)擊Next按鈕。

選擇保持的位置,保存在“View Switcher”目錄下,完成創(chuàng)建。
BIDSwitchViewController是項(xiàng)目的最頂層的view controller(root controller),它用于控制另外2個(gè)view的切換,下面按照同樣的方法,創(chuàng)建另外2個(gè)view controller,一個(gè)名字教BIDBlueViewController,另一個(gè)叫做BIDYellowViewController,他們都不需要關(guān)聯(lián)xib,且都保存在“View Switcher”目錄下。創(chuàng)建完成后的“View Switcher”結(jié)構(gòu)如下

3)添加xib文件
使用快捷鍵command+N或者菜單欄File>New>New File...,在彈出的窗口中,左邊選擇User Interface,右邊選擇View,點(diǎn)擊Next按鈕

Device Family中選擇iphone,點(diǎn)擊Next
命名為SwitchView.xib,同樣保持在“View Switcher”目錄下,點(diǎn)擊Create,完成創(chuàng)建。

使用同樣的方法創(chuàng)建另外兩個(gè)xib,分別命名為BlueView.xib和YellowView.xib。至此,我們所有的文件都已經(jīng)創(chuàng)建完畢,整個(gè)的“View Switcher”結(jié)構(gòu)圖如下

接下來(lái)就是寫(xiě)代碼的工作了。
4)編輯BIDAppDelegate文件
當(dāng)一個(gè)app啟動(dòng)的時(shí)候,我們都會(huì)默認(rèn)的把一個(gè)view載入當(dāng)前的iphone窗口(application's main window),在這個(gè)例子中,這個(gè)view就是我們的root view,即BIDSwitchViewController。我們是在BIDAppDelegate文件中設(shè)置默認(rèn)載入的view的,因此首先打開(kāi)BIDAppDelegate.h,添加class BIDSwitchViewController,和它的一個(gè)property,如下
#import <UIKit/UIKit.h> @class BIDSwitchViewController; @interface BIDAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) BIDSwitchViewController *switchViewController; @end
其中,@class是告訴BIDAppDelegate,后面的BIDSwitchViewController是一個(gè)類,應(yīng)該以類的方式處理該對(duì)象,后面在聲明property的時(shí)候,BIDAppDelegate就知道BIDSwitchViewController是一個(gè)類,不會(huì)不認(rèn)該對(duì)象。
接著打開(kāi)BIDAppDelegate.m,添加如下代碼
#import "BIDAppDelegate.h" #import "BIDSwitchViewController.h" @implementation BIDAppDelegate @synthesize window = _window; @synthesize switchViewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.switchViewController = [[BIDSwitchViewController alloc] initWithNibName:@"SwitchView" bundle:nil]; UIView *switchView = self.switchViewController.view; CGRect switchViewFrame = switchView.frame; switchViewFrame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height; switchView.frame = switchViewFrame; [self.window addSubview:switchView]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } ......
首先import BIDSwitchViewController,然后聲明synthesize,對(duì)應(yīng)于頭文件中的property。
didFinishLaunchingWithOption方法,當(dāng)一個(gè)app載入完成后需要做一些什么事情,在這里,我們指定了哪個(gè)view被載入到windows中作為默認(rèn)顯示的view。
self.switchViewController = [[BIDSwitchViewControlleralloc] initWithNibName:@"SwitchView" bundle:nil];
通過(guò)xib(在舊的版本中,xib被稱為nib,因此這里出現(xiàn)的是NibName)的名字來(lái)制定初始化哪個(gè)view
UIView *switchView = self.switchViewController.view;
獲取view
CGRect switchViewFrame = switchView.frame;
得到view的frame,也就是這個(gè)view的顯示位置,在前幾篇的文章中提到過(guò)這個(gè)屬性。
switchViewFrame.origin.y += [UIApplicationsharedApplication].statusBarFrame.size.height;
我覺(jué)得這句話比較重要,它將view的位置往下移動(dòng)了20point(point在非retina屏幕中是20px,在retina屏幕中是40px),這樣就不會(huì)擋住iphone頂部的狀態(tài)欄了。
switchView.frame = switchViewFrame;
將修改過(guò)的frame從新賦值給switchView
[self.window addSubview:switchView];
將switchView設(shè)置成window的subview。怎么理解這句話呢,就是說(shuō),一個(gè)app只有一個(gè)窗口(window),這個(gè)window只能同時(shí)顯示一個(gè)view,且這個(gè)view是基于這個(gè)window而存在的,是放在這個(gè)window里面的,因此稱之為window的subview,子視圖。
5)編輯BIDSwitchViewController.h
BIDSwitchViewController是root controller,用于控制其他2個(gè)view的切換,因此需要在其頭文件中聲明其他兩個(gè)controller,然后需要定義一個(gè)Action,用來(lái)完成對(duì)2個(gè)view的切換,將BIDSwitchViewController.h修改成如下
#import <UIKit/UIKit.h> @class BIDBlueViewController; @class BIDYellowViewController; @interface BIDSwitchViewController : UIViewController @property (strong, nonatomic) BIDBlueViewController *blueViewController; @property (strong, nonatomic) BIDYellowViewController *yellowViewController; - (IBAction)switchViews:(id)sender; @end
代碼還是很好理解的,和前面在BIDAppDelegate.h中添加BIDSwitchViewController是一樣的。
6)關(guān)聯(lián)BIDSwitchViewController和SwitchView.xib
在Project Navigator中選中SwitchView.xib,在xib的dock中選中File's Owner

然后在Identity inspector中將Class改成BIDSwitchViewController

這樣就將SwitchView.xib關(guān)聯(lián)到了BIDSwitchViewController,如果我們選擇Connections inspector,會(huì)看到我們剛才在BIDSwitchViewController.h中定義的Action:switchViews出現(xiàn)在Received Actions,我們之后就可以將這個(gè)Action關(guān)聯(lián)到SwitchView.xib的控件上。
7)在SwitchView.xib上添加Toolbar
在這個(gè)例子總,我們切換veiw的方式是點(diǎn)擊Toolbar上的一個(gè)button,然后切換2個(gè)view,SwitchView.xib使我們的root view,因此我們需要在SwitchView.xib上添加一個(gè)toolbar,然后點(diǎn)擊toolbar上的按鈕,切換BlueView.xib和YellowView.xib。
選中SwitchView.xib,在object library中找到Toolbar

拖動(dòng)到View上,放在最下方

默認(rèn)的,已經(jīng)有一個(gè)button在Toolbar上了,雙擊button改變文字,將文字改成“Switch Views”

接著就是將“Switch Views”按鈕關(guān)聯(lián)到switchViews,選中“Switch Views”,control-dragged到File's Owner,在彈出的框中選中switchViews

打開(kāi)Connections inspector,我們可以看到關(guān)聯(lián)后的情況

有一個(gè)不同的地方,Toolbar上的button不像一般的button,會(huì)有很多的方法讓你進(jìn)行關(guān)聯(lián),Toolbar上button的Sent Actions(其他的button叫做Send Events,有很多個(gè)方法)只有一個(gè)方法,而它的作用相當(dāng)于一般button的touch up inside。
8)關(guān)聯(lián)SwitchView.xib和BIDSwitchViewController's view outlet
BIDSwitchViewController繼承自UIViewController,在UIViewController中有一個(gè)outlet view,另外當(dāng)我們?cè)谧龅?)步的時(shí)候,將SwitchView.xib的class改成了BIDSwitchViewController,所以我們要將這個(gè)view關(guān)聯(lián)到SwitchView.xib,關(guān)聯(lián)的方法是選中SwitchView.xib,然后選中File's Owner,control-drag到下面的View

釋放鼠標(biāo)后,在填出的框中選則view,這樣就關(guān)聯(lián)好了。

關(guān)聯(lián)好后,查看Connections inspector,也可以看到關(guān)聯(lián)后的結(jié)果

9)編輯BIDSwitchViewController.m
添加如下代碼
#import "BIDSwitchViewController.h" #import "BIDYellowViewController.h" #import "BIDBlueViewController.h" @implementation BIDSwitchViewController @synthesize yellowViewController; @synthesize blueViewController;
2個(gè)#import這個(gè)很好理解,因?yàn)锽IDSwitchViewController是root controller,會(huì)控制另外2個(gè)controller,因此需要把另外2個(gè)controller引入進(jìn)來(lái),這樣才可以對(duì)他們進(jìn)行操作。
2個(gè)synthesize對(duì)著頭文件中的2個(gè)property。
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView" bundle:nil]; [self.view insertSubview:self.blueViewController.view atIndex:0]; [super viewDidLoad]; }
首先去掉viewDidLoad的注釋,然后添加以上的代碼。從最后一句可以看出,viewDidLoad方法繼承自UIViewController,在這里對(duì)其重載,這個(gè)方法發(fā)生在當(dāng)view已經(jīng)載入完成后,我們所要做的是當(dāng)root view載入完成后,在載入root view的subview,在我們的這個(gè)例子中是BlueView。BlueView的載入方法和前面的一樣,使用initWithNibName,然后作為subView插入到當(dāng)前的view中(當(dāng)前的view就是root view,也就是SwitchView)。
- (IBAction)switchViews:(id)sender { if(self.yellowViewController.view.superview == nil) { if(self.yellowViewController == nil) { self.yellowViewController = [[BIDYellowViewController alloc] initWithNibName:@"YellowView" bundle:nil]; } [blueViewController.view removeFromSuperview]; [self.view insertSubview:self.yellowViewController.view atIndex:0]; } else { if (self.blueViewController ==nil) { self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView" bundle:nil]; } [yellowViewController.view removeFromSuperview]; [self.view insertSubview:self.blueViewController.view atIndex:0]; } }
實(shí)現(xiàn)switchViews Action,上面的代碼還是很好理解的,首先判斷當(dāng)前哪個(gè)subview是沒(méi)有superview的,因?yàn)檫@2個(gè)subview不會(huì)同時(shí)顯示,當(dāng)blueSubview顯示時(shí),YellowSubview就會(huì)從root view中移除,因此不會(huì)具有superview,當(dāng)?shù)弥莻€(gè)subview沒(méi)有superview,就說(shuō)明應(yīng)該顯示這個(gè)subview。知道該顯示哪個(gè)subview后,再判斷這個(gè)subview是否還存在(是否需要重新載入初始化),然后將另一個(gè)subview從superview中移除,再將subview顯示出來(lái)。
- (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. if (self.blueViewController.view.superview == nil){ self.blueViewController = nil; } else { self.yellowViewController = nil; } }
當(dāng)ios的內(nèi)存不夠用時(shí),didReceiveMemoryWarning會(huì)被系統(tǒng)自動(dòng)調(diào)用,來(lái)釋放可利用的內(nèi)存。在這里如果哪個(gè)subview沒(méi)有顯示,就釋放該subview,騰出內(nèi)存。
至此BIDSwitchViewController的所有代碼都寫(xiě)好了,下面就應(yīng)該處理BIDBlueVeiwController和BIDYellowViewController了。
(友情提示,時(shí)不時(shí)的編譯一下你的project,盡早發(fā)現(xiàn)問(wèn)題,容易修改,否則到后面自己都不知道錯(cuò)在哪里)
10)編輯BlueView.xib和YellowView.xib
分別在BlueView.xib和YellowView.xib上添加一個(gè)button,并命名為“Press me”。

修改BlueView.xib的class為BIDBlueViewController,修改YellowView.xib的class為BIDYellowController(修改方法:選中xib,點(diǎn)擊File's Owner,在Identity inspector中更改class)

class改變了,就需要重新關(guān)聯(lián)一下File's owner的view,方法和之前的一樣,選中File‘s Owner,control-drag到下面的View上,在彈出的框中選擇view,關(guān)聯(lián)完畢,2個(gè)xib都需要進(jìn)行這個(gè)操作。
在Attributes inspector中,將BlueView.xib的background顏色改成藍(lán)色

同樣的方法將YellowView.xib的background顏色改成黃色

還有一個(gè)地方需要設(shè)置,因?yàn)槲覀兪窃趓oot view中顯示這2個(gè)subview,而root view有一個(gè)toolbar在最下方,因此subview需要把toolbar的位置空出來(lái),再進(jìn)行自己的布局,還是打開(kāi)Attributes inspector,在Simulated Metrics欄中有很多現(xiàn)象,他們都是用來(lái)模擬iphone屏幕上各種占位控件的,我們將Button Bar的選項(xiàng)設(shè)成Toolbar,這樣xib就會(huì)空出Toolbar的位置來(lái)進(jìn)行布局計(jì)算了

仔細(xì)看的話,“Press me”按鈕的位置往上移動(dòng)了那么一點(diǎn)點(diǎn)
11)在BIDBlueViewController和BIDYellowViewController中添加代碼
在BIDBlueViewController.h中添加Action,如下
@interface BIDBlueViewController : UIViewController - (IBAction)blueButtonPressed; @end
在BIDBlueViewController.m中實(shí)現(xiàn)blueButtonPressed,如下
- (IBAction)blueButtonPressed { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Blue View Button Pressed" message:@"You pressed the button on the blue view" delegate:nil cancelButtonTitle:@"Yep, I did" otherButtonTitles:nil]; [alert show]; }
在BIDYellowViewController.h添加Action,如下
@interface BIDYellowViewController : UIViewController - (IBAction)yellowButtonPressed; @end
在BIDYellowViewController.m中實(shí)現(xiàn)yellowButtonPressed,如下
- (IBAction)yellowButtonPressed { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yellow View Button Pressed" message:@"You pressed the button on the yellow view" delegate:nil cancelButtonTitle:@"Yep, I did" otherButtonTitles:nil]; [alert show]; }
代碼都很簡(jiǎn)單,就不多做解釋了。
12)關(guān)聯(lián)button和Action
打開(kāi)BlueView.xib,選中“Press me”按鈕,control-drag到File's owner釋放,在填出的框中選擇blueButtonPressed。
打開(kāi)YellowView.xib,選中“Press me”按鈕,control-drag到File's owner釋放,在填出的框中選擇yellowButtonPressed。
13)編譯運(yùn)行
至此我們已經(jīng)可以編譯運(yùn)行程序了,編譯成功后,iphone模擬器中顯示的效果(“Press me”按鈕的效果就不演示了)

按下“Switch Views”按鈕,BlueSubview會(huì)切換到Y(jié)ellowSubview

14)更炫的切換view的方法
有沒(méi)有發(fā)現(xiàn)上面切換view效果很無(wú)聊,ios中有更炫的切換view的方法,使用動(dòng)畫(huà)的方式切換view,打開(kāi)BIDSwitchViewController.m,重新編輯switchViews方法,如下
- (IBAction)switchViews:(id)sender { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:1.25]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; if(self.yellowViewController.view.superview == nil) { if(self.yellowViewController == nil) { self.yellowViewController = [[BIDYellowViewController alloc] initWithNibName:@"YellowView" bundle:nil]; } [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; [blueViewController.view removeFromSuperview]; [self.view insertSubview:self.yellowViewController.view atIndex:0]; } else { if (self.blueViewController ==nil) { self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView" bundle:nil]; } [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [yellowViewController.view removeFromSuperview]; [self.view insertSubview:self.blueViewController.view atIndex:0]; } [UIView commitAnimations]; }
[UIViewbeginAnimations:@"View Flip" context:nil];
先可以不用理解這句話的意思,因?yàn)槲乙矝](méi)有理解,反正這行代碼是聲明一個(gè)animation block,前一個(gè)參數(shù)是設(shè)置animation block的title,后一個(gè)參數(shù)是設(shè)置一個(gè)對(duì)象,我也搞不清楚是干什么的,大概在以后的學(xué)習(xí)中會(huì)有所了解。
[UIViewsetAnimationDuration:1.25];
設(shè)定動(dòng)畫(huà)時(shí)間,即切換view的時(shí)間
[UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];
設(shè)定動(dòng)畫(huà)的運(yùn)動(dòng)方式,開(kāi)始慢,中間快,最后慢,大家開(kāi)始看ios自己的說(shuō)明吧。(An ease-in ease-out curve causes the animation to begin slowly, accelerate through the middle of its duration, and then slow again before completing. This is the default curve for most animations.)
[UIViewsetAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
設(shè)定切換的樣式,一共有4個(gè)值可以選:
UIViewAnimationTransitionFlipFromRight
UIViewAnimationTransitionFlipFromLeft
UIViewAnimationTransitionFlipCurUp
UIViewAnimationTransitionFlipCurDown
這個(gè)大家自試試就可以知道了
[UIViewcommitAnimations];
當(dāng)所有動(dòng)畫(huà)的值設(shè)置完畢后,提交動(dòng)畫(huà),之后view就會(huì)按照設(shè)定的動(dòng)畫(huà)進(jìn)行view的切換了。

(此圖截于書(shū)本,因此不同清晰)
15)總結(jié)
ok,所有的功能都已經(jīng)完成了,在這個(gè)例子中,我們使用toolbar來(lái)完成對(duì)不同view的切換,我們需要一個(gè)root view進(jìn)行總的控制,然后多個(gè)subview進(jìn)行切換,最后還使用一個(gè)比較炫的效果進(jìn)行view之間的轉(zhuǎn)換,內(nèi)容很充實(shí)!
View Switcher
原文地址:http://www.cnblogs.com/minglz/archive/2012/12/11/2809368.html
WordPress是一套很方便的個(gè)人部落格系統(tǒng)架設(shè)軟體,免費(fèi)開(kāi)放的原始碼,任何人都可以取得、修改、架設(shè)。但你知道嗎?其實(shí)WordPress除了個(gè)人部落格之外,其實(shí)還有另一個(gè)Project,就是「WordPress MU」。這個(gè)WordPress MU是多用戶的WordPress架設(shè)程式,架設(shè)成功的話就可以自己經(jīng)營(yíng)BSP了,自己就像無(wú)名小站站長(zhǎng)或是痞客邦這樣的部落格服務(wù)提供商,提供給有部落格需求的使用者使用。
雖然知道的人不多,但現(xiàn)在更棒的是這個(gè)WordPress MU從WordPress3.0版開(kāi)始直接整合到WordPress之中,算是一項(xiàng)隱藏功能,需要透過(guò)一個(gè)代碼才能啟用這項(xiàng)服務(wù),以往架設(shè)WordPress MU是要在額外架設(shè),現(xiàn)在完全不用了,直接在自己本來(lái)的部落格系統(tǒng)內(nèi)就可以啟用WordPress MU,有興趣的話趕快來(lái)喚醒沉睡的WordPress MU吧!
目前全球最大的WordPress MU使用者就是WordPress.com這個(gè)免費(fèi)的WordPress免費(fèi)部落格服務(wù),這個(gè)網(wǎng)站就是由WordPress MU系統(tǒng)建立的,如果把WordPress MU經(jīng)營(yíng)的好當(dāng)然就會(huì)像那樣囉!以往MU系統(tǒng)是額外獨(dú)立的專案,從3.0版的WordPress就把它整合進(jìn)來(lái),不再成為一個(gè)獨(dú)立的專案程式了,現(xiàn)在任何WordPress的使用者都可以把自己的網(wǎng)站改裝成WordPress MU。
WordPress MU被簡(jiǎn)稱為「WPMU」,但全名其實(shí)是「WordPress Multi User」多用戶程式。這套程式之所以大家會(huì)很少聽(tīng)到是因?yàn)閷?duì)於一般使用者來(lái)說(shuō),用途其實(shí)不大,因?yàn)榇蠹壹茉O(shè)網(wǎng)站都是獨(dú)立架設(shè)、擁有自己的網(wǎng)站,很少有人和別人共用一個(gè)網(wǎng)址,利用他的子網(wǎng)域或是子資料夾架設(shè)獨(dú)立的WordPress。
那這套程式不就沒(méi)用了嗎?其實(shí)並不然。如果你有三五好友想要擁有一個(gè)部落格,但是不想要使用常見(jiàn)的BSP部落格,可是如果要自架,又不會(huì)改程式碼的話,又或是另一種情況,假若你有工作上的需要,需要架設(shè)多個(gè)WordPress,可是想要同一管理,這個(gè)WordPress MU就可以幫上忙了,因?yàn)樗梢蚤_(kāi)通多個(gè)部落格,網(wǎng)站的設(shè)定統(tǒng)一由最大的管理者「超級(jí)管理」來(lái)處理,其他使用者只要負(fù)責(zé)使用就可以了,這樣一來(lái)對(duì)管理者來(lái)說(shuō)管理輕鬆,對(duì)其他用戶來(lái)說(shuō)也方便使用。
第1步 首先請(qǐng)您下載程式並進(jìn)行WordPress的安裝,詳細(xì)安裝過(guò)程這邊不多做說(shuō)明,如果不會(huì)安裝請(qǐng)參考:如何架設(shè)安裝WordPress部落格?,先將WordPress架設(shè)起來(lái)。當(dāng)您的WordPress架設(shè)好後,請(qǐng)下載FTP內(nèi)的wp-config.php檔案,在檔案內(nèi)加入語(yǔ)法,避免加錯(cuò)位置,可在「/* 設(shè)定完成,請(qǐng)儲(chǔ)存檔案。然後開(kāi)始 Blogging 吧! */」之上加入,儲(chǔ)存後將檔案上傳到FTP中。
define('WP_ALLOW_MULTISITE', true);
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_0.png)
第2步 重新整理部落格後臺(tái),點(diǎn)擊左方【工具】→「網(wǎng)誌網(wǎng)路」,進(jìn)入後請(qǐng)將網(wǎng)誌網(wǎng)路的標(biāo)題和聯(lián)絡(luò)信箱設(shè)定好,並點(diǎn)擊﹝安裝﹞。
[請(qǐng)注意]
如果您是從現(xiàn)有的部落格修改wp-config.php,想改裝成WordPress MU多用戶系統(tǒng),而非剛剛新架設(shè)的WordPress,那在子網(wǎng)域安裝部分無(wú)法設(shè)定,系統(tǒng)會(huì)強(qiáng)制您只能使用子目錄分類,來(lái)區(qū)分每個(gè)部落格。如果您是新架設(shè)的,那會(huì)出現(xiàn)子網(wǎng)域設(shè)定,請(qǐng)參考後面的教學(xué)說(shuō)明。
錯(cuò)誤訊息是:The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_1.png)
第3步 一旦設(shè)定好後,就無(wú)法再變更網(wǎng)站結(jié)構(gòu)類型了。接著請(qǐng)按照畫(huà)面指示的訊息新增資料。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_2.png)
第4步 請(qǐng)開(kāi)啟FTP連上網(wǎng)站後在「/public_html/wp-content」目錄下新建一個(gè)資料夾「blogs.dir」並設(shè)定資料夾屬性為「777」,因?yàn)檫@邊是要儲(chǔ)存用戶上傳的檔案。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_3.png)
第5步 接著請(qǐng)下載FTP根目錄中的「wp-config.php」請(qǐng)將WordPress後臺(tái)指示的資料加入倒wp-config.php的「/* 設(shè)定完成,請(qǐng)儲(chǔ)存檔案。然後開(kāi)始 Blogging 吧! */」這句話之上,儲(chǔ)存然後上傳。
語(yǔ)法可能如下,但不完全一樣。
define('WP_ALLOW_MULTISITE', true); define( 'MULTISITE', true ); define( 'SUBDOMAIN_INSTALL', false ); $base = '/'; define( 'DOMAIN_CURRENT_SITE', 'wpblog.net.ru' ); define( 'PATH_CURRENT_SITE', '/' ); define( 'SITE_ID_CURRENT_SITE', 1 ); define( 'BLOG_ID_CURRENT_SITE', 1 );
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_4.png)
第6步 接著請(qǐng)?jiān)賹TP上的「.htaccess」檔案下載,並根據(jù)WordPress後臺(tái)指示的說(shuō)明將資料加入到「.htaccess」檔案中,設(shè)定好後請(qǐng)上傳。
語(yǔ)法類似以下,但可能不完全一樣。
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # uploaded files RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L]
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_5.png)
第7步 設(shè)定好後,請(qǐng)重新登入WordPress後臺(tái),如果啟動(dòng)成功進(jìn)入後就會(huì)看到左上角會(huì)多出一個(gè)「超級(jí)管理」,這就是WordPress MU的管理選項(xiàng),可以在那邊新增用戶、設(shè)定等等,因?yàn)樯?jí)成MU之後,原本的部落格也會(huì)屬於WordPress MU的一部分,所以在畫(huà)面中會(huì)多出限制用戶的儲(chǔ)存空間選項(xiàng),預(yù)設(shè)都是10MB的儲(chǔ)存空間,使用者可以自己調(diào)整。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_6.png)
第8步 點(diǎn)擊【超級(jí)管理】→﹝選項(xiàng)﹞可以對(duì)MU站點(diǎn)做設(shè)定,不過(guò)這有些部分的中文描述好像怪怪的,有點(diǎn)不通順就是了。設(shè)定上大家自己可以玩玩看囉!
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_7.png)
第9步 點(diǎn)擊【超級(jí)管理】中的「網(wǎng)誌」則可以建立新網(wǎng)誌,就是開(kāi)一個(gè)獨(dú)立的部落格,開(kāi)設(shè)在子資料夾內(nèi)。輸入您要的網(wǎng)站名稱在網(wǎng)誌位址以及網(wǎng)誌標(biāo)題和該網(wǎng)誌站長(zhǎng)的聯(lián)絡(luò)信箱就可以了,伺服器將會(huì)自動(dòng)寄信通知部落格使用者。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_8.png)
第10步 在網(wǎng)誌的清單中可以點(diǎn)擊您剛剛建立的部落格,點(diǎn)進(jìn)去後可以對(duì)部落格做一些設(shè)定與調(diào)整,當(dāng)然也可以保持預(yù)設(shè)不動(dòng)作。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_9.png)
第11步 建立好的部落格就像這樣子囉!
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_10.png)
WordPress MU 設(shè)定子網(wǎng)域
前面有提到,如果是新安裝的WordPress,那在您啟動(dòng)WordPress MU功能同時(shí),設(shè)定選項(xiàng)中會(huì)讓使用者選擇「子網(wǎng)域」或是「子目錄」。當(dāng)然設(shè)定成子網(wǎng)域會(huì)比較好看,網(wǎng)址感覺(jué)高級(jí)一點(diǎn),但相對(duì)的困難度也提高,因?yàn)樾枰獎(jiǎng)拥较到y(tǒng)設(shè)定檔案,目前網(wǎng)路上還沒(méi)有一個(gè)教學(xué)是針對(duì)「虛擬主機(jī)(Share Hosting)」,因?yàn)樾枰獎(jiǎng)拥较到y(tǒng)的阿帕契和DNS之類的設(shè)定,所以非常的麻煩。
第1步 如果是新架設(shè)的WordPress,在啟動(dòng)MU功能時(shí),會(huì)在【工具】→「網(wǎng)誌網(wǎng)路」中看見(jiàn)「子網(wǎng)域」和「子目錄」的設(shè)定,請(qǐng)您選擇子網(wǎng)域進(jìn)行設(shè)定。請(qǐng)記住這邊一但選擇了網(wǎng)站架構(gòu),就不能進(jìn)行更改,如果強(qiáng)制更改原始碼,可能會(huì)出現(xiàn)無(wú)法意料的錯(cuò)誤。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_11.png)
第2步 接著WordPress會(huì)偵測(cè)您的空間是否有辦法自動(dòng)建立子網(wǎng)域,但在虛擬主機(jī)中,實(shí)驗(yàn)的結(jié)果都是會(huì)失敗的,因?yàn)橐话闶褂谜邲](méi)有權(quán)限去調(diào)整伺服器的設(shè)定。以最常見(jiàn)的虛擬主機(jī)系統(tǒng)cPanel來(lái)說(shuō),用戶無(wú)法對(duì)其網(wǎng)址進(jìn)行變更,必須由cPanel管理者透過(guò)WHM內(nèi)的DNS功能進(jìn)行調(diào)整才行。如果您是自架主機(jī),基本上應(yīng)該就有權(quán)限可以設(shè)定,因此請(qǐng)先根據(jù)這頁(yè)面內(nèi)的資料把網(wǎng)站設(shè)定一下,這邊的設(shè)定就跟前面提到的部分是一樣的,因此就不多做說(shuō)明。
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_12.png)
第3步 接著就是設(shè)定伺服器或虛擬主機(jī)以及網(wǎng)址部份了。關(guān)於虛擬主機(jī)要設(shè)定的「Wildcard DNS Record」等等之類的,以下有幾篇教學(xué)可以參考看看:這裡、這裡、這裡。如果虛擬主機(jī)支援的話,只要到DNS代管站新增一筆A紀(jì)錄,然後網(wǎng)域部分請(qǐng)輸入通用符號(hào)「*」,然後再輸入IP並新增就可以了。
大部分DNS代管站都可以,當(dāng)然仍是有可能不支援的,目前測(cè)試的GoDaddy是可以新增前面提到所謂的「Wildcard DNS Record」資料。
You can create a wildcard A record by setting the Host Name value to “*" (asterisk). The wildcard causes the server to respond with the IP address specified instead of an error if the subdomain queried does not exist within your zone file.
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_dns.png)
第4步 設(shè)定好後,您可以自由的新增部落格,新增部落格的時(shí)候會(huì)發(fā)現(xiàn)網(wǎng)誌位址部分變成讓使用者輸入網(wǎng)域囉!
以下展示網(wǎng)站為殺氣測(cè)試,使用H-Sphere空間作為測(cè)試!
主網(wǎng)域部落格:http://tgcc.org.ru/
子網(wǎng)域部落格:http://happy.tgcc.org.ru/
![[教學(xué)]如何架設(shè)WordPress MU 多用戶部落格? [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?](http://img2.sofree.cc/2011/e666ff24b572_11DCE/wp_mu_13.png)
基本上設(shè)定就是這樣子而已,其實(shí)如果不使用子網(wǎng)域,一般虛擬主機(jī)都可以很輕鬆的啟用WordPress MU多用戶功能。不過(guò)有些人可能啟用會(huì)失敗,那就是主機(jī)不支援不支援固定網(wǎng)址的功能,您的Apache的「mod_rewrite」這個(gè)模組被禁用了,如果是個(gè)人用戶可以到系統(tǒng)檔案「httpd.conf」把分號(hào)去掉,如果是虛擬主機(jī)請(qǐng)聯(lián)絡(luò)管理員。
如果你本身沒(méi)有多用戶需求,建議不要啟動(dòng)MU,因?yàn)閱?dòng)MU之後,部落格的資料庫(kù)會(huì)多一些資料表,每建立一個(gè)部落格,就會(huì)多出10多張的資料表。另外,啟動(dòng)MU之後系統(tǒng)資源也會(huì)吃比較重,因?yàn)榫偷褥对谝粋€(gè)網(wǎng)站上架設(shè)好幾個(gè)部落格在運(yùn)作,只是管理上比獨(dú)立架設(shè)方便,如果您有需要架設(shè)MU,最好要挑選一個(gè)限制比較少的虛擬主機(jī)來(lái)架設(shè),否則三天兩頭資源就吃完了,空間被停是早晚的事情。
這兩天在全力設(shè)計(jì)東方設(shè)計(jì)圖庫(kù)頻道 期間嘗試了多種辦法來(lái)盡可能的與東方設(shè)計(jì)工作室主站集成在一起,起初嘗試了WordPress的Multisite功能,分別以Sub directory和Sub domain的形式分別各自試了一次,發(fā)覺(jué),WP一旦開(kāi)啟了Multisite以后結(jié)構(gòu)變得復(fù)雜了很多,而且不夠穩(wěn)定,數(shù)據(jù)庫(kù)表也一下子飆升了很多,顯得非常臃腫,顯然這個(gè)并不是我所要的效果,于是經(jīng)過(guò)整個(gè)周末的來(lái)回嘗試,最后放棄了Multisite的形式,還是全新安裝了一個(gè)WP,經(jīng)過(guò)反復(fù)調(diào)試,已經(jīng)初具模型,但是問(wèn)題就是用戶也得重新注冊(cè)一次,這個(gè)顯然再次違背了我的初衷,經(jīng)過(guò)反復(fù)Google,終于找到了一個(gè)完美的解決方案,那就是兩個(gè)完全獨(dú)立的WordPress共享同一個(gè)數(shù)據(jù)表,堪稱完美,不敢獨(dú)享,現(xiàn)將教程共享給各位。
因?yàn)閳D庫(kù)站新建的WP已經(jīng)搭建出來(lái)了,而這個(gè)集成必須是后邊這個(gè)WP需要在共享前一個(gè)數(shù)據(jù)庫(kù)的用戶表的基礎(chǔ)上全新安裝才可以實(shí)現(xiàn),而且兩個(gè)WP必須建在同一個(gè)數(shù)據(jù)庫(kù)里邊,這個(gè)問(wèn)題不大,只要改變一下前綴即可,于是說(shuō)干就敢。
第一步、通過(guò)WP的工具》導(dǎo)出功能將已經(jīng)建立好的文章頁(yè)面等統(tǒng)統(tǒng)導(dǎo)出成一個(gè)XML文件;
第二步、修改新建的WP的配置文件wp-config.php如下所示:
$table_prefix = ‘blogb_’;
修改數(shù)據(jù)庫(kù)表前綴為新的前綴,防止和第一個(gè)WP沖突,然后在同個(gè)文件里找到
/* That’s all, stop editing! Happy blogging. */
在這斷話上方插入:
define(‘CUSTOM_USER_TABLE’, ‘wp_users’); define(‘CUSTOM_USER_META_TABLE’, ‘wp_usermeta’);
注意這里的wp_users和wp_usermeta都是第一個(gè)WP的用戶數(shù)據(jù)表,這里我們假設(shè)第一個(gè)WP用了默認(rèn)的前綴;
第三步、修改完配置文件以后,就可以開(kāi)始安裝第二個(gè)WP,安裝過(guò)程不是本教程討論的范疇,因此略過(guò);
第四步、安裝完成你會(huì)發(fā)現(xiàn)可以直接用第一個(gè)WP網(wǎng)站的管理員直接登陸第二個(gè)WP網(wǎng)站后臺(tái),然后進(jìn)入工具》導(dǎo)入,將第一步導(dǎo)出的XML文件重新導(dǎo)入,然后進(jìn)行一些必要的配置即可。
搞定收工,經(jīng)過(guò)測(cè)試非常完美,至此,在任意第一個(gè)或者第二個(gè)上新注冊(cè)的用戶,立馬可以直接用來(lái)登陸另外一個(gè)網(wǎng)站的后臺(tái),F(xiàn)antastic,所謂踏破鐵鞋無(wú)覓處、得來(lái)全不費(fèi)工夫,這幾天的忙活沒(méi)有白費(fèi),有了這個(gè)方法,理論上你可以設(shè)置任意多個(gè)獨(dú)立的WP系統(tǒng)共用同一個(gè)用戶數(shù)據(jù)表,有點(diǎn)類似于discuz的ucenter,但是這個(gè)顯然整合的更徹底,直接就是同一個(gè)表,不用擔(dān)心還需要再次同步的問(wèn)題。