/** * Useful verbosity filters for the WXR importer */ private function add_wxr_filters() { add_filter('wp_import_posts', function ($posts) { global $wpcli_import_counts; $wpcli_import_counts['current_post'] = 0; $wpcli_import_counts['total_posts'] = count($posts); return $posts; }, 10); add_filter('wp_import_post_comments', function ($comments, $post_id, $post) { global $wpcli_import_counts; $wpcli_import_counts['current_comment'] = 0; $wpcli_import_counts['total_comments'] = count($comments); return $comments; }, 10, 3); add_filter('wp_import_post_data_raw', function ($post) { global $wpcli_import_counts; $wpcli_import_counts['current_post']++; WP_CLI::line(); WP_CLI::line(); WP_CLI::line(sprintf('Processing post #%d ("%s") (post_type: %s)', $post['post_id'], $post['post_title'], $post['post_type'])); WP_CLI::line(sprintf('-- %s of %s', number_format($wpcli_import_counts['current_post']), number_format($wpcli_import_counts['total_posts']))); WP_CLI::line('-- ' . date('r')); return $post; }); add_action('wp_import_insert_post', function ($post_id, $original_post_ID, $post, $postdata) { global $wpcli_import_counts; if (is_wp_error($post_id)) { WP_CLI::warning("-- Error importing post: " . $post_id->get_error_code()); } else { WP_CLI::line("-- Imported post as post_id #{$post_id}"); } if ($wpcli_import_counts['current_post'] % 500 === 0) { WP_CLI\Utils\wp_clear_object_cache(); WP_CLI::line("-- Cleared object cache."); } }, 10, 4); add_action('wp_import_insert_term', function ($t, $import_term, $post_id, $post) { WP_CLI::line("-- Created term \"{$import_term['name']}\""); }, 10, 4); add_action('wp_import_set_post_terms', function ($tt_ids, $term_ids, $taxonomy, $post_id, $post) { WP_CLI::line("-- Added terms (" . implode(',', $term_ids) . ") for taxonomy \"{$taxonomy}\""); }, 10, 5); add_action('wp_import_insert_comment', function ($comment_id, $comment, $comment_post_ID, $post) { global $wpcli_import_counts; $wpcli_import_counts['current_comment']++; WP_CLI::line(sprintf('-- Added comment #%d (%s of %s)', $comment_id, number_format($wpcli_import_counts['current_comment']), number_format($wpcli_import_counts['total_comments']))); }, 10, 4); add_action('import_post_meta', function ($post_id, $key, $value) { WP_CLI::line("-- Added post_meta {$key}"); }, 10, 3); }
/** * Export content to a WXR file. * * ## OPTIONS * * [--dir=<dirname>] * : Full path to directory where WXR export files should be stored. Defaults * to current working directory. * * [--skip_comments] * : Don't export comments. * * [--max_file_size=<MB>] * : A single export file should have this many megabytes. * --- * default: 15 * --- * * ## FILTERS * * [--start_date=<date>] * : Export only posts published after this date, in format YYYY-MM-DD. * * [--end_date=<date>] * : Export only posts published before this date, in format YYYY-MM-DD. * * [--post_type=<post-type>] * : Export only posts with this post_type. Separate multiple post types with a * comma. * --- * default: any * --- * * [--post_type__not_in=<post-type>] * : Export all post types except those identified. Separate multiple post types * with a comma. Defaults to none. * * [--post__in=<pid>] * : Export all posts specified as a comma- or space-separated list of IDs. * * [--start_id=<pid>] * : Export only posts with IDs greater than or equal to this post ID. * * [--author=<author>] * : Export only posts by this author. Can be either user login or user ID. * * [--category=<name>] * : Export only posts in this category. * * [--post_status=<status>] * : Export only posts with this status. * * [--filename_format=<format>] * : Use a custom format for export filenames. Defaults to '{site}.wordpress.{date}.{n}.xml'. * * ## EXAMPLES * * # Export posts published by the user between given start and end date * $ wp export --dir=/tmp/ --user=admin --post_type=post --start_date=2011-01-01 --end_date=2011-12-31 * Starting export process... * Writing to file /tmp/staging.wordpress.2016-05-24.000.xml * Success: All done with export. * * # Export posts by IDs * $ wp export --dir=/tmp/ --post__in=123,124,125 * Starting export process... * Writing to file /tmp/staging.wordpress.2016-05-24.000.xml * Success: All done with export. * * # Export a random subset of content * $ wp export --post__in="$(wp post list --post_type=post --orderby=rand --posts_per_page=8 --format=ids)" * Starting export process... * Writing to file /var/www/example.com/public_html/staging.wordpress.2016-05-24.000.xml * Success: All done with export. */ public function __invoke($_, $assoc_args) { $defaults = array('dir' => NULL, 'start_date' => NULL, 'end_date' => NULL, 'post_type' => NULL, 'post_type__not_in' => NULL, 'author' => NULL, 'category' => NULL, 'post_status' => NULL, 'post__in' => NULL, 'start_id' => NULL, 'skip_comments' => NULL, 'max_file_size' => 15, 'filename_format' => '{site}.wordpress.{date}.{n}.xml'); $assoc_args = wp_parse_args($assoc_args, $defaults); $this->validate_args($assoc_args); if (!function_exists('wp_export')) { self::load_export_api(); } WP_CLI::log('Starting export process...'); add_action('wp_export_new_file', function ($file_path) { WP_CLI::log(sprintf("Writing to file %s", $file_path)); WP_CLI\Utils\wp_clear_object_cache(); }); try { wp_export(array('filters' => $this->export_args, 'writer' => 'WP_Export_Split_Files_Writer', 'writer_args' => array('max_file_size' => $this->max_file_size * MB_IN_BYTES, 'destination_directory' => $this->wxr_path, 'filename_template' => self::get_filename_template($assoc_args['filename_format'])))); } catch (Exception $e) { WP_CLI::error($e->getMessage()); } WP_CLI::success('All done with export.'); }