разбирается кто в mysql?

есть такой mysql код:

SELECT wp_users.ID, wp_users.user_login
FROM  wp_users
    LEFT JOIN wp_posts ON wp_users.ID = wp_posts.post_author 
    LEFT JOIN wp_comments ON wp_users.ID  = wp_comments.user_id
    LEFT JOIN wp_usermeta ON wp_users.ID  = wp_usermeta.user_id
WHERE wp_posts.post_author is NULL
AND wp_comments.user_id is NULL    
AND wp_usermeta.meta_key = 'wp_capabilities'
AND LOCATE('administrator', wp_usermeta.meta_value) = 0
AND LOCATE('editor', wp_usermeta.meta_value) = 0 
AND LOCATE('author', wp_usermeta.meta_value) = 0 
AND LOCATE('contributor', wp_usermeta.meta_value) = 0

он выбирает из базы всех юзеров-неавторов, у которых нет постов и комментариев.
выбрать то он выбирает, но как их автоматом при этом удалить? вручную чекать не слишком хочется.

сам код взят из плагина Clean Up Users, который почему-то работает у меня на localhost, но отказывается
работать у хостера. может кто объяснит причину?
или дайте ссылку на любой плагин, способный удалить неактивных зарегистрированных юзеров – как ни странно
я такого плагина найти не смог ((

<?php
/*
Plugin Name: Clean Up Users
Plugin URI: http://www.dagondesign.com/articles/clean-up-users-plugin-for-wordpress/
Description: Removes registered users that have no posts or comments
Author: Dagon Design
Version: 1.0
Author URI: http://www.dagondesign.com/
*/


$ddcuu_version = '1.0';

function ddcuu_add_options_pages() {
    if (function_exists('add_options_page')) {
        add_options_page("Clean Up Users", 'DDCleanUpUsers', 8, __FILE__, 'ddcuu_options_page');
    }        
}

function ddcuu_options_page() {

    // user roles
    $skip_admins = TRUE;
    $skip_editors = TRUE;
    $skip_authors = TRUE;
    $skip_contributors = TRUE;


    global $wpdb, $dddu_version;
    $tp = $wpdb->prefix;


    $result = "";

    if (isset($_POST['info_update'])) {

        // start processing

        ?><div id="message" class="updated fade"><p><strong><?php 

        echo "Action Complete - View Results Below";

        ?></strong></p></div><?php


        $result = '';

        $dddu_confirm = (bool)$_POST['dddu_confirm'];



        if ($dddu_confirm) {

            $skip_check = '';
            if ($skip_admins) $skip_check .= " AND LOCATE('administrator', {$tp}usermeta.meta_value) = 0 ";
            if ($skip_editors) $skip_check .= " AND LOCATE('editor', {$tp}usermeta.meta_value) = 0 ";
            if ($skip_authors) $skip_check .= " AND LOCATE('author', {$tp}usermeta.meta_value) = 0 ";
            if ($skip_contributors) $skip_check .= " AND LOCATE('contributor', {$tp}usermeta.meta_value) = 0 ";

            // list of users with no posts and no comments
            $userlist = (array)$wpdb->get_results("
                SELECT {$tp}users.ID, {$tp}users.user_login
                FROM  {$tp}users
                    LEFT JOIN {$tp}posts ON {$tp}users.ID = {$tp}posts.post_author 
                    LEFT JOIN {$tp}comments ON {$tp}users.ID  = {$tp}comments.user_id
                    LEFT JOIN {$tp}usermeta ON {$tp}users.ID  = {$tp}usermeta.user_id
                WHERE {$tp}posts.post_author is NULL
                AND {$tp}comments.user_id is NULL    
                AND {$tp}usermeta.meta_key = 'wp_capabilities'
                {$skip_check}            
            ");

            foreach ($userlist as $u) {
                wp_delete_user($u->ID);
            }

            $result = 'Users deleted: ' . count($userlist);



        } else {

            $result = 'No option selected!';

        }



        // end processing


    } ?>

    <div class=wrap>

    <h2>Clean Up Users v<?php echo $dddu_version; ?></h2>

    <p>For information and updates, please visit:<br />
    <a href="http://www.dagondesign.com/articles/clean-up-users-plugin-for-wordpress/">http://www.dagondesign.com/articles/clean-up-users-plugin-for-wordpress/</a></p>

    <?php 

    if ($result != "") { 
        echo '<div style="border: 1px solid #888888; padding: 5px;">';
        echo '<strong>Results</strong>:<br /> ' . trim($result) . '</div>';
    } 

    ?>


    <form enctype="multipart/form-data" method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>"  >
    <input type="hidden" name="info_update" id="info_update" value="true" />


    <div style="padding: 0 0 15px 12px;">

        <?php print $formatinfo; ?>
        <h3>Options</h3>
        <input type="checkbox" name="dddu_confirm" id="dddu_confirm" /> 
        Delete users with no comments or posts
    </div>


    <div class="submit">
        <input type="submit" name="info_update" value="Submit" />
    </div>
    </form>
    </div><?php
}


add_action('admin_menu', 'ddcuu_add_options_pages');

?>

Как-то так, наверно:
DELETE FROM wp_users WHERE ID in (SELECT wp_users.ID FROM wp_users и дальше куча джойнов и условий условий выборки)

Подробности ищите по ключевым словам "вложенные запросы MySQL"

Только ж еще придется проводить зачистку метаданных.

Как-то так, наверно:
DELETE FROM wp_users WHERE ID in (SELECT wp_users.ID FROM  wp_users и дальше куча джойнов и условий условий выборки)
Подробности ищите по ключевым словам "вложенные запросы MySQL"

ругается на ошибку, ну да ладно, поковыряю справочники, спасибо за подсказку.

Только ж еще придется проводить зачистку метаданных.

а какие метаданные еще? вроде в запросе указывается, что мета должны быть пустыми, собственно
насколько я понимаю именно пустые мета указывают на отсутствие постов или комментариев или
я ошибаюсь?

похимичил с плагинов, вроде вот такой код должен корректно прибить юзеров:

            $userlist = (array)$wpdb->get_results("SELECT wp_users.ID FROM  wp_users
                LEFT JOIN wp_posts ON wp_users.ID = wp_posts.post_author 
                LEFT JOIN wp_comments ON wp_users.ID  = wp_comments.user_id
                LEFT JOIN wp_usermeta ON wp_users.ID  = wp_usermeta.user_id
            WHERE wp_posts.post_author is NULL
            AND wp_comments.user_id is NULL    
            AND wp_usermeta.meta_key = 'wp_capabilities'
            AND LOCATE('administrator', wp_usermeta.meta_value) = 0
            AND LOCATE('editor', wp_usermeta.meta_value) = 0 
            AND LOCATE('author', wp_usermeta.meta_value) = 0 
            AND LOCATE('contributor', wp_usermeta.meta_value) = 0
            ");

            foreach ($userlist as $u) {
                wp_delete_user($u->ID);
            }

Та дофигища в wp_usermeta всякого разного для каждого юзера: nickname, rich_editing, admin_color, wp_capabilities, wp_user_level, etc.

Я бы советовал разобраться с плагином.

спасибо Юрий, ваша подсказка помогла мне найти решение с плагином ))
оказывается слишком большой результат у запроса получается, а у хостера mysql настроен так, что по умолчанию не дает выполнить такой запрос.
надо было поставить SET SESSION SQL_BIG_SELECTS=1 перед ним.

Anonymous
Отправить
Ответ на: