mysqlwordpresssubquery

Wordpress Subquery returns more than 1 row for query plugin delete users by role and date


I work on this plugin for Wordpress to delete users with a subscriber role and 30 days since joining us; users are active or not.

I cannot correct this error after activating.

if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

global $wpdb;
require_once(ABSPATH.'/wp-admin/includes/user.php');

$role = "subscriber"; // The role to kill
$reassign = 1; // The user that all posts will fall back to, other wise they will be deleted
$days = 30; // Calculated in days, how old a user should be in order to get deleted

$this_role = "[[:<:]]".$role."[[:>:]]";

$query = $wpdb->prepare("
    SELECT user_id
    FROM $wpdb->usermeta
    WHERE meta_key = '{$wpdb->prefix}capabilities'
    AND (SELECT user_id
        FROM $wpdb->users
        WHERE user_registered < NOW() - INTERVAL $days DAY
        )
    AND meta_value RLIKE %s", $this_role);

if ( $users_of_this_role = $wpdb->get_results( $query, ARRAY_N ) )
    foreach( $users_of_this_role as $user_id )
        wp_delete_user( $user_id[0], $reassign );

Error:

WordPress database error
Subquery returns more than 1 row for query 
    SELECT user_id
    FROM wpi3_usermeta
    WHERE meta_key = 'wpi3_capabilities'
    AND (SELECT user_id
        FROM wpi3_users
        WHERE user_registered < NOW() - INTERVAL 30 DAY
        )
    AND meta_value RLIKE '[[:<:]]subscriber[[:>:]]' made by require_once('wp-load.php'), require_once('wp-config.php'), require_once('wp-settings.php'), include_once('/plugins/delete_users-1/delete_users.php')

I tried adding IN to WHERE but it shows a syntax error.


Solution

  • You should use `user_id in`

      SELECT user_id
        FROM wpi3_usermeta
        WHERE meta_key = 'wpi3_capabilities'
        AND user_id in (SELECT user_id
                FROM wpi3_users
                WHERE user_registered < NOW() - INTERVAL 30 DAY
             )
    
    
    DELETE FROM wpi3_users
    WHERE user_registered < NOW() - INTERVAL 30 DAY
    AND user_id IN (
        SELECT user_id
        FROM wpi3_usermeta
        WHERE meta_key = 'wp_capabilities'
        AND meta_value LIKE '%subscriber%'
    );