不幸的是,这似乎永远不会进入核心:Trac ticket #14941(每个人都知道回文票号是一成不变的,哈哈)。
老实说,您最好的选择是通过其他方法触发函数运行,例如触发目标站点上的自定义操作。所以继续运行你现在拥有的函数,但是向目标博客 URL 添加一个 GET 或 POST 请求(我将使用 file_get_contents 作为示例,但如果你是能)
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 是主题相关的,而 Multi-Site 允许单独的主题。
所以继续创建/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();
}
}
}
现在,当trigger_function_on_blog() 触发any-site.example.com?auth=m50667 时,faux_switch_to_blog_function() 将在目标站点上运行,您应该可以访问该站点可用的任何函数和挂钩。
请注意:
我想强调的是,我不一定推荐使用 $_GET 授权和 file_get_contents,尤其是当您在各个博客上运行任何准敏感的内容时。我会考虑使用wp_remote_post、stream_context_create 或cURL 以及WP Nonces 来确保没有任何可疑的事情发生并且这些操作是经过授权的。
我纯粹使用file_get_contents 来保持示例简洁。