Plugin Directory

Changeset 3348115


Ignore:
Timestamp:
08/21/2025 12:15:51 PM (6 months ago)
Author:
zeilenhoehe
Message:

Release 1.0.1 – WP 6.8 kompatibel (Tested up to), sichereres Löschen via WP_Filesystem, Bugfix Ordnererkennung, schärfere Thumbnail-Erkennung, Readme aktualisiert.

Location:
thumbs
Files:
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • thumbs/tags/1.0.1/readme.txt

    r3085537 r3348115  
    22Contributors: zeilenhoehe
    33Donate link: https://www.paypal.com/donate/?hosted_button_id=RZ822WZ9HRZPS
    4 Tags: thumbnails, media, images, optimization
     4Tags: thumbnails, media, images, cleanup, optimization
    55Requires at least: 5.9
    6 Tested up to: 6.4
    7 Stable tag: 1.0
     6Tested up to: 6.8
     7Stable tag: 1.0.1
    88Requires PHP: 7.4
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1111
    12 Ein einfaches Tool zur Verwaltung von Thumbnail-Dateien in WordPress, das Speicherplatz spart und die Website-Leistung verbessert.
     12Ein einfaches Tool zur Verwaltung von Thumbnail-Dateien in WordPress. Zählt, listet und löscht generierte Thumbnails und entfernt leere Upload-Ordner, um Speicherplatz zu sparen und die Performance zu verbessern.
    1313
    1414== Description ==
    15 "Thumbs" ist ein WordPress-Plugin zur effizienten Verwaltung von Thumbnail-Dateien. Es ermöglicht Ihnen, Thumbnails zu zählen, zu löschen, eine Liste der Thumbnails anzuzeigen und leere Ordner zu entfernen. Dieses Plugin hilft, Speicherplatz zu sparen und die Performance Ihrer Website zu verbessern.
     15"Thumbs" ist ein WordPress-Plugin zur effizienten Verwaltung automatisch erzeugter Thumbnails im Uploads-Verzeichnis. 
     16Es ermöglicht Ihnen:
     17* Thumbnails zählen, die gelöscht werden könnten 
     18* Liste der betroffenen Dateien anzeigen 
     19* Thumbnails sicher löschen 
     20* Leere Ordner im Uploads-Verzeichnis entfernen 
     21
     22Dies hilft, Speicherplatz zu sparen und die Performance Ihrer Website zu verbessern.
     23
     24**Sicherheitshinweise:**
     25- Erstellen Sie unbedingt ein Backup, bevor Sie Dateien löschen. 
     26- Testen Sie das Plugin idealerweise in einer Staging-Umgebung. 
     27- Das Plugin löscht **nur Thumbnail-Dateien**, die dem Muster `-WIDTHxHEIGHT.jpg/png/...` entsprechen. Originalbilder bleiben unberührt. 
    1628
    1729== Installation ==
    18 1. Laden Sie das Plugin herunter und entpacken Sie die Datei.
    19 2. Laden Sie den Plugin-Ordner in das Verzeichnis `/wp-content/plugins/` Ihrer WordPress-Installation hoch.
    20 3. Aktivieren Sie das Plugin im "Plugins"-Bereich Ihres WordPress-Dashboards.
     301. Laden Sie das Plugin herunter und entpacken Sie die Datei. 
     312. Laden Sie den Ordner `thumbs` in das Verzeichnis `/wp-content/plugins/` Ihrer WordPress-Installation hoch. 
     323. Aktivieren Sie das Plugin im Menü **Plugins** in Ihrem WordPress-Dashboard. 
     334. Gehen Sie im Admin-Menü auf **Thumbs**, um die Funktionen zu nutzen. 
    2134
    2235== Frequently Asked Questions ==
    23 = Ist es sicher, Thumbnails zu löschen? =
    24 Ja, aber stellen Sie sicher, dass Sie ein Backup haben, da das Löschen von Dateien irreversible Änderungen verursachen kann.
     36= Ist es sicher, Thumbnails zu löschen? = 
     37Ja, solange Sie vorher ein Backup erstellen. Das Löschen ist irreversibel. 
     38
     39= Werden Originalbilder gelöscht? = 
     40Nein, nur automatisch erzeugte Thumbnails, die `-WIDTHxHEIGHT` im Dateinamen enthalten. 
     41
     42= Funktioniert das Plugin auch mit Multisite? = 
     43Es arbeitet im Uploads-Verzeichnis der jeweiligen Site. 
    2544
    2645== Screenshots ==
    27 1. Übersicht
     461. Admin-Seite des Plugins mit Übersicht und Löschoptionen 
    2847
    2948== Changelog ==
     49= 1.0.1 =
     50* Kompatibel mit WordPress 6.8 („Tested up to“ aktualisiert) 
     51* Sichereres Löschen über WP_Filesystem API 
     52* Striktere Erkennung von Thumbnail-Dateien (`jpg|jpeg|png|gif|webp|avif`) 
     53* Bugfix bei der Erkennung leerer Ordner 
     54* Übersetzungsunterstützung (Textdomain ergänzt) 
     55
    3056= 1.0 =
    31 * Erstveröffentlichung des Plugins.
     57* Erstveröffentlichung des Plugins 
    3258
    3359== Upgrade Notice ==
    34 = 1.0 =
    35 Erstveröffentlichung. Bitte erstellen Sie ein Backup, bevor Sie das Plugin verwenden.
     60= 1.0.1 =
     61Update für WordPress 6.8. Verbesserte Sicherheit und Fehlerbehebung. Backup dringend empfohlen. 
    3662
    3763== Additional Information ==
    3864= Regenerierung von Thumbnails =
    39 - **WooCommerce**: Nutzen Sie die integrierte Funktion zur Thumbnail-Regenerierung in WooCommerce.
    40 - **Plugin 'Regenerate Thumbnails'**: Für eine umfassendere Lösung können Sie das Plugin "Regenerate Thumbnails" verwenden.
     65- **WooCommerce**: Nutzen Sie die eingebaute Funktion zur Regenerierung von Thumbnails, falls WooCommerce aktiv ist. 
     66- **Plugin "Regenerate Thumbnails"**: Für eine umfassendere Lösung können Sie das Plugin "Regenerate Thumbnails" verwenden. 
    4167
    4268== Donate Link ==
     69Unterstützen Sie die Weiterentwicklung: 
    4370https://www.paypal.com/donate/?hosted_button_id=RZ822WZ9HRZPS
  • thumbs/tags/1.0.1/thumbs.php

    r3085526 r3348115  
    22/**
    33 * Plugin Name:       Thumbs
    4  * Description:       Ein einfaches Tool zur Verwaltung von Thumbnail-Dateien in WordPress. Zeigt die Anzahl der Thumbnails, die gelöscht werden können, und ermöglicht es, diese zu löschen oder eine Liste der betreffenden Dateien anzuzeigen.
    5  * Version:           1.0
     4 * Description:       Verwaltung von Thumbnail-Dateien im Uploads-Ordner. Zählt potenziell löschbare Thumbnails, zeigt sie an, löscht sie und entfernt leere Ordner.
     5 * Version:           1.0.1
    66 * Author:            Sebastian Rieder
    77 * Author URI:        https://www.zeilenhoehe.de/
    88 * License:           GPL-2.0-or-later
    99 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
     10 * Requires at least: 5.9
     11 * Requires PHP:      7.4
     12 * Text Domain:       thumbs
     13 * Domain Path:       /languages
    1014 */
    1115
    1216if ( ! defined( 'ABSPATH' ) ) {
    13     exit; // Exit if accessed directly.
    14 }
    15 
    16 add_action('admin_menu', 'thumbs_menu');
     17    exit;
     18}
     19
     20add_action( 'admin_menu', 'thumbs_menu' );
     21add_action( 'admin_notices', 'thumbs_admin_notices' );
    1722
    1823function thumbs_menu() {
    19     add_menu_page('Thumbs', 'Thumbs', 'manage_options', 'thumbs', 'thumbs_admin_page');
     24    add_menu_page(
     25        __( 'Thumbs', 'thumbs' ),
     26        __( 'Thumbs', 'thumbs' ),
     27        'manage_options',
     28        'thumbs',
     29        'thumbs_admin_page',
     30        'dashicons-images-alt2',
     31        80
     32    );
     33}
     34
     35function thumbs_admin_notices() {
     36    if ( ! current_user_can( 'manage_options' ) ) {
     37        return;
     38    }
     39    if ( isset( $_GET['thumbs_msg'] ) ) {
     40        $msg = sanitize_text_field( wp_unslash( $_GET['thumbs_msg'] ) );
     41        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( $msg ) . '</p></div>';
     42    }
    2043}
    2144
    2245function thumbs_admin_page() {
    23     $upload_dir = wp_upload_dir()['basedir'];
    24     $delete_count = 0;
    25     $file_list = [];
    26     $message = '';
    27     $empty_folders_count = 0;
     46    if ( ! current_user_can( 'manage_options' ) ) {
     47        wp_die( esc_html__( 'Insufficient permissions.', 'thumbs' ) );
     48    }
     49
     50    $upload_dir_info = wp_upload_dir();
     51    $basedir         = isset( $upload_dir_info['basedir'] ) ? $upload_dir_info['basedir'] : '';
     52
     53    if ( ! $basedir || ! is_dir( $basedir ) ) {
     54        echo '<div class="wrap"><h1>Thumbs</h1><p>' . esc_html__( 'Uploads directory not found.', 'thumbs' ) . '</p></div>';
     55        return;
     56    }
     57
    2858    $nonce_action = 'thumbs_nonce_action';
    2959
    30     // Verarbeitung der POST-Anfragen
    31     if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    32         if (check_admin_referer($nonce_action, 'thumbs_nonce')) {
    33             if (isset($_POST['delete']) && current_user_can('manage_options')) {
    34                 myplugin_delete_thumbnails($upload_dir, $delete_count);
    35                 $message = "$delete_count Thumbnails wurden gelöscht.";
    36                 echo "<script>setTimeout(function(){ location.reload(); }, 2000);</script>"; // Automatische Aktualisierung
    37             } elseif (isset($_POST['show_files']) && current_user_can('manage_options')) {
    38                 myplugin_list_thumbnails($upload_dir, $file_list);
    39             } elseif (isset($_POST['delete_empty']) && current_user_can('manage_options')) {
    40                 $deleted_folders_count = myplugin_delete_empty_folders_recursive($upload_dir);
    41                 $message = "$deleted_folders_count leere Ordner wurden gelöscht.";
    42                 echo "<script>setTimeout(function(){ location.reload(); }, 2000);</script>"; // Automatische Aktualisierung
    43             }
    44         }
    45     }
    46 
    47     // Zählen der Thumbnails und leeren Ordner
    48     myplugin_count_thumbnails($upload_dir, $delete_count);
    49     $empty_folders = myplugin_find_empty_folders($upload_dir);
    50     $empty_folders_count = count($empty_folders);
    51 
    52     $message = $delete_count > 0 ? "Es würden $delete_count Thumbnails gelöscht werden." : "Es sind keine Thumbnails zum Löschen vorhanden.";
     60    // Aktionen
     61    if ( 'POST' === $_SERVER['REQUEST_METHOD'] && isset( $_POST['thumbs_action'] ) ) {
     62        check_admin_referer( $nonce_action, 'thumbs_nonce' );
     63
     64        $action = sanitize_text_field( wp_unslash( $_POST['thumbs_action'] ) );
     65
     66        if ( in_array( $action, array( 'delete', 'show_files', 'delete_empty' ), true ) ) {
     67            if ( 'delete' === $action ) {
     68                $deleted = thumbs_delete_thumbnails( $basedir );
     69                $msg     = sprintf(
     70                    /* translators: %d: number of deleted thumbnails */
     71                    _n( '%d thumbnail deleted.', '%d thumbnails deleted.', $deleted, 'thumbs' ),
     72                    $deleted
     73                );
     74                wp_safe_redirect( add_query_arg( 'thumbs_msg', rawurlencode( $msg ), menu_page_url( 'thumbs', false ) ) );
     75                exit;
     76            }
     77
     78            if ( 'delete_empty' === $action ) {
     79                $deleted_folders = thumbs_delete_empty_folders_recursive( $basedir );
     80                $msg             = sprintf(
     81                    /* translators: %d: number of deleted folders */
     82                    _n( '%d empty folder deleted.', '%d empty folders deleted.', $deleted_folders, 'thumbs' ),
     83                    $deleted_folders
     84                );
     85                wp_safe_redirect( add_query_arg( 'thumbs_msg', rawurlencode( $msg ), menu_page_url( 'thumbs', false ) ) );
     86                exit;
     87            }
     88        }
     89    }
     90
     91    // Zählungen & Liste (on demand)
     92    $thumb_count       = thumbs_count_thumbnails( $basedir );
     93    $empty_folders     = thumbs_find_empty_folders( $basedir );
     94    $empty_folders_cnt = count( $empty_folders );
    5395
    5496    echo '<div class="wrap">';
    55     echo "<h1>Thumbs</h1>";
    56        
    57     // Plugin Beschreibung und Vorsichtsmaßnahmen
     97    echo '<h1>' . esc_html__( 'Thumbs', 'thumbs' ) . '</h1>';
     98
    5899    echo '<div style="margin-bottom: 20px;">';
    59     echo '<h2>Beschreibung</h2>';
    60     echo '<p>Das Thumbs Plugin ermöglicht es Ihnen, Thumbnails auf Ihrer WordPress-Website effizient zu verwalten. Sie können die Anzahl der Thumbnails anzeigen, die gelöscht werden könnten, diese tatsächlich löschen oder eine Liste der betreffenden Dateien anzeigen.</p>';
    61     echo '<h2>Vorsichtsmaßnahmen</h2>';
     100    echo '<h2>' . esc_html__( 'Description', 'thumbs' ) . '</h2>';
     101    echo '<p>' . esc_html__( 'This tool helps you manage generated image thumbnails in your uploads directory. You can preview how many files would be removed, list them, delete them, and clean up empty folders.', 'thumbs' ) . '</p>';
     102    echo '<h2>' . esc_html__( 'Safety first', 'thumbs' ) . '</h2>';
    62103    echo '<ul>';
    63     echo '<li>Stellen Sie sicher, dass Sie ein Backup Ihrer Website erstellen, bevor Sie Thumbnails löschen.</li>';
    64     echo '<li>Verwenden Sie dieses Tool mit Vorsicht, da das Löschen von Dateien irreversible Änderungen verursachen kann.</li>';
    65     echo '<li>Testen Sie das Plugin in einer Staging-Umgebung, bevor Sie es auf einer Live-Website verwenden.</li>';
     104    echo '<li>' . esc_html__( 'Create a full backup before deleting files.', 'thumbs' ) . '</li>';
     105    echo '<li>' . esc_html__( 'Prefer running on staging first.', 'thumbs' ) . '</li>';
    66106    echo '</ul>';
    67107    echo '</div>';
    68    
    69     // Hinweis zur Regenerierung von Thumbnails
    70     echo '<div style="margin-top: 20px;">';
    71     echo '<h2>Thumbnail-Regenerierung</h2>';
    72     echo '<p>Empfehlung: Für die Regenerierung von Thumbnails auf Ihrer Website empfehle ich zwei Methoden:</p>';
    73     echo '<ul>';
    74     echo '<li><strong>Verwendung von WooCommerce:</strong> Nutzen Sie die eingebaute Thumbnail-Regenerierungsfunktion von WooCommerce, falls Sie dieses E-Commerce-Plugin verwenden.</li>';
    75     echo '<li><strong>Plugin "Regenerate Thumbnails":</strong> Für eine umfassendere Lösung empfehle ich das Plugin "Regenerate Thumbnails". Dieses Plugin ermöglicht es Ihnen, alle Thumbnails auf Ihrer Website neu zu generieren.</li>';
    76     echo '</ul>';
     108
     109    echo '<p>' . sprintf(
     110        /* translators: %d: number of thumbnails */
     111        esc_html__( 'Files that match thumbnail pattern and could be deleted: %d', 'thumbs' ),
     112        intval( $thumb_count )
     113    ) . '</p>';
     114
     115    echo '<p>' . sprintf(
     116        /* translators: %d: number of folders */
     117        esc_html__( 'Empty folders that could be removed: %d', 'thumbs' ),
     118        intval( $empty_folders_cnt )
     119    ) . '</p>';
     120
     121    echo '<form method="post" style="margin-top:1em;">';
     122    wp_nonce_field( $nonce_action, 'thumbs_nonce' );
     123    echo '<button class="button button-primary" name="thumbs_action" value="delete">' . esc_html__( 'Delete thumbnails', 'thumbs' ) . '</button> ';
     124    echo '<button class="button" name="thumbs_action" value="show_files">' . esc_html__( 'List files', 'thumbs' ) . '</button> ';
     125    echo '<button class="button" name="thumbs_action" value="delete_empty">' . esc_html__( 'Delete empty folders', 'thumbs' ) . '</button>';
     126    echo '</form>';
     127
     128    if ( isset( $_POST['thumbs_action'] ) && 'show_files' === sanitize_text_field( wp_unslash( $_POST['thumbs_action'] ) ) ) {
     129        $list = array();
     130        thumbs_list_thumbnails( $basedir, $list );
     131        echo '<div style="margin-top:20px;"><h2>' . esc_html__( 'Thumbnails list', 'thumbs' ) . '</h2>';
     132        if ( ! empty( $list ) ) {
     133            echo '<ul>';
     134            foreach ( $list as $file ) {
     135                echo '<li>' . esc_html( $file ) . '</li>';
     136            }
     137            echo '</ul>';
     138        } else {
     139            echo '<p>' . esc_html__( 'No thumbnails found.', 'thumbs' ) . '</p>';
     140        }
     141        echo '</div>';
     142    }
     143
     144    echo '<div style="margin-top:30px; padding-top:15px; border-top:1px solid #ddd;">';
     145    echo '<p>' . wp_kses_post( sprintf( __( 'Made by <a href="%s" target="_blank" rel="noopener">zeilenhoehe.de</a>', 'thumbs' ), esc_url( 'https://zeilenhoehe.de/' ) ) ) . '</p>';
    77146    echo '</div>';
    78147
    79     // Anzahl der zu löschenden Bilder und Ordner
    80     echo '<p>Anzahl der möglichen zu löschenden Bilder: ' . esc_html($delete_count) . '</p>';
    81     echo '<p>Anzahl der möglichen zu löschenden Ordner: ' . esc_html($empty_folders_count) . '</p>';
    82 
    83     // Anzeige für leere Ordner
    84     if (!empty($empty_folders)) {
    85         echo '<div style="margin-bottom: 20px;">';
    86         echo "<p>Leere Ordner wurden gelöscht.</p>";
    87         echo '</div>';
    88     }
    89 
    90     // Buttons mit CSS-Margins
    91     echo '<form method="post">';
    92     wp_nonce_field($nonce_action, 'thumbs_nonce');
    93     echo '<input type="submit" name="delete" class="button button-primary" value="Thumbnails löschen" style="margin-right: 10px;">';
    94     echo '<input type="submit" name="show_files" class="button button-secondary" value="Dateien anzeigen" style="margin-right: 10px;">';
    95     echo '<input type="submit" name="delete_empty" class="button button-secondary" value="Leere Ordner löschen">';
    96     echo '</form>';   
    97 
    98     // Anzeigen der Dateien
    99     if (isset($_POST['show_files'])) {
    100         myplugin_list_thumbnails($upload_dir, $file_list);
    101         echo '<div style="margin-top: 20px;">';
    102         echo "<h2>Liste der Thumbnails:</h2>";
    103         if (!empty($file_list)) {
    104             echo "<ul>";
    105             foreach ($file_list as $file) {
    106                 echo '<li>' . esc_html($file) . '</li>';
    107             }
    108             echo "</ul>";
    109         } else {
    110             echo "<p>Keine Thumbnails gefunden.</p>";
    111         }
    112         echo '</div>';
    113     }
    114    
    115    // Footer mit Autor-Informationen und Thumbnail-Regenerierungshinweis
    116     echo '<div style="margin-top: 30px; padding-top: 15px; border-top: 1px solid #ddd;">';
    117     echo '<p>Realisiert von <a href="https://zeilenhoehe.de/" target="_blank">zeilenhoehe.de</a></p>';
    118148    echo '</div>';
    119149}
    120150
    121 function myplugin_count_thumbnails($dir, &$count = 0) {
    122     $files = glob($dir . '/*');
    123     foreach ($files as $file) {
    124         if (is_dir($file)) {
    125             myplugin_count_thumbnails($file, $count);
    126         } else {
    127             if (preg_match('/-\d+x\d+\./', $file)) {
     151/**
     152 * Recognize only typical WP-generated thumbnail files:
     153 * - must contain "-{width}x{height}."
     154 * - must have a known image extension
     155 */
     156function thumbs_is_thumbnail_file( $path ) {
     157    $ext_ok = preg_match( '/\.(jpe?g|png|gif|webp|avif)$/i', $path );
     158    $dim_ok = preg_match( '/-\d+x\d+\.(?:jpe?g|png|gif|webp|avif)$/i', $path );
     159    return $ext_ok && $dim_ok;
     160}
     161
     162function thumbs_count_thumbnails( $dir, &$count = 0 ) {
     163    $items = glob( trailingslashit( $dir ) . '*' );
     164    if ( ! $items ) {
     165        return $count;
     166    }
     167    foreach ( $items as $item ) {
     168        if ( is_dir( $item ) ) {
     169            thumbs_count_thumbnails( $item, $count );
     170        } else {
     171            if ( thumbs_is_thumbnail_file( $item ) ) {
    128172                $count++;
    129173            }
    130174        }
    131175    }
    132 }
    133 
    134 function myplugin_delete_thumbnails($dir, &$count = 0) {
    135     $files = glob($dir . '/*');
    136     foreach ($files as $file) {
    137         if (is_dir($file)) {
    138             myplugin_delete_thumbnails($file, $count);
    139         } else {
    140             if (preg_match('/-\d+x\d+\./', $file)) {
    141                 unlink($file);
    142                 $count++;
    143             }
    144         }
    145     }
    146 }
    147 
    148 function myplugin_list_thumbnails($dir, &$file_list) {
    149     $files = glob($dir . '/*');
    150     foreach ($files as $file) {
    151         if (is_dir($file)) {
    152             myplugin_list_thumbnails($file, $file_list);
    153         } else {
    154             if (preg_match('/-\d+x\d+\./', $file)) {
    155                 $file_list[] = $file;
    156             }
    157         }
    158     }
    159 }
    160 
    161 function myplugin_find_empty_folders($dir) {
    162     $empty_folders = [];
    163     $dirs = glob($dir . '/*', GLOB_ONLYDIR);
    164     foreach ($dirs as $dir) {
    165         $subdirs = myplugin_find_empty_folders($dir);
    166         if (count(glob($dir . '/*')) === 0 && empty($subdirs)) {
    167             $empty_folders[] = $dir;
     176    return $count;
     177}
     178
     179function thumbs_list_thumbnails( $dir, &$list ) {
     180    $items = glob( trailingslashit( $dir ) . '*' );
     181    if ( ! $items ) {
     182        return;
     183    }
     184    foreach ( $items as $item ) {
     185        if ( is_dir( $item ) ) {
     186            thumbs_list_thumbnails( $item, $list );
     187        } else {
     188            if ( thumbs_is_thumbnail_file( $item ) ) {
     189                $list[] = $item;
     190            }
     191        }
     192    }
     193}
     194
     195/**
     196 * Delete via WP_Filesystem API
     197 */
     198function thumbs_delete_thumbnails( $dir ) {
     199    require_once ABSPATH . 'wp-admin/includes/file.php';
     200    WP_Filesystem();
     201    global $wp_filesystem;
     202
     203    $deleted = 0;
     204    $items   = glob( trailingslashit( $dir ) . '*' );
     205    if ( ! $items ) {
     206        return 0;
     207    }
     208    foreach ( $items as $item ) {
     209        if ( is_dir( $item ) ) {
     210            $deleted += thumbs_delete_thumbnails( $item );
     211        } else {
     212            if ( thumbs_is_thumbnail_file( $item ) && $wp_filesystem && $wp_filesystem->delete( $item ) ) {
     213                $deleted++;
     214            }
     215        }
     216    }
     217    return $deleted;
     218}
     219
     220function thumbs_find_empty_folders( $dir ) {
     221    $empty_folders = array();
     222    $dirs          = glob( trailingslashit( $dir ) . '*', GLOB_ONLYDIR );
     223    if ( ! $dirs ) {
     224        return $empty_folders;
     225    }
     226    foreach ( $dirs as $subdir ) {
     227        $sub_empty = thumbs_find_empty_folders( $subdir );
     228        $has_files = glob( trailingslashit( $subdir ) . '*' );
     229        if ( empty( $has_files ) && empty( $sub_empty ) ) {
     230            $empty_folders[] = $subdir;
     231        } else {
     232            $empty_folders   = array_merge( $empty_folders, $sub_empty );
    168233        }
    169234    }
     
    171236}
    172237
    173 function myplugin_delete_empty_folders_recursive($dir) {
    174     $empty_folders = myplugin_find_empty_folders($dir);
    175     $deleted_folders_count = 0;
    176     foreach ($empty_folders as $empty_folder) {
    177         rmdir($empty_folder);
    178         $deleted_folders_count++;
    179     }
    180     return $deleted_folders_count;
    181 }
    182 ?>
     238function thumbs_delete_empty_folders_recursive( $dir ) {
     239    require_once ABSPATH . 'wp-admin/includes/file.php';
     240    WP_Filesystem();
     241    global $wp_filesystem;
     242
     243    $empty_folders = thumbs_find_empty_folders( $dir );
     244    $deleted       = 0;
     245    foreach ( $empty_folders as $folder ) {
     246        if ( $wp_filesystem && $wp_filesystem->rmdir( $folder ) ) {
     247            $deleted++;
     248        }
     249    }
     250    return $deleted;
     251}
  • thumbs/trunk/readme.txt

    r3085537 r3348115  
    22Contributors: zeilenhoehe
    33Donate link: https://www.paypal.com/donate/?hosted_button_id=RZ822WZ9HRZPS
    4 Tags: thumbnails, media, images, optimization
     4Tags: thumbnails, media, images, cleanup, optimization
    55Requires at least: 5.9
    6 Tested up to: 6.4
    7 Stable tag: 1.0
     6Tested up to: 6.8
     7Stable tag: 1.0.1
    88Requires PHP: 7.4
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1111
    12 Ein einfaches Tool zur Verwaltung von Thumbnail-Dateien in WordPress, das Speicherplatz spart und die Website-Leistung verbessert.
     12Ein einfaches Tool zur Verwaltung von Thumbnail-Dateien in WordPress. Zählt, listet und löscht generierte Thumbnails und entfernt leere Upload-Ordner, um Speicherplatz zu sparen und die Performance zu verbessern.
    1313
    1414== Description ==
    15 "Thumbs" ist ein WordPress-Plugin zur effizienten Verwaltung von Thumbnail-Dateien. Es ermöglicht Ihnen, Thumbnails zu zählen, zu löschen, eine Liste der Thumbnails anzuzeigen und leere Ordner zu entfernen. Dieses Plugin hilft, Speicherplatz zu sparen und die Performance Ihrer Website zu verbessern.
     15"Thumbs" ist ein WordPress-Plugin zur effizienten Verwaltung automatisch erzeugter Thumbnails im Uploads-Verzeichnis. 
     16Es ermöglicht Ihnen:
     17* Thumbnails zählen, die gelöscht werden könnten 
     18* Liste der betroffenen Dateien anzeigen 
     19* Thumbnails sicher löschen 
     20* Leere Ordner im Uploads-Verzeichnis entfernen 
     21
     22Dies hilft, Speicherplatz zu sparen und die Performance Ihrer Website zu verbessern.
     23
     24**Sicherheitshinweise:**
     25- Erstellen Sie unbedingt ein Backup, bevor Sie Dateien löschen. 
     26- Testen Sie das Plugin idealerweise in einer Staging-Umgebung. 
     27- Das Plugin löscht **nur Thumbnail-Dateien**, die dem Muster `-WIDTHxHEIGHT.jpg/png/...` entsprechen. Originalbilder bleiben unberührt. 
    1628
    1729== Installation ==
    18 1. Laden Sie das Plugin herunter und entpacken Sie die Datei.
    19 2. Laden Sie den Plugin-Ordner in das Verzeichnis `/wp-content/plugins/` Ihrer WordPress-Installation hoch.
    20 3. Aktivieren Sie das Plugin im "Plugins"-Bereich Ihres WordPress-Dashboards.
     301. Laden Sie das Plugin herunter und entpacken Sie die Datei. 
     312. Laden Sie den Ordner `thumbs` in das Verzeichnis `/wp-content/plugins/` Ihrer WordPress-Installation hoch. 
     323. Aktivieren Sie das Plugin im Menü **Plugins** in Ihrem WordPress-Dashboard. 
     334. Gehen Sie im Admin-Menü auf **Thumbs**, um die Funktionen zu nutzen. 
    2134
    2235== Frequently Asked Questions ==
    23 = Ist es sicher, Thumbnails zu löschen? =
    24 Ja, aber stellen Sie sicher, dass Sie ein Backup haben, da das Löschen von Dateien irreversible Änderungen verursachen kann.
     36= Ist es sicher, Thumbnails zu löschen? = 
     37Ja, solange Sie vorher ein Backup erstellen. Das Löschen ist irreversibel. 
     38
     39= Werden Originalbilder gelöscht? = 
     40Nein, nur automatisch erzeugte Thumbnails, die `-WIDTHxHEIGHT` im Dateinamen enthalten. 
     41
     42= Funktioniert das Plugin auch mit Multisite? = 
     43Es arbeitet im Uploads-Verzeichnis der jeweiligen Site. 
    2544
    2645== Screenshots ==
    27 1. Übersicht
     461. Admin-Seite des Plugins mit Übersicht und Löschoptionen 
    2847
    2948== Changelog ==
     49= 1.0.1 =
     50* Kompatibel mit WordPress 6.8 („Tested up to“ aktualisiert) 
     51* Sichereres Löschen über WP_Filesystem API 
     52* Striktere Erkennung von Thumbnail-Dateien (`jpg|jpeg|png|gif|webp|avif`) 
     53* Bugfix bei der Erkennung leerer Ordner 
     54* Übersetzungsunterstützung (Textdomain ergänzt) 
     55
    3056= 1.0 =
    31 * Erstveröffentlichung des Plugins.
     57* Erstveröffentlichung des Plugins 
    3258
    3359== Upgrade Notice ==
    34 = 1.0 =
    35 Erstveröffentlichung. Bitte erstellen Sie ein Backup, bevor Sie das Plugin verwenden.
     60= 1.0.1 =
     61Update für WordPress 6.8. Verbesserte Sicherheit und Fehlerbehebung. Backup dringend empfohlen. 
    3662
    3763== Additional Information ==
    3864= Regenerierung von Thumbnails =
    39 - **WooCommerce**: Nutzen Sie die integrierte Funktion zur Thumbnail-Regenerierung in WooCommerce.
    40 - **Plugin 'Regenerate Thumbnails'**: Für eine umfassendere Lösung können Sie das Plugin "Regenerate Thumbnails" verwenden.
     65- **WooCommerce**: Nutzen Sie die eingebaute Funktion zur Regenerierung von Thumbnails, falls WooCommerce aktiv ist. 
     66- **Plugin "Regenerate Thumbnails"**: Für eine umfassendere Lösung können Sie das Plugin "Regenerate Thumbnails" verwenden. 
    4167
    4268== Donate Link ==
     69Unterstützen Sie die Weiterentwicklung: 
    4370https://www.paypal.com/donate/?hosted_button_id=RZ822WZ9HRZPS
  • thumbs/trunk/thumbs.php

    r3085526 r3348115  
    22/**
    33 * Plugin Name:       Thumbs
    4  * Description:       Ein einfaches Tool zur Verwaltung von Thumbnail-Dateien in WordPress. Zeigt die Anzahl der Thumbnails, die gelöscht werden können, und ermöglicht es, diese zu löschen oder eine Liste der betreffenden Dateien anzuzeigen.
    5  * Version:           1.0
     4 * Description:       Verwaltung von Thumbnail-Dateien im Uploads-Ordner. Zählt potenziell löschbare Thumbnails, zeigt sie an, löscht sie und entfernt leere Ordner.
     5 * Version:           1.0.1
    66 * Author:            Sebastian Rieder
    77 * Author URI:        https://www.zeilenhoehe.de/
    88 * License:           GPL-2.0-or-later
    99 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
     10 * Requires at least: 5.9
     11 * Requires PHP:      7.4
     12 * Text Domain:       thumbs
     13 * Domain Path:       /languages
    1014 */
    1115
    1216if ( ! defined( 'ABSPATH' ) ) {
    13     exit; // Exit if accessed directly.
    14 }
    15 
    16 add_action('admin_menu', 'thumbs_menu');
     17    exit;
     18}
     19
     20add_action( 'admin_menu', 'thumbs_menu' );
     21add_action( 'admin_notices', 'thumbs_admin_notices' );
    1722
    1823function thumbs_menu() {
    19     add_menu_page('Thumbs', 'Thumbs', 'manage_options', 'thumbs', 'thumbs_admin_page');
     24    add_menu_page(
     25        __( 'Thumbs', 'thumbs' ),
     26        __( 'Thumbs', 'thumbs' ),
     27        'manage_options',
     28        'thumbs',
     29        'thumbs_admin_page',
     30        'dashicons-images-alt2',
     31        80
     32    );
     33}
     34
     35function thumbs_admin_notices() {
     36    if ( ! current_user_can( 'manage_options' ) ) {
     37        return;
     38    }
     39    if ( isset( $_GET['thumbs_msg'] ) ) {
     40        $msg = sanitize_text_field( wp_unslash( $_GET['thumbs_msg'] ) );
     41        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( $msg ) . '</p></div>';
     42    }
    2043}
    2144
    2245function thumbs_admin_page() {
    23     $upload_dir = wp_upload_dir()['basedir'];
    24     $delete_count = 0;
    25     $file_list = [];
    26     $message = '';
    27     $empty_folders_count = 0;
     46    if ( ! current_user_can( 'manage_options' ) ) {
     47        wp_die( esc_html__( 'Insufficient permissions.', 'thumbs' ) );
     48    }
     49
     50    $upload_dir_info = wp_upload_dir();
     51    $basedir         = isset( $upload_dir_info['basedir'] ) ? $upload_dir_info['basedir'] : '';
     52
     53    if ( ! $basedir || ! is_dir( $basedir ) ) {
     54        echo '<div class="wrap"><h1>Thumbs</h1><p>' . esc_html__( 'Uploads directory not found.', 'thumbs' ) . '</p></div>';
     55        return;
     56    }
     57
    2858    $nonce_action = 'thumbs_nonce_action';
    2959
    30     // Verarbeitung der POST-Anfragen
    31     if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    32         if (check_admin_referer($nonce_action, 'thumbs_nonce')) {
    33             if (isset($_POST['delete']) && current_user_can('manage_options')) {
    34                 myplugin_delete_thumbnails($upload_dir, $delete_count);
    35                 $message = "$delete_count Thumbnails wurden gelöscht.";
    36                 echo "<script>setTimeout(function(){ location.reload(); }, 2000);</script>"; // Automatische Aktualisierung
    37             } elseif (isset($_POST['show_files']) && current_user_can('manage_options')) {
    38                 myplugin_list_thumbnails($upload_dir, $file_list);
    39             } elseif (isset($_POST['delete_empty']) && current_user_can('manage_options')) {
    40                 $deleted_folders_count = myplugin_delete_empty_folders_recursive($upload_dir);
    41                 $message = "$deleted_folders_count leere Ordner wurden gelöscht.";
    42                 echo "<script>setTimeout(function(){ location.reload(); }, 2000);</script>"; // Automatische Aktualisierung
    43             }
    44         }
    45     }
    46 
    47     // Zählen der Thumbnails und leeren Ordner
    48     myplugin_count_thumbnails($upload_dir, $delete_count);
    49     $empty_folders = myplugin_find_empty_folders($upload_dir);
    50     $empty_folders_count = count($empty_folders);
    51 
    52     $message = $delete_count > 0 ? "Es würden $delete_count Thumbnails gelöscht werden." : "Es sind keine Thumbnails zum Löschen vorhanden.";
     60    // Aktionen
     61    if ( 'POST' === $_SERVER['REQUEST_METHOD'] && isset( $_POST['thumbs_action'] ) ) {
     62        check_admin_referer( $nonce_action, 'thumbs_nonce' );
     63
     64        $action = sanitize_text_field( wp_unslash( $_POST['thumbs_action'] ) );
     65
     66        if ( in_array( $action, array( 'delete', 'show_files', 'delete_empty' ), true ) ) {
     67            if ( 'delete' === $action ) {
     68                $deleted = thumbs_delete_thumbnails( $basedir );
     69                $msg     = sprintf(
     70                    /* translators: %d: number of deleted thumbnails */
     71                    _n( '%d thumbnail deleted.', '%d thumbnails deleted.', $deleted, 'thumbs' ),
     72                    $deleted
     73                );
     74                wp_safe_redirect( add_query_arg( 'thumbs_msg', rawurlencode( $msg ), menu_page_url( 'thumbs', false ) ) );
     75                exit;
     76            }
     77
     78            if ( 'delete_empty' === $action ) {
     79                $deleted_folders = thumbs_delete_empty_folders_recursive( $basedir );
     80                $msg             = sprintf(
     81                    /* translators: %d: number of deleted folders */
     82                    _n( '%d empty folder deleted.', '%d empty folders deleted.', $deleted_folders, 'thumbs' ),
     83                    $deleted_folders
     84                );
     85                wp_safe_redirect( add_query_arg( 'thumbs_msg', rawurlencode( $msg ), menu_page_url( 'thumbs', false ) ) );
     86                exit;
     87            }
     88        }
     89    }
     90
     91    // Zählungen & Liste (on demand)
     92    $thumb_count       = thumbs_count_thumbnails( $basedir );
     93    $empty_folders     = thumbs_find_empty_folders( $basedir );
     94    $empty_folders_cnt = count( $empty_folders );
    5395
    5496    echo '<div class="wrap">';
    55     echo "<h1>Thumbs</h1>";
    56        
    57     // Plugin Beschreibung und Vorsichtsmaßnahmen
     97    echo '<h1>' . esc_html__( 'Thumbs', 'thumbs' ) . '</h1>';
     98
    5899    echo '<div style="margin-bottom: 20px;">';
    59     echo '<h2>Beschreibung</h2>';
    60     echo '<p>Das Thumbs Plugin ermöglicht es Ihnen, Thumbnails auf Ihrer WordPress-Website effizient zu verwalten. Sie können die Anzahl der Thumbnails anzeigen, die gelöscht werden könnten, diese tatsächlich löschen oder eine Liste der betreffenden Dateien anzeigen.</p>';
    61     echo '<h2>Vorsichtsmaßnahmen</h2>';
     100    echo '<h2>' . esc_html__( 'Description', 'thumbs' ) . '</h2>';
     101    echo '<p>' . esc_html__( 'This tool helps you manage generated image thumbnails in your uploads directory. You can preview how many files would be removed, list them, delete them, and clean up empty folders.', 'thumbs' ) . '</p>';
     102    echo '<h2>' . esc_html__( 'Safety first', 'thumbs' ) . '</h2>';
    62103    echo '<ul>';
    63     echo '<li>Stellen Sie sicher, dass Sie ein Backup Ihrer Website erstellen, bevor Sie Thumbnails löschen.</li>';
    64     echo '<li>Verwenden Sie dieses Tool mit Vorsicht, da das Löschen von Dateien irreversible Änderungen verursachen kann.</li>';
    65     echo '<li>Testen Sie das Plugin in einer Staging-Umgebung, bevor Sie es auf einer Live-Website verwenden.</li>';
     104    echo '<li>' . esc_html__( 'Create a full backup before deleting files.', 'thumbs' ) . '</li>';
     105    echo '<li>' . esc_html__( 'Prefer running on staging first.', 'thumbs' ) . '</li>';
    66106    echo '</ul>';
    67107    echo '</div>';
    68    
    69     // Hinweis zur Regenerierung von Thumbnails
    70     echo '<div style="margin-top: 20px;">';
    71     echo '<h2>Thumbnail-Regenerierung</h2>';
    72     echo '<p>Empfehlung: Für die Regenerierung von Thumbnails auf Ihrer Website empfehle ich zwei Methoden:</p>';
    73     echo '<ul>';
    74     echo '<li><strong>Verwendung von WooCommerce:</strong> Nutzen Sie die eingebaute Thumbnail-Regenerierungsfunktion von WooCommerce, falls Sie dieses E-Commerce-Plugin verwenden.</li>';
    75     echo '<li><strong>Plugin "Regenerate Thumbnails":</strong> Für eine umfassendere Lösung empfehle ich das Plugin "Regenerate Thumbnails". Dieses Plugin ermöglicht es Ihnen, alle Thumbnails auf Ihrer Website neu zu generieren.</li>';
    76     echo '</ul>';
     108
     109    echo '<p>' . sprintf(
     110        /* translators: %d: number of thumbnails */
     111        esc_html__( 'Files that match thumbnail pattern and could be deleted: %d', 'thumbs' ),
     112        intval( $thumb_count )
     113    ) . '</p>';
     114
     115    echo '<p>' . sprintf(
     116        /* translators: %d: number of folders */
     117        esc_html__( 'Empty folders that could be removed: %d', 'thumbs' ),
     118        intval( $empty_folders_cnt )
     119    ) . '</p>';
     120
     121    echo '<form method="post" style="margin-top:1em;">';
     122    wp_nonce_field( $nonce_action, 'thumbs_nonce' );
     123    echo '<button class="button button-primary" name="thumbs_action" value="delete">' . esc_html__( 'Delete thumbnails', 'thumbs' ) . '</button> ';
     124    echo '<button class="button" name="thumbs_action" value="show_files">' . esc_html__( 'List files', 'thumbs' ) . '</button> ';
     125    echo '<button class="button" name="thumbs_action" value="delete_empty">' . esc_html__( 'Delete empty folders', 'thumbs' ) . '</button>';
     126    echo '</form>';
     127
     128    if ( isset( $_POST['thumbs_action'] ) && 'show_files' === sanitize_text_field( wp_unslash( $_POST['thumbs_action'] ) ) ) {
     129        $list = array();
     130        thumbs_list_thumbnails( $basedir, $list );
     131        echo '<div style="margin-top:20px;"><h2>' . esc_html__( 'Thumbnails list', 'thumbs' ) . '</h2>';
     132        if ( ! empty( $list ) ) {
     133            echo '<ul>';
     134            foreach ( $list as $file ) {
     135                echo '<li>' . esc_html( $file ) . '</li>';
     136            }
     137            echo '</ul>';
     138        } else {
     139            echo '<p>' . esc_html__( 'No thumbnails found.', 'thumbs' ) . '</p>';
     140        }
     141        echo '</div>';
     142    }
     143
     144    echo '<div style="margin-top:30px; padding-top:15px; border-top:1px solid #ddd;">';
     145    echo '<p>' . wp_kses_post( sprintf( __( 'Made by <a href="%s" target="_blank" rel="noopener">zeilenhoehe.de</a>', 'thumbs' ), esc_url( 'https://zeilenhoehe.de/' ) ) ) . '</p>';
    77146    echo '</div>';
    78147
    79     // Anzahl der zu löschenden Bilder und Ordner
    80     echo '<p>Anzahl der möglichen zu löschenden Bilder: ' . esc_html($delete_count) . '</p>';
    81     echo '<p>Anzahl der möglichen zu löschenden Ordner: ' . esc_html($empty_folders_count) . '</p>';
    82 
    83     // Anzeige für leere Ordner
    84     if (!empty($empty_folders)) {
    85         echo '<div style="margin-bottom: 20px;">';
    86         echo "<p>Leere Ordner wurden gelöscht.</p>";
    87         echo '</div>';
    88     }
    89 
    90     // Buttons mit CSS-Margins
    91     echo '<form method="post">';
    92     wp_nonce_field($nonce_action, 'thumbs_nonce');
    93     echo '<input type="submit" name="delete" class="button button-primary" value="Thumbnails löschen" style="margin-right: 10px;">';
    94     echo '<input type="submit" name="show_files" class="button button-secondary" value="Dateien anzeigen" style="margin-right: 10px;">';
    95     echo '<input type="submit" name="delete_empty" class="button button-secondary" value="Leere Ordner löschen">';
    96     echo '</form>';   
    97 
    98     // Anzeigen der Dateien
    99     if (isset($_POST['show_files'])) {
    100         myplugin_list_thumbnails($upload_dir, $file_list);
    101         echo '<div style="margin-top: 20px;">';
    102         echo "<h2>Liste der Thumbnails:</h2>";
    103         if (!empty($file_list)) {
    104             echo "<ul>";
    105             foreach ($file_list as $file) {
    106                 echo '<li>' . esc_html($file) . '</li>';
    107             }
    108             echo "</ul>";
    109         } else {
    110             echo "<p>Keine Thumbnails gefunden.</p>";
    111         }
    112         echo '</div>';
    113     }
    114    
    115    // Footer mit Autor-Informationen und Thumbnail-Regenerierungshinweis
    116     echo '<div style="margin-top: 30px; padding-top: 15px; border-top: 1px solid #ddd;">';
    117     echo '<p>Realisiert von <a href="https://zeilenhoehe.de/" target="_blank">zeilenhoehe.de</a></p>';
    118148    echo '</div>';
    119149}
    120150
    121 function myplugin_count_thumbnails($dir, &$count = 0) {
    122     $files = glob($dir . '/*');
    123     foreach ($files as $file) {
    124         if (is_dir($file)) {
    125             myplugin_count_thumbnails($file, $count);
    126         } else {
    127             if (preg_match('/-\d+x\d+\./', $file)) {
     151/**
     152 * Recognize only typical WP-generated thumbnail files:
     153 * - must contain "-{width}x{height}."
     154 * - must have a known image extension
     155 */
     156function thumbs_is_thumbnail_file( $path ) {
     157    $ext_ok = preg_match( '/\.(jpe?g|png|gif|webp|avif)$/i', $path );
     158    $dim_ok = preg_match( '/-\d+x\d+\.(?:jpe?g|png|gif|webp|avif)$/i', $path );
     159    return $ext_ok && $dim_ok;
     160}
     161
     162function thumbs_count_thumbnails( $dir, &$count = 0 ) {
     163    $items = glob( trailingslashit( $dir ) . '*' );
     164    if ( ! $items ) {
     165        return $count;
     166    }
     167    foreach ( $items as $item ) {
     168        if ( is_dir( $item ) ) {
     169            thumbs_count_thumbnails( $item, $count );
     170        } else {
     171            if ( thumbs_is_thumbnail_file( $item ) ) {
    128172                $count++;
    129173            }
    130174        }
    131175    }
    132 }
    133 
    134 function myplugin_delete_thumbnails($dir, &$count = 0) {
    135     $files = glob($dir . '/*');
    136     foreach ($files as $file) {
    137         if (is_dir($file)) {
    138             myplugin_delete_thumbnails($file, $count);
    139         } else {
    140             if (preg_match('/-\d+x\d+\./', $file)) {
    141                 unlink($file);
    142                 $count++;
    143             }
    144         }
    145     }
    146 }
    147 
    148 function myplugin_list_thumbnails($dir, &$file_list) {
    149     $files = glob($dir . '/*');
    150     foreach ($files as $file) {
    151         if (is_dir($file)) {
    152             myplugin_list_thumbnails($file, $file_list);
    153         } else {
    154             if (preg_match('/-\d+x\d+\./', $file)) {
    155                 $file_list[] = $file;
    156             }
    157         }
    158     }
    159 }
    160 
    161 function myplugin_find_empty_folders($dir) {
    162     $empty_folders = [];
    163     $dirs = glob($dir . '/*', GLOB_ONLYDIR);
    164     foreach ($dirs as $dir) {
    165         $subdirs = myplugin_find_empty_folders($dir);
    166         if (count(glob($dir . '/*')) === 0 && empty($subdirs)) {
    167             $empty_folders[] = $dir;
     176    return $count;
     177}
     178
     179function thumbs_list_thumbnails( $dir, &$list ) {
     180    $items = glob( trailingslashit( $dir ) . '*' );
     181    if ( ! $items ) {
     182        return;
     183    }
     184    foreach ( $items as $item ) {
     185        if ( is_dir( $item ) ) {
     186            thumbs_list_thumbnails( $item, $list );
     187        } else {
     188            if ( thumbs_is_thumbnail_file( $item ) ) {
     189                $list[] = $item;
     190            }
     191        }
     192    }
     193}
     194
     195/**
     196 * Delete via WP_Filesystem API
     197 */
     198function thumbs_delete_thumbnails( $dir ) {
     199    require_once ABSPATH . 'wp-admin/includes/file.php';
     200    WP_Filesystem();
     201    global $wp_filesystem;
     202
     203    $deleted = 0;
     204    $items   = glob( trailingslashit( $dir ) . '*' );
     205    if ( ! $items ) {
     206        return 0;
     207    }
     208    foreach ( $items as $item ) {
     209        if ( is_dir( $item ) ) {
     210            $deleted += thumbs_delete_thumbnails( $item );
     211        } else {
     212            if ( thumbs_is_thumbnail_file( $item ) && $wp_filesystem && $wp_filesystem->delete( $item ) ) {
     213                $deleted++;
     214            }
     215        }
     216    }
     217    return $deleted;
     218}
     219
     220function thumbs_find_empty_folders( $dir ) {
     221    $empty_folders = array();
     222    $dirs          = glob( trailingslashit( $dir ) . '*', GLOB_ONLYDIR );
     223    if ( ! $dirs ) {
     224        return $empty_folders;
     225    }
     226    foreach ( $dirs as $subdir ) {
     227        $sub_empty = thumbs_find_empty_folders( $subdir );
     228        $has_files = glob( trailingslashit( $subdir ) . '*' );
     229        if ( empty( $has_files ) && empty( $sub_empty ) ) {
     230            $empty_folders[] = $subdir;
     231        } else {
     232            $empty_folders   = array_merge( $empty_folders, $sub_empty );
    168233        }
    169234    }
     
    171236}
    172237
    173 function myplugin_delete_empty_folders_recursive($dir) {
    174     $empty_folders = myplugin_find_empty_folders($dir);
    175     $deleted_folders_count = 0;
    176     foreach ($empty_folders as $empty_folder) {
    177         rmdir($empty_folder);
    178         $deleted_folders_count++;
    179     }
    180     return $deleted_folders_count;
    181 }
    182 ?>
     238function thumbs_delete_empty_folders_recursive( $dir ) {
     239    require_once ABSPATH . 'wp-admin/includes/file.php';
     240    WP_Filesystem();
     241    global $wp_filesystem;
     242
     243    $empty_folders = thumbs_find_empty_folders( $dir );
     244    $deleted       = 0;
     245    foreach ( $empty_folders as $folder ) {
     246        if ( $wp_filesystem && $wp_filesystem->rmdir( $folder ) ) {
     247            $deleted++;
     248        }
     249    }
     250    return $deleted;
     251}
Note: See TracChangeset for help on using the changeset viewer.