skip to Main Content

I need to copy certain data from wp_usermeta into a new table when a certain plugin is activated on a subsite for the first time. So far, I can get the $admin_ids to print as expected, but don’t know how or if I can use these values in an IN statement in SQL. So far, the table is not created using the below methods.

Question is, how do I write this SQL query correctly so that when the function runs, a new table is created based on the wp_usermeta table where the current blog admins’ IDs are equal to wp_usermeta.user_id.

I am not getting any errors, warnings, or notices when I run the function, wp simply stalls forever.

Here’s my code.

function create_blog_usermeta_table(){
 if(function_exists('other_plugin_function')){
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();

     // WP_User_Query arguments
        $args = array(
            'role' => 'Administrator', 
            'fields' => 'ID' 
        );

        // The User Query
        $user_query = new WP_User_Query( $args );

        // Get the results
        $admins = $user_query->get_results();
        
        //Extract and format admin ids from the results
        $admin_ids = wp_list_pluck( $admins, 'ID', 'ID');
        $admin_ids = implode( ',', $admin_ids );

        
    $usermeta_table = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}_usermeta AS
        SELECT *
        FROM wp_usermeta
        Where user_id IN ($admin_ids)";

    }

}

2

Answers


  1. Chosen as BEST ANSWER

    This worked.

     //Create blog usermeta table containing usermeta for the current blog's users.
    function create_blog_usermeta_table(){
    
       
            global $wpdb;
            
            $charset_collate = $wpdb->get_charset_collate();
    
            // WP_User_Query arguments
            $args = array(
                'role' => 'Administrator', 
                'fields' => 'ID' 
            );
    
            // The User Query
            $user_query = new WP_User_Query( $args );
    
            // Get the results
            $query = $user_query->get_results();
            $admin_ids = wp_list_pluck( $query, 'ID', 'ID');
            $admin_ids = implode(',', $admin_ids);
            
            // Create new usermeta table for the blog users.
            $usermeta_table = "
            CREATE TABLE IF NOT EXISTS {$wpdb->prefix}usermeta AS
            SELECT *
            FROM wp_usermeta
            Where user_id IN ($admin_ids)";
    
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
        dbDelta( $usermeta_table );
        }
    register_activation_hook( MY_PLUGIN_PATH . '/my-plugin.php', 'create_blog_usermeta_table' );
    

  2. The previous solution did not copy indexes. This one does.

     //Create blog usermeta table containing usermeta for the current blog's users.
    function create_blog_usermeta_table(){
        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
            global $wpdb;
            
            $charset_collate = $wpdb->get_charset_collate();
    
         // WP_User_Query arguments
            $args = array(
                'role' => 'Administrator', 
                'fields' => 'ID' 
            );
    
            // The User Query
            $user_query = new WP_User_Query( $args );
    
            // Get the results
            $admins = $user_query->get_results();
            $user_ids = wp_list_pluck( $admins, 'ID', 'ID');
            $user_ids = implode(',', $user_ids);
            $new_table = $wpdb->prefix . 'usermeta';
            // Create new usermeta table for the blog users.
            $usermeta_table ="CREATE TABLE  `{$wpdb->prefix}usermeta` LIKE wp_usermeta;
      
            INSERT `{$wpdb->prefix}usermeta` SELECT * FROM wp_usermeta WHERE user_id IN ($user_ids);";
    
        dbDelta( $usermeta_table );
        maybe_create_table( $wpdb->prefix . 'usermeta', $usermeta_table );
        }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search