WordPress 4.7
[autoinstalls/wordpress.git] / wp-admin / includes / import.php
1 <?php
2 /**
3  * WordPress Administration Importer API.
4  *
5  * @package WordPress
6  * @subpackage Administration
7  */
8
9 /**
10  * Retrieve list of importers.
11  *
12  * @since 2.0.0
13  *
14  * @global array $wp_importers
15  * @return array
16  */
17 function get_importers() {
18         global $wp_importers;
19         if ( is_array( $wp_importers ) ) {
20                 uasort( $wp_importers, '_usort_by_first_member' );
21         }
22         return $wp_importers;
23 }
24
25 /**
26  * Sorts a multidimensional array by first member of each top level member
27  *
28  * Used by uasort() as a callback, should not be used directly.
29  *
30  * @since 2.9.0
31  * @access private
32  *
33  * @param array $a
34  * @param array $b
35  * @return int
36  */
37 function _usort_by_first_member( $a, $b ) {
38         return strnatcasecmp( $a[0], $b[0] );
39 }
40
41 /**
42  * Register importer for WordPress.
43  *
44  * @since 2.0.0
45  *
46  * @global array $wp_importers
47  *
48  * @param string   $id          Importer tag. Used to uniquely identify importer.
49  * @param string   $name        Importer name and title.
50  * @param string   $description Importer description.
51  * @param callable $callback    Callback to run.
52  * @return WP_Error Returns WP_Error when $callback is WP_Error.
53  */
54 function register_importer( $id, $name, $description, $callback ) {
55         global $wp_importers;
56         if ( is_wp_error( $callback ) )
57                 return $callback;
58         $wp_importers[$id] = array ( $name, $description, $callback );
59 }
60
61 /**
62  * Cleanup importer.
63  *
64  * Removes attachment based on ID.
65  *
66  * @since 2.0.0
67  *
68  * @param string $id Importer ID.
69  */
70 function wp_import_cleanup( $id ) {
71         wp_delete_attachment( $id );
72 }
73
74 /**
75  * Handle importer uploading and add attachment.
76  *
77  * @since 2.0.0
78  *
79  * @return array Uploaded file's details on success, error message on failure
80  */
81 function wp_import_handle_upload() {
82         if ( ! isset( $_FILES['import'] ) ) {
83                 return array(
84                         'error' => __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.' )
85                 );
86         }
87
88         $overrides = array( 'test_form' => false, 'test_type' => false );
89         $_FILES['import']['name'] .= '.txt';
90         $upload = wp_handle_upload( $_FILES['import'], $overrides );
91
92         if ( isset( $upload['error'] ) ) {
93                 return $upload;
94         }
95
96         // Construct the object array
97         $object = array(
98                 'post_title' => basename( $upload['file'] ),
99                 'post_content' => $upload['url'],
100                 'post_mime_type' => $upload['type'],
101                 'guid' => $upload['url'],
102                 'context' => 'import',
103                 'post_status' => 'private'
104         );
105
106         // Save the data
107         $id = wp_insert_attachment( $object, $upload['file'] );
108
109         /*
110          * Schedule a cleanup for one day from now in case of failed
111          * import or missing wp_import_cleanup() call.
112          */
113         wp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id ) );
114
115         return array( 'file' => $upload['file'], 'id' => $id );
116 }
117
118 /**
119  * Returns a list from WordPress.org of popular importer plugins.
120  *
121  * @since 3.5.0
122  *
123  * @return array Importers with metadata for each.
124  */
125 function wp_get_popular_importers() {
126         include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version
127
128         $locale = get_user_locale();
129         $cache_key = 'popular_importers_' . md5( $locale . $wp_version );
130         $popular_importers = get_site_transient( $cache_key );
131
132         if ( ! $popular_importers ) {
133                 $url = add_query_arg( array(
134                         'locale'  => get_user_locale(),
135                         'version' => $wp_version,
136                 ), 'http://api.wordpress.org/core/importers/1.1/' );
137                 $options = array( 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url() );
138                 $response = wp_remote_get( $url, $options );
139                 $popular_importers = json_decode( wp_remote_retrieve_body( $response ), true );
140
141                 if ( is_array( $popular_importers ) ) {
142                         set_site_transient( $cache_key, $popular_importers, 2 * DAY_IN_SECONDS );
143                 } else {
144                         $popular_importers = false;
145                 }
146         }
147
148         if ( is_array( $popular_importers ) ) {
149                 // If the data was received as translated, return it as-is.
150                 if ( $popular_importers['translated'] )
151                         return $popular_importers['importers'];
152
153                 foreach ( $popular_importers['importers'] as &$importer ) {
154                         $importer['description'] = translate( $importer['description'] );
155                         if ( $importer['name'] != 'WordPress' )
156                                 $importer['name'] = translate( $importer['name'] );
157                 }
158                 return $popular_importers['importers'];
159         }
160
161         return array(
162                 // slug => name, description, plugin slug, and register_importer() slug
163                 'blogger' => array(
164                         'name' => __( 'Blogger' ),
165                         'description' => __( 'Import posts, comments, and users from a Blogger blog.' ),
166                         'plugin-slug' => 'blogger-importer',
167                         'importer-id' => 'blogger',
168                 ),
169                 'wpcat2tag' => array(
170                         'name' => __( 'Categories and Tags Converter' ),
171                         'description' => __( 'Convert existing categories to tags or tags to categories, selectively.' ),
172                         'plugin-slug' => 'wpcat2tag-importer',
173                         'importer-id' => 'wp-cat2tag',
174                 ),
175                 'livejournal' => array(
176                         'name' => __( 'LiveJournal' ),
177                         'description' => __( 'Import posts from LiveJournal using their API.' ),
178                         'plugin-slug' => 'livejournal-importer',
179                         'importer-id' => 'livejournal',
180                 ),
181                 'movabletype' => array(
182                         'name' => __( 'Movable Type and TypePad' ),
183                         'description' => __( 'Import posts and comments from a Movable Type or TypePad blog.' ),
184                         'plugin-slug' => 'movabletype-importer',
185                         'importer-id' => 'mt',
186                 ),
187                 'opml' => array(
188                         'name' => __( 'Blogroll' ),
189                         'description' => __( 'Import links in OPML format.' ),
190                         'plugin-slug' => 'opml-importer',
191                         'importer-id' => 'opml',
192                 ),
193                 'rss' => array(
194                         'name' => __( 'RSS' ),
195                         'description' => __( 'Import posts from an RSS feed.' ),
196                         'plugin-slug' => 'rss-importer',
197                         'importer-id' => 'rss',
198                 ),
199                 'tumblr' => array(
200                         'name' => __( 'Tumblr' ),
201                         'description' => __( 'Import posts &amp; media from Tumblr using their API.' ),
202                         'plugin-slug' => 'tumblr-importer',
203                         'importer-id' => 'tumblr',
204                 ),
205                 'wordpress' => array(
206                         'name' => 'WordPress',
207                         'description' => __( 'Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.' ),
208                         'plugin-slug' => 'wordpress-importer',
209                         'importer-id' => 'wordpress',
210                 ),
211         );
212 }