prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN ( SELECT ID FROM {$wpdb->posts} WHERE post_type NOT IN (%s, %s) ) AND meta_key = %s LIMIT %d", 'wppb-rf-cpt', 'wppb-epf-cpt', 'wppb_sc_rf_epf_active', $batch_size ); $rows_affected = $wpdb->query( $query ); if ( $rows_affected === 0 ) { // Move to next step when no more rows to delete wp_send_json_success( array( 'step' => 2 ) ); } } else if ( $step === 2 ) { // Second query - UserListing themes meta $query = $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN ( SELECT ID FROM {$wpdb->posts} WHERE post_type != %s ) AND meta_key IN (%s, %s, %s) LIMIT %d", 'wppb-ul-cpt', 'wppb-ul-active-theme', 'wppb-ul-default-single-user-template', 'wppb-ul-default-all-users-template', $batch_size ); $rows_affected = $wpdb->query( $query ); if ( $rows_affected === 0 ) { // Move to next step when no more rows to delete wp_send_json_success( array( 'step' => 3 ) ); } } else if ( $step === 3 ) { // Third query - Placeholder Labels meta $query = $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %s LIMIT %d", 'pbpl-active', 'no', $batch_size ); $rows_affected = $wpdb->query( $query ); if ( $rows_affected === 0 ) { // Save the new completion flag as non-autoloaded option add_option( 'wppb_postmeta_cleanup_completed_v2', true, '', 'no' ); // Remove the old completion flag delete_option( 'wppb_postmeta_cleanup_completed' ); // All done wp_send_json_success( array( 'step' => 'done', 'hide_button' => true ) ); } } // Continue with same step wp_send_json_success( array( 'step' => $step, 'rows_affected' => $rows_affected ) ); } add_action( 'wp_ajax_wppb_cleanup_postmeta', 'wppb_cleanup_postmeta' );