Wordpress Multisite call 插件功能在不同站点
Wordpress Multisite call plugin function on different site
我正在开发 Wordpress 插件,它必须在 Wordpress 多站点网络中的不同站点上触发一些操作。
- 站点 A
- 站点 B:更改站点 A
例如,我切换站点以更改不同站点上的用户角色(站点 B 上的代码):
switch_to_blog(1); //to Site A
//Change the user's role
restore_current_blog();
这很好用,但现在我想调用一个插件的函数。
所以我想从站点 B 调用在站点 A 上激活的插件的函数。 switch_to_blog()
函数只切换数据库而不是加载的插件。那么我怎样才能实现我的目标呢?
我试图在站点 B 上激活插件,但这不起作用。
我可以完全访问这两个站点。
不幸的是,这似乎永远不会进入核心:Trac ticket #14941(每个人都知道回文票号是一成不变的,哈哈)。
老实说,您最好的选择是通过其他方法触发 运行 的功能,例如在目标站点上触发自定义操作。所以继续 运行 你现在拥有的功能,但是向目标博客 URL 添加 GET 或 POST 请求(我将使用 file_get_contents
作为示例,但是如果可以的话,你应该使用带有随机数的 POST
方法)
function trigger_function_on_blog( $blog_id, $user_id ){
$blog_url = get_site_url( $blog_id );
switch_to_blog( $blog_id );
$user_id = wp_update_user( array( 'ID' => $user_id, 'role' => 'new_role' ) );
file_get_contents( $blog_url . '?auth=m50667' );
restore_current_blog();
}
// Modify User: 2 on Blog: 1
trigger_function_on_blog( 1, 2 );
现在您的功能 运行 正常,而且还直接请求目标站点。在您的目标网站上,您只需要确保该功能仅在 $_GET['auth']
等于 m50667
时触发(或满足您的其他更好的验证方法)。
您可能希望为此使用 MU Plugin,因为 functions.php
依赖于主题,而多站点允许单独的主题。
所以继续创建 /mu-plugins/custom-functions.php
它会一直 运行,不需要激活,并且在里面放入你想要的逻辑 运行:
if ( ! defined( 'ABSPATH' ) ) exit; // Prevent direct file access
add_action( 'init', 'faux_switch_to_blog_function' );
function faux_switch_to_blog_function(){
if( $_GET['auth'] === 'm50667' ){ // Make sure this request is authorized by us
if( function_exists( 'some_plugin_function' ) ){
some_plugin_function();
}
}
}
现在,当 any-site.example.com?auth=m50667
被 trigger_function_on_blog()
触发时,faux_switch_to_blog_function()
将在目标站点上 运行,您应该可以访问任何函数和挂钩该站点可用。
请注意:
我想强调的是,我不一定建议对 file_get_contents
使用 $_GET
授权,尤其是当您 运行 在个人博客上发布任何准敏感内容时。我会考虑使用 wp_remote_post
, stream_context_create
or cURL
along with WP Nonces
来确保没有可疑的事情发生并且操作已获得授权。
我纯粹使用 file_get_contents
来保持示例简洁。
我正在开发 Wordpress 插件,它必须在 Wordpress 多站点网络中的不同站点上触发一些操作。
- 站点 A
- 站点 B:更改站点 A
例如,我切换站点以更改不同站点上的用户角色(站点 B 上的代码):
switch_to_blog(1); //to Site A
//Change the user's role
restore_current_blog();
这很好用,但现在我想调用一个插件的函数。
所以我想从站点 B 调用在站点 A 上激活的插件的函数。 switch_to_blog()
函数只切换数据库而不是加载的插件。那么我怎样才能实现我的目标呢?
我试图在站点 B 上激活插件,但这不起作用。
我可以完全访问这两个站点。
不幸的是,这似乎永远不会进入核心:Trac ticket #14941(每个人都知道回文票号是一成不变的,哈哈)。
老实说,您最好的选择是通过其他方法触发 运行 的功能,例如在目标站点上触发自定义操作。所以继续 运行 你现在拥有的功能,但是向目标博客 URL 添加 GET 或 POST 请求(我将使用 file_get_contents
作为示例,但是如果可以的话,你应该使用带有随机数的 POST
方法)
function trigger_function_on_blog( $blog_id, $user_id ){
$blog_url = get_site_url( $blog_id );
switch_to_blog( $blog_id );
$user_id = wp_update_user( array( 'ID' => $user_id, 'role' => 'new_role' ) );
file_get_contents( $blog_url . '?auth=m50667' );
restore_current_blog();
}
// Modify User: 2 on Blog: 1
trigger_function_on_blog( 1, 2 );
现在您的功能 运行 正常,而且还直接请求目标站点。在您的目标网站上,您只需要确保该功能仅在 $_GET['auth']
等于 m50667
时触发(或满足您的其他更好的验证方法)。
您可能希望为此使用 MU Plugin,因为 functions.php
依赖于主题,而多站点允许单独的主题。
所以继续创建 /mu-plugins/custom-functions.php
它会一直 运行,不需要激活,并且在里面放入你想要的逻辑 运行:
if ( ! defined( 'ABSPATH' ) ) exit; // Prevent direct file access
add_action( 'init', 'faux_switch_to_blog_function' );
function faux_switch_to_blog_function(){
if( $_GET['auth'] === 'm50667' ){ // Make sure this request is authorized by us
if( function_exists( 'some_plugin_function' ) ){
some_plugin_function();
}
}
}
现在,当 any-site.example.com?auth=m50667
被 trigger_function_on_blog()
触发时,faux_switch_to_blog_function()
将在目标站点上 运行,您应该可以访问任何函数和挂钩该站点可用。
请注意:
我想强调的是,我不一定建议对 file_get_contents
使用 $_GET
授权,尤其是当您 运行 在个人博客上发布任何准敏感内容时。我会考虑使用 wp_remote_post
, stream_context_create
or cURL
along with WP Nonces
来确保没有可疑的事情发生并且操作已获得授权。
我纯粹使用 file_get_contents
来保持示例简洁。