WordPress.org

Plugin Directory

Changeset 478913


Ignore:
Timestamp:
12/21/11 22:30:29 (2 years ago)
Author:
gluten
Message:

Update to version 0.3

Location:
delete-custom-fields
Files:
28 added
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • delete-custom-fields/tags/0.3/delete-custom-fields.php

    r455960 r478913  
    33Plugin Name: Delete Custom Fields 
    44Description: Ever have one erroneously entered custom field name confuse all of your users and you just can't figure out how to get rid of it? Delete Custom Fields will let you delete every instance of a custom field from your site.  
    5 Version: 0.2 
     5Version: 0.3 
    66License: GPL version 2 or any later version 
    77Author: Sam Margulies 
    88Author URI: http://belabor.org/ 
    99 
    10 Copyright 2011  Sam Margulies  (email : freebuffalo@gmail.com) 
     10Copyright 2011  Sam Margulies  (email : sam@belabor.org) 
     11 
     12*** 
     13Progress display and ajax functionality heavily influenced by Viper007Bond's awesome Regenerate Thumbnails plugin. 
    1114 
    1215*/ 
    1316 
    1417class Delete_Custom_Fields { 
     18 
    1519    static $instance; 
    16  
     20    var $menu_id; 
     21     
    1722    function __construct() { 
    1823        self::$instance =& $this; 
    1924        // add page to tools menu  
    20         add_action('admin_menu', array( &$this, 'add_menu') ); 
    21         add_filter('plugin_action_links', array( &$this, 'plugin_action_links'), 10, 2); 
    22  
    23  
    24     } 
     25        add_action('admin_menu',                    array( &$this, 'add_menu') ); 
     26        add_filter('plugin_action_links',           array( &$this, 'plugin_action_links'), 10, 2); 
     27        add_action( 'wp_ajax_deletecustomfield',    array( &$this, 'ajax_delete_field' ) ); 
     28        add_action( 'admin_enqueue_scripts',        array( &$this, 'admin_enqueues' ) ); 
     29 
     30    } 
     31     
    2532    function add_menu() { 
    26         add_management_page( 'Delete Custom Fields', 'Delete Custom Fields', 'manage_options', 'delete-custom-fields', array( &$this, 'admin_page' ) ); 
    27     } 
     33        $this->menu_id = add_management_page( 'Delete Custom Fields', 'Delete Custom Fields', 'manage_options', 'delete-custom-fields', array( &$this, 'admin_page' ) ); 
     34    } 
     35     
     36    // Enqueue the needed Javascript and CSS 
     37    function admin_enqueues( $hook_suffix ) { 
     38        if ( $hook_suffix != $this->menu_id ) 
     39            return; 
     40 
     41        // WordPress 3.1 vs older version compatibility 
     42        if ( wp_script_is( 'jquery-ui-widget', 'registered' ) ) 
     43            wp_enqueue_script( 'jquery-ui-progressbar', plugins_url( 'js/jquery.ui.progressbar.min.js', __FILE__ ), array( 'jquery-ui-core', 'jquery-ui-widget' ), '1.8.6' ); 
     44        else 
     45            wp_enqueue_script( 'jquery-ui-progressbar', plugins_url( 'js/jquery.ui.progressbar.min.1.7.2.js', __FILE__ ), array( 'jquery-ui-core' ), '1.7.2' ); 
     46 
     47        wp_enqueue_style( 'delete-custom-fields-styles', plugins_url( 'css/delete-custom-fields.css', __FILE__ ), array(), '1.7.2' ); 
     48    } 
     49     
    2850    function get_all_meta_keys( $include_hidden = false ) { 
    2951        global $wpdb;        
    30         $limit = 50; 
     52        $limit = 100; 
    3153        $include_hidden = ($include_hidden) ? "" : "HAVING meta_key NOT LIKE '\_%'"; 
    3254        $keys = $wpdb->get_col( " 
     
    4163     
    4264    function get_all_posts_for_meta_key( $key ) { 
     65     
     66        @ini_set('memory_limit', WP_MAX_MEMORY_LIMIT); 
     67         
    4368        $custom_value_query = new WP_Query( array( 
    4469            'post_type' => 'any', 
     
    7095        $posts = $this->get_all_posts_for_meta_key( $key ); 
    7196         
    72         if( ! $posts ) { return false; } 
     97        if( ! $posts ) { return true; } 
    7398         
    7499        foreach( $posts as $post ) { 
     
    76101        } 
    77102         
    78         return true; 
     103        return ! $this->get_all_posts_for_meta_key( $key ); 
    79104    } 
    80105     
     
    84109        } 
    85110         
    86         // Now display the settings editing screen 
    87111 
    88112        echo '<div class="wrap">'; 
     
    91115     
    92116        echo "<h2>" . __( 'Delete Custom Fields', 'delete-custom-fields' ) . "</h2>"; 
     117        echo '<div class="narrow">'; 
     118         
     119        echo '<div id="message" class="error fade hidden"></div>'; 
     120 
     121        echo '<noscript><div class="error"><p><strong>' . __( 'You must enable Javascript in order to proceed!', 'delete-custom-fields'  ) . '</strong></p></div></noscript>'; 
     122 
    93123        // see if we have some fields to delete 
    94124                 
    95         if ( !empty( $_POST ) &&  
    96              check_admin_referer( 'delete_custom_fields','delete_custom_fields_nonce' ) &&  
    97              isset( $_POST['custom-field-to-delete'] ) ) { 
    98               
    99             $custom_field = esc_attr( $_POST['custom-field-to-delete'] ); 
    100              
    101             $deleted = Delete_Custom_Fields::remove_all_meta_with_key( $custom_field ); 
    102              
    103             if( $deleted ) { 
    104                 ?> 
    105              
    106                 <div class="updated"><p><?php printf(__("The custom field <strong>%s</strong> has been deleted.", 'delete-custom-fields'), $custom_field); ?></p></div> 
    107              
    108                 <?php 
    109             } 
    110  
    111         }    
    112          
    113         // settings form 
    114          
     125        if ( ! empty( $_REQUEST['custom-field-to-delete'] ) ) { 
     126         
     127            check_admin_referer( 'delete_custom_fields' ); 
     128             
     129            $custom_field = esc_attr( $_REQUEST['custom-field-to-delete'] ); 
     130             
     131            echo '<p>' . __( "Please be patient while the fields are deleted. This can take a while if the field is used in many posts or if your server is slow. Do not navigate away from this page until this script is done or the fields will not be deleted. You will be notified via this page when the process is complete.", 'delete-custom-fields' ) . '</p>'; 
     132 
     133            $text_goback = sprintf( __( 'To go back to the previous page, <a href="%s">click here</a>.', 'delete-custom-fields' ), admin_url( 'tools.php?page=delete-custom-fields' ) ); 
     134            $text_failures = sprintf( __( 'All done! %1$s custom fields were successfully deleted in %2$s seconds and there were %3$s failure(s). To try deleting the post fields again, <a href="%4$s">click here</a>. %5$s', 'delete-custom-fields' ), "' + dcf_successes + '", "' + dcf_totaltime + '", "' + dcf_failures + '", esc_url( wp_nonce_url( admin_url( 'tools.php?page=delete-custom-fields' ), 'delete-custom-fields' ) . '&custom-field-to-delete=' ) . $custom_field, $text_goback ); 
     135            $text_nofailures = sprintf( __( 'All done! %1$s custom fields were successfully deleted in %2$s seconds and there were 0 failures. %3$s', 'delete-custom-fields' ), "' + dcf_successes + '", "' + dcf_totaltime + '", $text_goback ); 
     136            $text_noposts = sprintf( __( 'No posts were found with the custom field "%1$s". %2$s', 'delete-custom-fields' ), $custom_field, $text_goback ); 
     137 
     138            ?>                       
     139         
     140            <div id="regenthumbs-bar"> 
     141                    <div id="regenthumbs-bar-percent"></div> 
     142                </div> 
     143 
     144         
     145            <p><input type="button" class="button hide-if-no-js" name="regenthumbs-stop" id="regenthumbs-stop" value="<?php _e( 'Abort Resizing Images', 'delete-custom-fields'  ) ?>" /></p> 
     146         
     147            <h3 class="title"><?php _e( 'Debugging Information', 'delete-custom-fields'  ) ?></h3> 
     148         
     149            <p> 
     150                <?php printf( __( 'Total posts: %s', 'delete-custom-fields'  ), '<span id="dcf-debug-postcount">0</span>' ); ?><br /> 
     151                <?php printf( __( 'Post fields deleted: %s', 'delete-custom-fields'  ), '<span id="dcf-debug-successcount">0</span>' ); ?><br /> 
     152                <?php printf( __( 'Deletion errors: %s', 'delete-custom-fields'  ), '<span id="dcf-debug-failurecount">0</span>' ); ?> 
     153            </p> 
     154            <div class="debug-container"> 
     155            <ol id="regenthumbs-debuglist"> 
     156                <li class="hidden"></li> 
     157            </ol>    
     158            </div> 
     159                 
     160            <script type="text/javascript"> 
     161            // <![CDATA[ 
     162                jQuery(document).ready(function($){ 
     163                 
     164                    var i; 
     165                    var dcf_ids = []; 
     166                    var dcf_key = '<?php echo $custom_field; ?>';  
     167                    var dcf_total = 0; 
     168                    var dcf_successes = 0; 
     169                    var dcf_failures = 0; 
     170                    var dcf_failed_list = ''; 
     171                    var dcf_timestart = new Date().getTime(); 
     172                    var dcf_continue = true; 
     173                    var dcf_count = 1; 
     174                     
     175                    // Create the progress bar 
     176                    $("#regenthumbs-bar").progressbar(); 
     177                    $("#regenthumbs-bar-percent").html( "0%" ); 
     178         
     179                    // Stop button 
     180                    $("#regenthumbs-stop").click(function() { 
     181                        dcf_continue = false; 
     182                        $('#regenthumbs-stop').val("Stopping..."); 
     183                    }); 
     184         
     185                    // Clear out the empty list element that's there for HTML validation purposes 
     186                    $("#regenthumbs-debuglist li").remove(); 
     187                     
     188 
     189                    // Called after each deletion. Updates debug information and the progress bar. 
     190                    function dcfUpdateStatus( id, success, response ) { 
     191                        $("#regenthumbs-bar").progressbar( "value", ( dcf_count / dcf_total ) * 100 ); 
     192                        $("#regenthumbs-bar-percent").html( Math.round( ( dcf_count / dcf_total ) * 1000 ) / 10 + "%" ); 
     193 
     194                        if ( success ) { 
     195                            dcf_successes = dcf_successes + 1; 
     196                            $("#dcf-debug-successcount").html(dcf_successes); 
     197                            $("#regenthumbs-debuglist").prepend("<li value='" + dcf_count + "'>" + response.success + "</li>"); 
     198                        } 
     199                        else { 
     200                            dcf_failures = dcf_failures + 1; 
     201                            dcf_failed_list = dcf_failed_list + ',' + id; 
     202                            $("#dcf-debug-failurecount").html(dcf_failures); 
     203                            $("#regenthumbs-debuglist").prepend("<li value='" + dcf_count + "'>" + response.error + "</li>"); 
     204                        } 
     205                         
     206                        dcf_count = dcf_count + 1; 
     207 
     208                    } 
     209         
     210                    // Called when all fields have been processed. Shows the results and cleans up. 
     211                    function dcfFinishUp() { 
     212                        dcf_timeend = new Date().getTime(); 
     213                        dcf_totaltime = Math.round( ( dcf_timeend - dcf_timestart ) / 1000 ); 
     214 
     215                        $('#regenthumbs-stop').hide(); 
     216         
     217                        if ( dcf_failures > 0 ) { 
     218                            dcf_resulttext = '<?php echo $text_failures; ?>'; 
     219                        } else if (dcf_total == 0) { 
     220                            dcf_resulttext = '<?php echo $text_noposts ?>'; 
     221                        } else { 
     222                            dcf_resulttext = '<?php echo $text_nofailures; ?>'; 
     223                            $("#message").removeClass('error').addClass('updated'); 
     224                        } 
     225         
     226                        $("#message").html("<p><strong>" + dcf_resulttext + "</strong></p>").slideDown('fast'); 
     227                    } 
     228         
     229                    // Delete a specified field via AJAX 
     230                    function deleteField( id ) { 
     231                        $.ajax({ 
     232                            type: 'POST', 
     233                            url: ajaxurl, 
     234                            data: { action: "deletecustomfield", id: id, key: dcf_key }, 
     235                            success: function( response ) { 
     236                                if ( response.success ) { 
     237                                    dcfUpdateStatus( id, true, response ); 
     238                                } 
     239                                else { 
     240                                    dcfUpdateStatus( id, false, response ); 
     241                                } 
     242         
     243                                if ( dcf_ids.length && dcf_continue ) { 
     244                                    deleteField( dcf_ids.shift() ); 
     245                                } 
     246                                else { 
     247                                    dcfFinishUp(); 
     248                                } 
     249                            }, 
     250                            error: function( response ) { 
     251                                dcfUpdateStatus( id, false, response ); 
     252         
     253                                if ( dcf_ids.length && dcf_continue ) { 
     254                                    deleteField( dcf_ids.shift() ); 
     255                                }  
     256                                else { 
     257                                    dcfFinishUp(); 
     258                                } 
     259                            } 
     260                        }); 
     261                    } 
     262                     
     263                    function loadPostIds() { 
     264                        $.ajax({ 
     265                            type: 'POST', 
     266                            url: ajaxurl, 
     267                            data: { action: "deletecustomfield", request: 'get_posts', key: dcf_key }, 
     268                            success: function( response ) { 
     269                                if ( response.success ) { 
     270                                    dcf_ids = response.ids; 
     271                                    dcf_total = dcf_ids.length; 
     272                                    $("#dcf-debug-postcount").html(dcf_total); 
     273                                    if(  dcf_ids.length && dcf_continue ) { 
     274                                        deleteField( dcf_ids.shift() ); 
     275                                    } 
     276                                } 
     277                                else { 
     278                                    console.log( "nothing to do" ); 
     279                                    dcfFinishUp(); 
     280                                } 
     281                            }, 
     282                            error: function( response ) { 
     283                                console.log( "couldn't get posts" ); 
     284                                dcfFinishUp(); 
     285                            } 
     286                        }); 
     287                    } 
     288                    loadPostIds(); 
     289                }); 
     290            // ]]> 
     291            </script> 
     292            <?php    
     293        }  
     294        // no submission, show the settings form 
     295        else { 
     296                 
    115297        ?> 
    116         <div class="narrow"> 
    117298        <p> 
    118         <?php _e("This form will <strong>permanently delete</strong> custom fields you select along with any content associated with them. Before using this form, please <strong>make sure that you are not deleting a custom field used by your theme or plugins</strong>; just because you did not explicitly enter or create a custom field does not mean that it does not hold information used by your theme or plugins." ); ?> To show hidden custom fields <a href="<?php echo admin_url('tools.php?page=delete-custom-fields&show-hidden=true'); ?>">click here</a>. 
     299        <?php _e( "This form will <strong>permanently delete</strong> custom fields you select along with any content associated with them. Before using this form, please <strong>make sure that you are not deleting a custom field used by your theme or plugins</strong>; just because you did not explicitly enter or create a custom field does not mean that it does not hold information used by your theme or plugins. " ) ?> 
    119300        </p> 
    120301                 
    121302        <form name="delete-custom-fields" method="post"> 
    122303         
    123         <?php wp_nonce_field( "delete_custom_fields", "delete_custom_fields_nonce" ) ?> 
     304        <?php wp_nonce_field( "delete_custom_fields") ?> 
    124305         
    125306        <label for="custom-field-to-delete"><?php _e("Custom Fields to Delete", "delete-custom-fields" ); ?>  
    126307         
    127         <select name="custom-field-to-delete"> 
     308        <select name="custom-field-to-delete" id="custom-field-to-delete"> 
    128309            <option disabled="disabled"><?php _e("Select a Field", "delete-custom-fields"); ?></option> 
    129310             
    130311            <?php 
    131312             
    132             $show_hidden = ($_GET['show-hidden']) ? true : false; 
     313            $show_hidden = ( isset( $_GET['show-hidden'] ) ) ? true : false; 
    133314             
    134315            $custom_fields = Delete_Custom_Fields::get_all_meta_keys( $show_hidden ); 
     
    145326         
    146327        <p class="submit"> 
    147         <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Delete Permanently') ?>" /> 
     328        <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Delete Permanently') ?>" disabled="disabled" /> 
     329        <?php if($show_hidden) { ?>      
     330            <a class="button" href="<?php echo admin_url('tools.php?page=delete-custom-fields'); ?>"><?php esc_attr_e('Hide Hidden Fields'); ?></a> 
     331        <?php } else { ?> 
     332            <a class="button" href="<?php echo admin_url('tools.php?page=delete-custom-fields&show-hidden=true'); ?>"><?php esc_attr_e('Show Hidden Fields'); ?></a> 
     333        <?php } ?> 
    148334        </p> 
    149335         
    150336        </form> 
     337        <script type="text/javascript"> 
     338        // <![CDATA[ 
     339        jQuery(document).ready(function($){ 
     340            // Enable delete button when a field is selected 
     341 
     342            $('#custom-field-to-delete').change(function(){ 
     343                if( ! $('#custom-field-to-delete option:selected').prop('disabled') ) { 
     344                    $('input.button-primary').prop({disabled: false}); 
     345                } 
     346            }).change(); 
     347        }); 
     348        // ]]> 
     349        </script> 
     350        <?php } /* end if form submitted */ ?> 
    151351         
    152352        </div> <!-- .narrow --> 
    153353         
    154354        </div> <!-- .wrap --> 
    155          
    156355        <?php 
    157356    } 
     357     
    158358    function plugin_action_links($links, $file) { 
    159359 
     
    165365     
    166366        return $links; 
     367    }  
     368     
     369    // delete a custom field for one post ID (via AJAX) 
     370    function ajax_delete_field() { 
     371        @error_reporting( 0 ); // Don't break the JSON result 
     372 
     373        header( 'Content-type: application/json' ); 
     374         
     375        if ( !current_user_can( 'manage_options' ) ) 
     376            $this->die_json_error_msg( $id, __( "Your user account doesn't have permission to delete custom fields.", 'delete-custom-fields' ) ); 
     377         
     378        if( isset( $_REQUEST['id'] ) ) 
     379            $id = (int) $_REQUEST['id']; 
     380             
     381        $key = esc_attr( $_REQUEST['key'] ); 
     382         
     383        // if there is no post id, retreive all post ids 
     384        if( isset( $_REQUEST['request'] ) && $_REQUEST['request'] == 'get_posts' ) { 
     385            $ids = $this->get_all_posts_for_meta_key( $key ); 
     386             
     387            if( !empty($ids) ) { 
     388                die( json_encode( array( 'success' => __( 'true', 'delete-custom-fields' ), 'ids' => $ids ) ) ); 
     389            } else { 
     390                die( json_encode( array( 'error' => sprintf( __( 'No posts found for custom field &quot;%1$s&quot.', 'delete-custom-fields' ), $key ) ) ) ); 
     391            } 
     392        } 
     393         
     394        if ( ! delete_post_meta($id, $key) ) 
     395            $this->die_json_error_msg( $id, 'Custom field not found.' ); 
     396 
     397        die( json_encode( array( 'success' => sprintf( __( '&quot;%1$s&quot; was deleted for post &quot;%2$s&quot; (ID %3$s).', 'delete-custom-fields' ), $key, esc_html( get_the_title( $id ) ), $id ) ) ) ); 
     398 
     399    } 
     400     
     401    // Helper to make a JSON error message 
     402    function die_json_error_msg( $id, $message ) { 
     403        die( json_encode( array( 'error' => sprintf( __( 'Removing &quot;%1$s&quot; (ID %2$s) failed. The error message was: %3$s', 'delete-custom-fields' ), esc_html( get_the_title( $id ) ), $id, $message ) ) ) ); 
    167404    } 
    168405 
     
    172409new Delete_Custom_Fields; 
    173410 
    174  
    175411?> 
  • delete-custom-fields/tags/0.3/readme.txt

    r455960 r478913  
    44Requires at least: 3.1 
    55Tested up to: 3.3 
    6 Stable tag: 0.2 
     6Stable tag: 0.3 
    77 
    88Remove every instance of a custom field from your site.  
     
    2828== Changelog == 
    2929 
     30= 0.3 = 
     31* Process all requests using AJAX, allowing for deletion of thousands of custom fields. 
     32* Deletion now displays detailed debugging and progress information 
     33 
    3034= 0.2 = 
    3135* Delete all instances of custom field and not just ten at a time 
    32 * Display up to 50 custom fields 
     36* Display up to 100 custom fields 
    3337* Added option to show hidden custom fields 
    3438 
  • delete-custom-fields/trunk/delete-custom-fields.php

    r455960 r478913  
    33Plugin Name: Delete Custom Fields 
    44Description: Ever have one erroneously entered custom field name confuse all of your users and you just can't figure out how to get rid of it? Delete Custom Fields will let you delete every instance of a custom field from your site.  
    5 Version: 0.2 
     5Version: 0.3 
    66License: GPL version 2 or any later version 
    77Author: Sam Margulies 
    88Author URI: http://belabor.org/ 
    99 
    10 Copyright 2011  Sam Margulies  (email : freebuffalo@gmail.com) 
     10Copyright 2011  Sam Margulies  (email : sam@belabor.org) 
     11 
     12*** 
     13Progress display and ajax functionality heavily influenced by Viper007Bond's awesome Regenerate Thumbnails plugin. 
    1114 
    1215*/ 
    1316 
    1417class Delete_Custom_Fields { 
     18 
    1519    static $instance; 
    16  
     20    var $menu_id; 
     21     
    1722    function __construct() { 
    1823        self::$instance =& $this; 
    1924        // add page to tools menu  
    20         add_action('admin_menu', array( &$this, 'add_menu') ); 
    21         add_filter('plugin_action_links', array( &$this, 'plugin_action_links'), 10, 2); 
    22  
    23  
    24     } 
     25        add_action('admin_menu',                    array( &$this, 'add_menu') ); 
     26        add_filter('plugin_action_links',           array( &$this, 'plugin_action_links'), 10, 2); 
     27        add_action( 'wp_ajax_deletecustomfield',    array( &$this, 'ajax_delete_field' ) ); 
     28        add_action( 'admin_enqueue_scripts',        array( &$this, 'admin_enqueues' ) ); 
     29 
     30    } 
     31     
    2532    function add_menu() { 
    26         add_management_page( 'Delete Custom Fields', 'Delete Custom Fields', 'manage_options', 'delete-custom-fields', array( &$this, 'admin_page' ) ); 
    27     } 
     33        $this->menu_id = add_management_page( 'Delete Custom Fields', 'Delete Custom Fields', 'manage_options', 'delete-custom-fields', array( &$this, 'admin_page' ) ); 
     34    } 
     35     
     36    // Enqueue the needed Javascript and CSS 
     37    function admin_enqueues( $hook_suffix ) { 
     38        if ( $hook_suffix != $this->menu_id ) 
     39            return; 
     40 
     41        // WordPress 3.1 vs older version compatibility 
     42        if ( wp_script_is( 'jquery-ui-widget', 'registered' ) ) 
     43            wp_enqueue_script( 'jquery-ui-progressbar', plugins_url( 'js/jquery.ui.progressbar.min.js', __FILE__ ), array( 'jquery-ui-core', 'jquery-ui-widget' ), '1.8.6' ); 
     44        else 
     45            wp_enqueue_script( 'jquery-ui-progressbar', plugins_url( 'js/jquery.ui.progressbar.min.1.7.2.js', __FILE__ ), array( 'jquery-ui-core' ), '1.7.2' ); 
     46 
     47        wp_enqueue_style( 'delete-custom-fields-styles', plugins_url( 'css/delete-custom-fields.css', __FILE__ ), array(), '1.7.2' ); 
     48    } 
     49     
    2850    function get_all_meta_keys( $include_hidden = false ) { 
    2951        global $wpdb;        
    30         $limit = 50; 
     52        $limit = 100; 
    3153        $include_hidden = ($include_hidden) ? "" : "HAVING meta_key NOT LIKE '\_%'"; 
    3254        $keys = $wpdb->get_col( " 
     
    4163     
    4264    function get_all_posts_for_meta_key( $key ) { 
     65     
     66        @ini_set('memory_limit', WP_MAX_MEMORY_LIMIT); 
     67         
    4368        $custom_value_query = new WP_Query( array( 
    4469            'post_type' => 'any', 
     
    7095        $posts = $this->get_all_posts_for_meta_key( $key ); 
    7196         
    72         if( ! $posts ) { return false; } 
     97        if( ! $posts ) { return true; } 
    7398         
    7499        foreach( $posts as $post ) { 
     
    76101        } 
    77102         
    78         return true; 
     103        return ! $this->get_all_posts_for_meta_key( $key ); 
    79104    } 
    80105     
     
    84109        } 
    85110         
    86         // Now display the settings editing screen 
    87111 
    88112        echo '<div class="wrap">'; 
     
    91115     
    92116        echo "<h2>" . __( 'Delete Custom Fields', 'delete-custom-fields' ) . "</h2>"; 
     117        echo '<div class="narrow">'; 
     118         
     119        echo '<div id="message" class="error fade hidden"></div>'; 
     120 
     121        echo '<noscript><div class="error"><p><strong>' . __( 'You must enable Javascript in order to proceed!', 'delete-custom-fields'  ) . '</strong></p></div></noscript>'; 
     122 
    93123        // see if we have some fields to delete 
    94124                 
    95         if ( !empty( $_POST ) &&  
    96              check_admin_referer( 'delete_custom_fields','delete_custom_fields_nonce' ) &&  
    97              isset( $_POST['custom-field-to-delete'] ) ) { 
    98               
    99             $custom_field = esc_attr( $_POST['custom-field-to-delete'] ); 
    100              
    101             $deleted = Delete_Custom_Fields::remove_all_meta_with_key( $custom_field ); 
    102              
    103             if( $deleted ) { 
    104                 ?> 
    105              
    106                 <div class="updated"><p><?php printf(__("The custom field <strong>%s</strong> has been deleted.", 'delete-custom-fields'), $custom_field); ?></p></div> 
    107              
    108                 <?php 
    109             } 
    110  
    111         }    
    112          
    113         // settings form 
    114          
     125        if ( ! empty( $_REQUEST['custom-field-to-delete'] ) ) { 
     126         
     127            check_admin_referer( 'delete_custom_fields' ); 
     128             
     129            $custom_field = esc_attr( $_REQUEST['custom-field-to-delete'] ); 
     130             
     131            echo '<p>' . __( "Please be patient while the fields are deleted. This can take a while if the field is used in many posts or if your server is slow. Do not navigate away from this page until this script is done or the fields will not be deleted. You will be notified via this page when the process is complete.", 'delete-custom-fields' ) . '</p>'; 
     132 
     133            $text_goback = sprintf( __( 'To go back to the previous page, <a href="%s">click here</a>.', 'delete-custom-fields' ), admin_url( 'tools.php?page=delete-custom-fields' ) ); 
     134            $text_failures = sprintf( __( 'All done! %1$s custom fields were successfully deleted in %2$s seconds and there were %3$s failure(s). To try deleting the post fields again, <a href="%4$s">click here</a>. %5$s', 'delete-custom-fields' ), "' + dcf_successes + '", "' + dcf_totaltime + '", "' + dcf_failures + '", esc_url( wp_nonce_url( admin_url( 'tools.php?page=delete-custom-fields' ), 'delete-custom-fields' ) . '&custom-field-to-delete=' ) . $custom_field, $text_goback ); 
     135            $text_nofailures = sprintf( __( 'All done! %1$s custom fields were successfully deleted in %2$s seconds and there were 0 failures. %3$s', 'delete-custom-fields' ), "' + dcf_successes + '", "' + dcf_totaltime + '", $text_goback ); 
     136            $text_noposts = sprintf( __( 'No posts were found with the custom field "%1$s". %2$s', 'delete-custom-fields' ), $custom_field, $text_goback ); 
     137 
     138            ?>                       
     139         
     140            <div id="regenthumbs-bar"> 
     141                    <div id="regenthumbs-bar-percent"></div> 
     142                </div> 
     143 
     144         
     145            <p><input type="button" class="button hide-if-no-js" name="regenthumbs-stop" id="regenthumbs-stop" value="<?php _e( 'Abort Resizing Images', 'delete-custom-fields'  ) ?>" /></p> 
     146         
     147            <h3 class="title"><?php _e( 'Debugging Information', 'delete-custom-fields'  ) ?></h3> 
     148         
     149            <p> 
     150                <?php printf( __( 'Total posts: %s', 'delete-custom-fields'  ), '<span id="dcf-debug-postcount">0</span>' ); ?><br /> 
     151                <?php printf( __( 'Post fields deleted: %s', 'delete-custom-fields'  ), '<span id="dcf-debug-successcount">0</span>' ); ?><br /> 
     152                <?php printf( __( 'Deletion errors: %s', 'delete-custom-fields'  ), '<span id="dcf-debug-failurecount">0</span>' ); ?> 
     153            </p> 
     154            <div class="debug-container"> 
     155            <ol id="regenthumbs-debuglist"> 
     156                <li class="hidden"></li> 
     157            </ol>    
     158            </div> 
     159                 
     160            <script type="text/javascript"> 
     161            // <![CDATA[ 
     162                jQuery(document).ready(function($){ 
     163                 
     164                    var i; 
     165                    var dcf_ids = []; 
     166                    var dcf_key = '<?php echo $custom_field; ?>';  
     167                    var dcf_total = 0; 
     168                    var dcf_successes = 0; 
     169                    var dcf_failures = 0; 
     170                    var dcf_failed_list = ''; 
     171                    var dcf_timestart = new Date().getTime(); 
     172                    var dcf_continue = true; 
     173                    var dcf_count = 1; 
     174                     
     175                    // Create the progress bar 
     176                    $("#regenthumbs-bar").progressbar(); 
     177                    $("#regenthumbs-bar-percent").html( "0%" ); 
     178         
     179                    // Stop button 
     180                    $("#regenthumbs-stop").click(function() { 
     181                        dcf_continue = false; 
     182                        $('#regenthumbs-stop').val("Stopping..."); 
     183                    }); 
     184         
     185                    // Clear out the empty list element that's there for HTML validation purposes 
     186                    $("#regenthumbs-debuglist li").remove(); 
     187                     
     188 
     189                    // Called after each deletion. Updates debug information and the progress bar. 
     190                    function dcfUpdateStatus( id, success, response ) { 
     191                        $("#regenthumbs-bar").progressbar( "value", ( dcf_count / dcf_total ) * 100 ); 
     192                        $("#regenthumbs-bar-percent").html( Math.round( ( dcf_count / dcf_total ) * 1000 ) / 10 + "%" ); 
     193 
     194                        if ( success ) { 
     195                            dcf_successes = dcf_successes + 1; 
     196                            $("#dcf-debug-successcount").html(dcf_successes); 
     197                            $("#regenthumbs-debuglist").prepend("<li value='" + dcf_count + "'>" + response.success + "</li>"); 
     198                        } 
     199                        else { 
     200                            dcf_failures = dcf_failures + 1; 
     201                            dcf_failed_list = dcf_failed_list + ',' + id; 
     202                            $("#dcf-debug-failurecount").html(dcf_failures); 
     203                            $("#regenthumbs-debuglist").prepend("<li value='" + dcf_count + "'>" + response.error + "</li>"); 
     204                        } 
     205                         
     206                        dcf_count = dcf_count + 1; 
     207 
     208                    } 
     209         
     210                    // Called when all fields have been processed. Shows the results and cleans up. 
     211                    function dcfFinishUp() { 
     212                        dcf_timeend = new Date().getTime(); 
     213                        dcf_totaltime = Math.round( ( dcf_timeend - dcf_timestart ) / 1000 ); 
     214 
     215                        $('#regenthumbs-stop').hide(); 
     216         
     217                        if ( dcf_failures > 0 ) { 
     218                            dcf_resulttext = '<?php echo $text_failures; ?>'; 
     219                        } else if (dcf_total == 0) { 
     220                            dcf_resulttext = '<?php echo $text_noposts ?>'; 
     221                        } else { 
     222                            dcf_resulttext = '<?php echo $text_nofailures; ?>'; 
     223                            $("#message").removeClass('error').addClass('updated'); 
     224                        } 
     225         
     226                        $("#message").html("<p><strong>" + dcf_resulttext + "</strong></p>").slideDown('fast'); 
     227                    } 
     228         
     229                    // Delete a specified field via AJAX 
     230                    function deleteField( id ) { 
     231                        $.ajax({ 
     232                            type: 'POST', 
     233                            url: ajaxurl, 
     234                            data: { action: "deletecustomfield", id: id, key: dcf_key }, 
     235                            success: function( response ) { 
     236                                if ( response.success ) { 
     237                                    dcfUpdateStatus( id, true, response ); 
     238                                } 
     239                                else { 
     240                                    dcfUpdateStatus( id, false, response ); 
     241                                } 
     242         
     243                                if ( dcf_ids.length && dcf_continue ) { 
     244                                    deleteField( dcf_ids.shift() ); 
     245                                } 
     246                                else { 
     247                                    dcfFinishUp(); 
     248                                } 
     249                            }, 
     250                            error: function( response ) { 
     251                                dcfUpdateStatus( id, false, response ); 
     252         
     253                                if ( dcf_ids.length && dcf_continue ) { 
     254                                    deleteField( dcf_ids.shift() ); 
     255                                }  
     256                                else { 
     257                                    dcfFinishUp(); 
     258                                } 
     259                            } 
     260                        }); 
     261                    } 
     262                     
     263                    function loadPostIds() { 
     264                        $.ajax({ 
     265                            type: 'POST', 
     266                            url: ajaxurl, 
     267                            data: { action: "deletecustomfield", request: 'get_posts', key: dcf_key }, 
     268                            success: function( response ) { 
     269                                if ( response.success ) { 
     270                                    dcf_ids = response.ids; 
     271                                    dcf_total = dcf_ids.length; 
     272                                    $("#dcf-debug-postcount").html(dcf_total); 
     273                                    if(  dcf_ids.length && dcf_continue ) { 
     274                                        deleteField( dcf_ids.shift() ); 
     275                                    } 
     276                                } 
     277                                else { 
     278                                    console.log( "nothing to do" ); 
     279                                    dcfFinishUp(); 
     280                                } 
     281                            }, 
     282                            error: function( response ) { 
     283                                console.log( "couldn't get posts" ); 
     284                                dcfFinishUp(); 
     285                            } 
     286                        }); 
     287                    } 
     288                    loadPostIds(); 
     289                }); 
     290            // ]]> 
     291            </script> 
     292            <?php    
     293        }  
     294        // no submission, show the settings form 
     295        else { 
     296                 
    115297        ?> 
    116         <div class="narrow"> 
    117298        <p> 
    118         <?php _e("This form will <strong>permanently delete</strong> custom fields you select along with any content associated with them. Before using this form, please <strong>make sure that you are not deleting a custom field used by your theme or plugins</strong>; just because you did not explicitly enter or create a custom field does not mean that it does not hold information used by your theme or plugins." ); ?> To show hidden custom fields <a href="<?php echo admin_url('tools.php?page=delete-custom-fields&show-hidden=true'); ?>">click here</a>. 
     299        <?php _e( "This form will <strong>permanently delete</strong> custom fields you select along with any content associated with them. Before using this form, please <strong>make sure that you are not deleting a custom field used by your theme or plugins</strong>; just because you did not explicitly enter or create a custom field does not mean that it does not hold information used by your theme or plugins. " ) ?> 
    119300        </p> 
    120301                 
    121302        <form name="delete-custom-fields" method="post"> 
    122303         
    123         <?php wp_nonce_field( "delete_custom_fields", "delete_custom_fields_nonce" ) ?> 
     304        <?php wp_nonce_field( "delete_custom_fields") ?> 
    124305         
    125306        <label for="custom-field-to-delete"><?php _e("Custom Fields to Delete", "delete-custom-fields" ); ?>  
    126307         
    127         <select name="custom-field-to-delete"> 
     308        <select name="custom-field-to-delete" id="custom-field-to-delete"> 
    128309            <option disabled="disabled"><?php _e("Select a Field", "delete-custom-fields"); ?></option> 
    129310             
    130311            <?php 
    131312             
    132             $show_hidden = ($_GET['show-hidden']) ? true : false; 
     313            $show_hidden = ( isset( $_GET['show-hidden'] ) ) ? true : false; 
    133314             
    134315            $custom_fields = Delete_Custom_Fields::get_all_meta_keys( $show_hidden ); 
     
    145326         
    146327        <p class="submit"> 
    147         <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Delete Permanently') ?>" /> 
     328        <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Delete Permanently') ?>" disabled="disabled" /> 
     329        <?php if($show_hidden) { ?>      
     330            <a class="button" href="<?php echo admin_url('tools.php?page=delete-custom-fields'); ?>"><?php esc_attr_e('Hide Hidden Fields'); ?></a> 
     331        <?php } else { ?> 
     332            <a class="button" href="<?php echo admin_url('tools.php?page=delete-custom-fields&show-hidden=true'); ?>"><?php esc_attr_e('Show Hidden Fields'); ?></a> 
     333        <?php } ?> 
    148334        </p> 
    149335         
    150336        </form> 
     337        <script type="text/javascript"> 
     338        // <![CDATA[ 
     339        jQuery(document).ready(function($){ 
     340            // Enable delete button when a field is selected 
     341 
     342            $('#custom-field-to-delete').change(function(){ 
     343                if( ! $('#custom-field-to-delete option:selected').prop('disabled') ) { 
     344                    $('input.button-primary').prop({disabled: false}); 
     345                } 
     346            }).change(); 
     347        }); 
     348        // ]]> 
     349        </script> 
     350        <?php } /* end if form submitted */ ?> 
    151351         
    152352        </div> <!-- .narrow --> 
    153353         
    154354        </div> <!-- .wrap --> 
    155          
    156355        <?php 
    157356    } 
     357     
    158358    function plugin_action_links($links, $file) { 
    159359 
     
    165365     
    166366        return $links; 
     367    }  
     368     
     369    // delete a custom field for one post ID (via AJAX) 
     370    function ajax_delete_field() { 
     371        @error_reporting( 0 ); // Don't break the JSON result 
     372 
     373        header( 'Content-type: application/json' ); 
     374         
     375        if ( !current_user_can( 'manage_options' ) ) 
     376            $this->die_json_error_msg( $id, __( "Your user account doesn't have permission to delete custom fields.", 'delete-custom-fields' ) ); 
     377         
     378        if( isset( $_REQUEST['id'] ) ) 
     379            $id = (int) $_REQUEST['id']; 
     380             
     381        $key = esc_attr( $_REQUEST['key'] ); 
     382         
     383        // if there is no post id, retreive all post ids 
     384        if( isset( $_REQUEST['request'] ) && $_REQUEST['request'] == 'get_posts' ) { 
     385            $ids = $this->get_all_posts_for_meta_key( $key ); 
     386             
     387            if( !empty($ids) ) { 
     388                die( json_encode( array( 'success' => __( 'true', 'delete-custom-fields' ), 'ids' => $ids ) ) ); 
     389            } else { 
     390                die( json_encode( array( 'error' => sprintf( __( 'No posts found for custom field &quot;%1$s&quot.', 'delete-custom-fields' ), $key ) ) ) ); 
     391            } 
     392        } 
     393         
     394        if ( ! delete_post_meta($id, $key) ) 
     395            $this->die_json_error_msg( $id, 'Custom field not found.' ); 
     396 
     397        die( json_encode( array( 'success' => sprintf( __( '&quot;%1$s&quot; was deleted for post &quot;%2$s&quot; (ID %3$s).', 'delete-custom-fields' ), $key, esc_html( get_the_title( $id ) ), $id ) ) ) ); 
     398 
     399    } 
     400     
     401    // Helper to make a JSON error message 
     402    function die_json_error_msg( $id, $message ) { 
     403        die( json_encode( array( 'error' => sprintf( __( 'Removing &quot;%1$s&quot; (ID %2$s) failed. The error message was: %3$s', 'delete-custom-fields' ), esc_html( get_the_title( $id ) ), $id, $message ) ) ) ); 
    167404    } 
    168405 
     
    172409new Delete_Custom_Fields; 
    173410 
    174  
    175411?> 
  • delete-custom-fields/trunk/readme.txt

    r455960 r478913  
    44Requires at least: 3.1 
    55Tested up to: 3.3 
    6 Stable tag: 0.2 
     6Stable tag: 0.3 
    77 
    88Remove every instance of a custom field from your site.  
     
    2828== Changelog == 
    2929 
     30= 0.3 = 
     31* Process all requests using AJAX, allowing for deletion of thousands of custom fields. 
     32* Deletion now displays detailed debugging and progress information 
     33 
    3034= 0.2 = 
    3135* Delete all instances of custom field and not just ten at a time 
    32 * Display up to 50 custom fields 
     36* Display up to 100 custom fields 
    3337* Added option to show hidden custom fields 
    3438 
Note: See TracChangeset for help on using the changeset viewer.