2b88e9eb56
These are the importers we suggest on import.php, prompting the user to install the relevant plugin for the import they want to go through. If the API is inaccessible, it falls back to a hard-coded list that should be kept sync'd with the API with each major version of WordPress. This API enables us to add new importers between releases, as they are completed or if services gain quick adoption. As a last resort, we can also temporarily disable importers that are broken (due to API changes, for example). The importer currently returns English strings (which are then run through translate() for existing strings), but the locale is passed to the API, allowing us to ship translated strings if we wish to be adventurous. props dllh for the assist. fixes #18977. git-svn-id: https://develop.svn.wordpress.org/trunk@22632 602fd350-edb4-49c9-b593-d223f7449a82
186 lines
5.8 KiB
PHP
186 lines
5.8 KiB
PHP
<?php
|
|
/**
|
|
* WordPress Administration Importer API.
|
|
*
|
|
* @package WordPress
|
|
* @subpackage Administration
|
|
*/
|
|
|
|
/**
|
|
* Retrieve list of importers.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @return array
|
|
*/
|
|
function get_importers() {
|
|
global $wp_importers;
|
|
if ( is_array($wp_importers) )
|
|
uasort($wp_importers, create_function('$a, $b', 'return strcmp($a[0], $b[0]);'));
|
|
return $wp_importers;
|
|
}
|
|
|
|
/**
|
|
* Register importer for WordPress.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @param string $id Importer tag. Used to uniquely identify importer.
|
|
* @param string $name Importer name and title.
|
|
* @param string $description Importer description.
|
|
* @param callback $callback Callback to run.
|
|
* @return WP_Error Returns WP_Error when $callback is WP_Error.
|
|
*/
|
|
function register_importer( $id, $name, $description, $callback ) {
|
|
global $wp_importers;
|
|
if ( is_wp_error( $callback ) )
|
|
return $callback;
|
|
$wp_importers[$id] = array ( $name, $description, $callback );
|
|
}
|
|
|
|
/**
|
|
* Cleanup importer.
|
|
*
|
|
* Removes attachment based on ID.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @param string $id Importer ID.
|
|
*/
|
|
function wp_import_cleanup( $id ) {
|
|
wp_delete_attachment( $id );
|
|
}
|
|
|
|
/**
|
|
* Handle importer uploading and add attachment.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @return array Uploaded file's details on success, error message on failure
|
|
*/
|
|
function wp_import_handle_upload() {
|
|
if ( !isset($_FILES['import']) ) {
|
|
$file['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.' );
|
|
return $file;
|
|
}
|
|
|
|
$overrides = array( 'test_form' => false, 'test_type' => false );
|
|
$_FILES['import']['name'] .= '.txt';
|
|
$file = wp_handle_upload( $_FILES['import'], $overrides );
|
|
|
|
if ( isset( $file['error'] ) )
|
|
return $file;
|
|
|
|
$url = $file['url'];
|
|
$type = $file['type'];
|
|
$file = $file['file'];
|
|
$filename = basename( $file );
|
|
|
|
// Construct the object array
|
|
$object = array( 'post_title' => $filename,
|
|
'post_content' => $url,
|
|
'post_mime_type' => $type,
|
|
'guid' => $url,
|
|
'context' => 'import',
|
|
'post_status' => 'private'
|
|
);
|
|
|
|
// Save the data
|
|
$id = wp_insert_attachment( $object, $file );
|
|
|
|
// schedule a cleanup for one day from now in case of failed import or missing wp_import_cleanup() call
|
|
wp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id ) );
|
|
|
|
return array( 'file' => $file, 'id' => $id );
|
|
}
|
|
|
|
/**
|
|
* Returns a list from WordPress.org of popular importer plugins.
|
|
*
|
|
* @since 3.5.0
|
|
*
|
|
* @return array Importers with metadata for each.
|
|
*/
|
|
function wp_get_popular_importers() {
|
|
include ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version
|
|
|
|
$locale = get_locale();
|
|
$popular_importers = get_site_transient( 'popular_importers_' . $locale );
|
|
|
|
if ( ! $popular_importers ) {
|
|
$url = add_query_arg( 'locale', get_locale(), 'http://api.wordpress.org/core/importers/1.0/' );
|
|
$options = array( 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url() );
|
|
$popular_importers = maybe_unserialize( wp_remote_retrieve_body( wp_remote_get( $url, $options ) ) );
|
|
|
|
if ( is_array( $popular_importers ) )
|
|
set_site_transient( 'popular_importers_' . $locale, $popular_importers, 2 * DAY_IN_SECONDS );
|
|
else
|
|
$popular_importers = false;
|
|
}
|
|
|
|
if ( is_array( $popular_importers ) ) {
|
|
// If the data was received as translated, return it as-is.
|
|
if ( $popular_importers['translated'] )
|
|
return $popular_importers['importers'];
|
|
|
|
foreach ( $popular_importers['importers'] as &$importer ) {
|
|
$importer['description'] = translate( $importer['description'] );
|
|
if ( $importer['name'] != 'WordPress' )
|
|
$importer['name'] = translate( $importer['name'] );
|
|
}
|
|
return $popular_importers['importers'];
|
|
}
|
|
|
|
return array(
|
|
// slug => name, description, plugin slug, and register_importer() slug
|
|
'blogger' => array(
|
|
'name' => __( 'Blogger' ),
|
|
'description' => __( 'Install the Blogger importer to import posts, comments, and users from a Blogger blog.' ),
|
|
'plugin-slug' => 'blogger-importer',
|
|
'importer-id' => 'blogger',
|
|
),
|
|
'wpcat2tag' => array(
|
|
'name' => __( 'Categories and Tags Converter' ),
|
|
'description' => __( 'Install the category/tag converter to convert existing categories to tags or tags to categories, selectively.' ),
|
|
'plugin-slug' => 'wpcat2tag-importer',
|
|
'importer-id' => 'wp-cat2tag',
|
|
),
|
|
'livejournal' => array(
|
|
'name' => __( 'LiveJournal' ),
|
|
'description' => __( 'Install the LiveJournal importer to import posts from LiveJournal using their API.' ),
|
|
'plugin-slug' => 'livejournal-importer',
|
|
'importer-id' => 'livejournal',
|
|
),
|
|
'movabletype' => array(
|
|
'name' => __( 'Movable Type and TypePad' ),
|
|
'description' => __( 'Install the Movable Type importer to import posts and comments from a Movable Type or TypePad blog.' ),
|
|
'plugin-slug' => 'movabletype-importer',
|
|
'importer-id' => 'mt',
|
|
),
|
|
'opml' => array(
|
|
'name' => __( 'Blogroll' ),
|
|
'description' => __( 'Install the blogroll importer to import links in OPML format.' ),
|
|
'plugin-slug' => 'opml-importer',
|
|
'importer-id' => 'opml',
|
|
),
|
|
'rss' => array(
|
|
'name' => __( 'RSS' ),
|
|
'description' => __( 'Install the RSS importer to import posts from an RSS feed.' ),
|
|
'plugin-slug' => 'rss-importer',
|
|
'importer-id' => 'rss',
|
|
),
|
|
'tumblr' => array(
|
|
'name' => __( 'Tumblr' ),
|
|
'description' => __( 'Install the Tumblr importer to import posts & media from Tumblr using their API.' ),
|
|
'plugin-slug' => 'tumblr-importer',
|
|
'importer-id' => 'tumblr',
|
|
),
|
|
'wordpress' => array(
|
|
'name' => 'WordPress',
|
|
'description' => __( 'Install the WordPress importer to import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.' ),
|
|
'plugin-slug' => 'wordpress-importer',
|
|
'importer-id' => 'wordpress',
|
|
),
|
|
);
|
|
}
|