php - 不同站点上的 Wordpress 多站点调用插件功能
问题描述
我正在开发一个 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 票#14941(每个人都知道回文票号是用石头密封的,哈哈)。
老实说,您最好的选择是通过其他方法触发函数运行,例如在目标站点上触发自定义操作。因此,继续运行您现在拥有的功能,但将 GET 或 POST 请求添加到目标博客 URL(我将file_get_contents
用作示例,但POST
如果可以的话,您应该使用带有 nonces 的方法)
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 插件,因为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();
}
}
}
现在,当any-site.example.com?auth=m50667
由 触发时trigger_function_on_blog()
,faux_switch_to_blog_function()
将在目标站点上运行,您应该可以访问该站点可用的任何功能和挂钩。
请注意:
我想强调的是,我不一定建议使用$_GET
授权file_get_contents
,尤其是当您在各个博客上运行任何准敏感的内容时。我会考虑使用wp_remote_post
,stream_context_create
或cURL
withWP Nonces
以确保没有任何可疑的事情发生并且这些操作是经过授权的。
我纯粹是file_get_contents
为了保持示例简洁。
推荐阅读
- node.js - Discord.js 角色反应
- python - 具有多列且轴 = 0 的 df.apply 示例
- php - 如何使用 Guzzle 通过 POST 请求从 URL 发送文件
- c# - 'Aspnetuserlogins' 需要定义主键(互连数据库)
- c++11 - C++-11 类模板实例化崩溃 gprof ......有什么建议吗?
- libgdx - 如何在不先单击的情况下使 libGDX 滚动窗格滚动
- sql - SQL查询将表分组为表?
- php - Symfony EasyAdminBundle 3 覆盖 createIndexQueryBuilder()
- python - 如何用分离的特征计算和绘图?
- django - 十进制字段形式的变量 min_value