WordPress.org

Make WordPress Core

Ticket #22435: export.diff

File export.diff, 3.3 KB (added by dllh, 6 years ago)

A modified approach to error handling, plus tax loop handling

  • class-wp-export-query.php

     
    2727        private $author;
    2828        private $category;
    2929
     30        public $missing_parents = false;
     31
    3032        public function __construct( $filters = array() ) {
    3133                $this->filters = wp_parse_args( $filters, self::$defaults );
    3234                $this->post_ids = $this->calculate_post_ids();
     
    7678                        return array();
    7779                }
    7880                $categories = (array) get_categories( array( 'get' => 'all' ) );
     81
     82                $this->check_for_orphaned_terms( $categories );
     83
    7984                $categories = self::topologically_sort_terms( $categories );
     85
    8086                return $categories;
    8187        }
    8288
     
    8591                        return array();
    8692                }
    8793                $tags = (array) get_tags( array( 'get' => 'all' ) );
     94
     95                $this->check_for_orphaned_terms( $tags );
     96
    8897                return $tags;
    8998        }
    9099
     
    94103                }
    95104                $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
    96105                $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) );
     106                $this->check_for_orphaned_terms( $custom_terms );
    97107                $custom_terms = self::topologically_sort_terms( $custom_terms );
    98108                return $custom_terms;
    99109        }
     
    271281                return $sorted;
    272282        }
    273283
     284        private function check_for_orphaned_terms( $terms ) {
     285                $term_ids = array();
     286                $have_parent = array();
     287
     288                foreach ( $terms as $term ) {
     289                        $term_ids[ $term->term_id ] = true;
     290                        if ( $term->parent != 0 )
     291                                $have_parent[] = $term;
     292                }
     293
     294                foreach ( $have_parent as $has_parent ) {
     295                        if ( ! isset( $term_ids[ $has_parent->parent ] ) ) {
     296                                $this->missing_parents = $has_parent;
     297                                throw new WP_Export_Term_Exception( __( 'Term is missing a parent.' ) );
     298                        }
     299                }
     300        }
     301
    274302        private static function get_terms_for_post( $post ) {
    275303                $taxonomies = get_object_taxonomies( $post->post_type );
    276304                if ( empty( $taxonomies ) )
     
    309337
    310338class WP_Export_Exception extends RuntimeException {
    311339}
     340
     341class WP_Export_Term_Exception extends RuntimeException {
     342}
  • functions.export.php

     
    1414        try {
    1515                return $writer->export();
    1616        } catch ( WP_Export_Exception $e ) {
    17                 return new WP_Error( 'wp-export-error', $e->getMessage() );
     17                $message = apply_filters( 'export_error_message', $e->getMessage() );
     18                wp_die( $message, __( 'Export Error' ), array( 'back_link' => true ) );
     19        } catch ( WP_Export_Term_Exception $e ) {
     20                do_action( 'export_term_orphaned', $export_query->missing_parents );
     21                $message = apply_filters( 'export_term_error_message', $e->getMessage() );
     22                wp_die( $message, __( 'Export Error' ), array( 'back_link' => true ) );
    1823        }
    1924}
    2025
  • writers.php

     
    2626        }
    2727
    2828        public function export() {
     29                ob_start();
     30                parent::export();
     31                $output = ob_get_contents();
     32                ob_end_clean();
     33
    2934                header( 'Content-Description: File Transfer' );
    3035                header( 'Content-Disposition: attachment; filename=' . $this->file_name );
    3136                header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
    32                 parent::export();
     37                echo $output;
    3338        }
    3439
    3540        protected function write( $xml ) {