在多站点中自动删除站点和用户

时间:2014-01-21 作者:urok93

我试图在WordPress multisite中创建网站及其用户的计划删除。我编写的代码成功地删除了站点,但没有删除用户,有人能提供修复吗?

<?php
register_activation_hook( __FILE__, \'wpchat_clear_sites_activation\' );
/**
 * On activation, set a time, frequency and name of an action hook to be scheduled.
 */
function wpchat_clear_sites_activation() {
    wp_schedule_event( 1386979200, \'daily\', \'daily_clear_sites_hook\' );
}


add_action( \'daily_clear_sites_hook\', \'wpchat_clear_out_sites_daily\' );
/**
 * Clear out the sites and users
 */
function wpchat_clear_out_sites_daily() { 
    require_once( ABSPATH . \'wp-admin/includes/admin.php\' );
    require_once( ABSPATH . \'wp-admin/includes/user.php\' );

    if( ! function_exists( \'wpmu_delete_blog\' ) ) return;

        $users_to_keep = array( \'1\',\'4\',\'43\' );

    $blogs_to_keep = array( \'1\',\'4\' );

    $all_sites = wp_get_sites();    

    // Remove all blogs except for the main blog and the template blog
    foreach ( $all_sites as $key => $val ) {

        $users = get_users( array( \'blog_id\' => $val[\'blog_id\'], \'fields\' => ID ) );

        // Remove all users except for the test site admins
        foreach ( $users as $user) { 

            if ( ! in_array( $user[\'ID\'], $users_to_keep ) ) {
                wpmu_delete_user( $user[\'ID\'] );
            }
        }

        if ( ! in_array( $val[\'blog_id\'], $blogs_to_keep ) ) {
            wpmu_delete_blog( $val[\'blog_id\'], true );          
        }

    }
}
这些站点是通过cron或直接函数调用删除的,所以cron不是这里的问题,这是我试图删除用户的方式。

1 个回复
最合适的回答,由SO网友:Pat J 整理而成

Note -- 正如Kaiser在评论中正确指出的那样,多站点在站点之间共享用户。如果您删除了一个,则会将她从您网络中的所有站点中删除。如果这不是你的意图,那么调查一下remove_user_from_blog().


而不是wp_delete_user(), 使用wpmu_delete_user(). 正在查看the source code, wpmu_delete_user() 首先检查所涉及的用户是否是网络中任何站点上的用户,如果是,则将其删除,清除与其帐户关联的所有链接和元数据,然后最终按预期删除该用户。

This WordPress support thread 是什么指引我朝着这个方向。

在从中删除用户之前重新分配帖子source of wpmu_delete_user():

do_action( \'wpmu_delete_user\', $id );

$blogs = get_blogs_of_user( $id );

if ( ! empty( $blogs ) ) {
        foreach ( $blogs as $blog ) {
                switch_to_blog( $blog->userblog_id );
                remove_user_from_blog( $id, $blog->userblog_id );

                $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) );
                foreach ( (array) $post_ids as $post_id ) {
                        wp_delete_post( $post_id );
                }

                // Clean links
                $link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) );

                if ( $link_ids ) {
                        foreach ( $link_ids as $link_id )
                                wp_delete_link( $link_id );
                }

                restore_current_blog();
        }
}
因此,以编程方式删除用户时的默认操作是从她作为用户的每个站点(博客)中查找并删除她的帖子。然而,有一个操作挂钩就在前面运行,方便地命名为wpmu_delete_user. 因此,在删除之前,您应该能够通过编程方式重新分配要删除的用户的帖子:

add_action( \'wpmu_delete_user\', \'wpse130705_reassign_posts\' );
function wpse130705_reassign_posts( $id ) {
    // $id should contain the user\'s ID
    $blogs = get_blogs_of_user( $id );
    $assign_to = 99; // some other user\'s ID; you\'ll have to work out what this will be
    if( ! empty( $blogs ) ) {
        foreach( $blogs as $blog ) {
            switch_to_blog( $blog->userblog_id );
            $post_ids = $wpdb->get_col( 
                $wpdb->prepare( 
                    "SELECT ID FROM $wpdb->posts WHERE post_author=%d", $id 
                )
            );
            if( $post_ids ) {
                foreach( $post_ids as $post_id ) {
                    $wpdb->update( 
                        $table = $wpdb->posts,
                        $data  = array( \'post_author\' => $assign_to ),
                        $where = array( \'post_author\' => $id ),
                        $format = \'%d\',
                        $where_format = \'%d\'
                    );
                }
            }
            restore_current_blog();
        }
    }
}

结束

相关推荐

WordPress MultiSite可以使用了吗?

我计划为不同类型的社区创建一个网站。例如,不同类型的开发人员。PHPJavaAndroidTC每种类型都有不同的注册和配置文件字段。现在我的困惑是,要么我应该创建多站点网络,每个站点将包含不同的开发人员,要么只有一个站点可以明智地完成这项工作?我需要做的一些事情是允许用户随时开始使用其他网站,例如,如果x用户注册了Java,现在他想注册PHP,他应该能够在不再次注册的情况下放置他的内容,并且用户id也应该是相同的,所以每当我通过用户id获取内容时,它都会给我来自同一用户的不同网站的所有数据。另一个问题是,