WordPress多站点a
一台服务器,一个ip地址,能建几个网站?80端口不会冲突吗?
课程:
什么是WordPress多站点?WordPress多站点的主要有哪些功能?
WordPress Multisite是WordPress的一项流行功能,它使您可以使用服务器上的同一WordPress安装来创建和运行多个网站。换句话说,您可以从一个仪表板管理多个不同的WordPress网站。
WordPress Multisite
1.什么是WordPress多站点?WordPress Multisite以前称为WordPress多用户或WPMU。WordPress Multisite不是一项新功能,自WordPress 3.0推出以来,它一直是WordPress平台上的一项高级功能,你可以将其用于多种目的,例如单击一下即可更新所有网站,或向订户收费以在多站点网络上创建一个网站。
2. WordPress多站点的主要功能WordPress Multisite具有多种独特功能,首先,可以通过单个WordPress安装来运行博客和网站网络。
它使你能够创建子域(如)或目录的网络。或者,你也可以为网络上的每个网站都有一个单独的域,在网站网络之间复制功能也更加容易。
在WordPress Multisite中,你可以作为超级管理员来控制整个网络,作为常规网站管理员,只能控制网络上的一个网站,作为超级管理员,你可以控制想要创建帐户并设置自己的WordPress博客或网站的用户的可访问性。
超级管理员可以安装新的主题和插件,使其可用于网络上的网站,还可以为所有网站自定义主题。另一个功能是可以创建针对特定语言,地区和货币的网站和在线商店。
超级管理员和网站管理员都可以控制内容,对于超级管理员,此控制扩展到整个网络,而网站管理员有权选择将主域中的哪些内容显示在各自的网站上,插件也受超级管理员的控制,如果有需要,网站管理员可以在其网站上激活和停用插件。
尽管WordPress Multisite提供了多种功能,但它并不总是正确的选择。主要问题是多站点网络上的网站将操作共享同一数据库,还有一个明显不足就是Web设计人员无法使用Multisite来管理几个不相关的客户端项目。
一个函数就解决 WordPress 多站点开发最大的问题,一定要收藏!
先简单说下什么是 WordPress 多站点,WordPress 多站点就是一套程序,通过子域名或者目录的方式可以开启无数个子站点,后期还可以绑定域名,看起来和普通的 WordPress 站点没什么区别。比如我们做的花生小店,就是通过 WordPress 多站点模式支撑起 2 万多个站点的电商小程序 SaaS 服务。
switch_to_blog 之后知道了 WordPress 多站点,那么下一步就是在 WordPress 多站点环境下做开发,做过这方面开发的朋友知道多站点开发最大的问题,就是切换站点获取数据。
比如用户登录花生小店的商户助手的小程序,要对自己店铺的某个商品进行编辑,我们就要切换到他的店铺,完成之后再切换回来,我们定义了一个相关更新商家商品的函数,为了演示简洁,这里我们只修改标题:
function wpjam_update_shop_product($shop_blog_id, $id, $title){ switch_to_blog($shop_blog_id); // 切换到商家的店铺 wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息 restore_current_blog(); // 切换回商户助手的站点}
看起来还好,如果我们需要把更新的信息返回,最简单的办法直接在 wp_update_post 函数前面加个 return:
function wpjam_update_shop_product($shop_blog_id, $id, $title){ switch_to_blog($shop_blog_id); // 切换到商家的店铺 return wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息 restore_current_blog(); // 切换回商户助手的站点}
这样就出问题了,因为 return 之后的代码不会被执行的,那么用个变量记录一下结果,切换回再返回:
function wpjam_update_shop_product($shop_blog_id, $id, $title){ switch_to_blog($shop_blog_id); // 切换到商家的店铺 $result = wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息 restore_current_blog(); // 切换回商户助手的站点 return $result;}
这样可以,但是如果程序里面不这么简单,由多个地方出错了,要返回?
function wpjam_update_shop_product($shop_blog_id, $id, $title){ switch_to_blog($shop_blog_id); // 切换到商家的店铺 $result = some_function(); // 执行一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } $result = some_other_function(); // 执行另外一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } $result = wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息 restore_current_blog(); // 切换回商户助手的站点 return $result;}
这样又出问题了,因为前面错误的返回造成 restore_current_blog() 没有被执行到,当然有同学会说,在每个错误抛出之前,执行 restore_current_blog(),这样当然可以,但是代码看起来真的太太啰嗦了。
function wpjam_update_shop_product($shop_blog_id, $id, $title){ switch_to_blog($shop_blog_id); // 切换到商家的店铺 $result = some_function(); // 执行一些操作 if(is_wp_error($result)){ restore_current_blog(); // 切换回商户助手的站点 return $result; // 如果发生了错误,要抛出错误 } $result = some_other_function(); // 执行另外一些操作 if(is_wp_error($result)){ restore_current_blog(); // 切换回商户助手的站点 return $result; // 如果发生了错误,要抛出错误 } $result = wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息 restore_current_blog(); // 切换回商户助手的站点 return $result;}
我们可以使用 try / catch / finally 来保证 restore_current_blog() 一定会被执行。
function wpjam_update_shop_product($shop_blog_id, $id, $title){ try{ switch_to_blog($shop_blog_id); // 切换到商家的店铺 $result = some_function(); // 执行一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } $result = some_other_function(); // 执行另外一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } return wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息 }finally{ restore_current_blog(); // 切换回商户助手的站点 }}
这样甚至前面我们连用于保存更新商品的 $result 变量也不需要,因为 finally 关键字保证了 restore_current_blog() 一定会被执行。
wpjam_call_for_blog但是如果所有的多站点开发都要 try / finally 处理,以及 switch_to_blog 和 restore_current_blog 的切换站点和恢复原站点的操作,还是挺烦人的,很容易出错,所以我写了一个高阶函数,把这部分操作封装起来,你直接需要简单调用即可即可:
function wpjam_call_for_blog($blog_id, $callback, ...$args){ try{ switch_to_blog($blog_id); return call_user_func_array($callback, $args); }finally{ restore_current_blog(); }}
只需要传递要执行代码的站点 ID($blog_id)和执行的回调函数($callback)以及相关的参数($args)即可,那么上面的更新函数,我们改一下:
function wpjam_update_product($id, $title){ $result = some_function(); // 执行一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } $result = some_other_function(); // 执行另外一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } return wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息}
首先我们就不需要 $shop_blog_id 参数了,函数名也从 wpjam_update_shop_product 改成了 wpjam_update_product,这个函数很明显是商家的商品更新函数,意思是我们无需为多站点开发新函数了,只需要使用 wpjam_call_for_blog 这个高阶函数来调用它:
wpjam_call_for_blog($shop_blog_id, 'wpjam_update_product', $id, $title);
如果没有别的操作直接更新商品则:
wpjam_call_for_blog($shop_blog_id, 'wp_update_post', ['ID'=>$id, 'post_title'=>$title]);
还支持闭包:
wpjam_call_for_blog($shop_blog_id, function($id, $title){ $result = some_function(); // 执行一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } $result = some_other_function(); // 执行另外一些操作 if(is_wp_error($result)){ return $result; // 如果发生了错误,要抛出错误 } return wp_update_post(['ID'=>$id, 'post_title'=>$title]); // 更新商品信息}, $id, $title);
真正做到一个函数就解决 WordPress 多站点开发最大的问题,并且还整合到了 WPJAM Basic 中,所以如果你进行 WordPress 多站点的二次开发,是不是一定要安装使用起来。