【问题标题】:Wordpress Multisite call plugin function on different site不同站点上的 Wordpress 多站点调用插件功能
【发布时间】:2018-06-15 21:03:06
【问题描述】:

我正在开发一个 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 上的插件,但这不起作用。 我可以完全访问这两个网站。

【问题讨论】:

    标签: php wordpress multisite


    【解决方案1】:

    不幸的是,这似乎永远不会进入核心: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_poststream_context_createcURL 以及WP Nonces 来确保没有任何可疑的事情发生并且这些操作是经过授权的。

    我纯粹使用file_get_contents 来保持示例简洁。

    【讨论】:

    • 谢谢!这就是我一直在寻找的(当然有点适应)。首先我遇到了一些问题,但现在可以正常工作了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2021-07-17
    相关资源
    最近更新 更多