/** * Generate users * * @param array $args * @param array $assoc_args **/ public function users($args, $assoc_args) { global $blog_id; $defaults = array('count' => 100, 'role' => get_option('default_role')); extract(wp_parse_args($assoc_args, $defaults), EXTR_SKIP); if ('none' == $role) { $role = false; } elseif (is_null(get_role($role))) { WP_CLI::warning("invalid role."); exit; } $user_count = count_users(); $total = $user_count['total_users']; $limit = $count + $total; $notify = new \cli\progress\Bar('Generating users', $count); for ($i = $total; $i < $limit; $i++) { $login = sprintf('user_%d_%d', $blog_id, $i); $name = "User {$i}"; $user_id = wp_insert_user(array('user_login' => $login, 'user_pass' => $login, 'nickname' => $name, 'display_name' => $name, 'role' => $role)); if (false === $role) { delete_user_option($user_id, 'capabilities'); delete_user_option($user_id, 'user_level'); } $notify->tick(); } $notify->finish(); }
/** * Start Exploit Scanner scan. * * ## OPTIONS * * [--show-suspicious-styles] * : Search for suspicious styles - (display:none and visibility:hidden can be used to hide spam, but may cause many false positives) * * [--file-size=<size-in-kb>] * : Upper file size limit in KB - (files larger than this are skipped and will be listed at the end of scan) * * [--files-per-block=<no-of-files>] * : Number of files per batch - (to help reduce memory limit errors the scan processes a series of file batches) * * [--report_all_unknown_files] * : Reports also unkown files outside of wp-includes, wp-admin and wp root directory * * [--export-csv=<file-name>] * : It will export result to specified csv file * * ## EXAMPLES * * wp exploit-scanner scan * * @synopsis */ function scan($args, $assoc_args) { $default = array('show-suspicious-styles' => true, 'file-size' => 400, 'files-per-block' => 250, 'report_all_unknown_files' => false, 'export-csv' => false); $assoc_args = wp_parse_args($assoc_args, $default); if (!is_numeric($assoc_args['file-size'])) { WP_CLI::error("--file-size : Upper file size limit should be numeric"); return; } if (!is_numeric($assoc_args['files-per-block'])) { WP_CLI::error("--files-per-block : Number of files per batch should be numeric"); return; } $fes_args = array('start' => 0, 'fsl' => intval($assoc_args['file-size']), 'max' => intval($assoc_args['files-per-block']), 'report_all_unknown_files' => $assoc_args['report_all_unknown_files'], 'display_pattern' => $assoc_args['show-suspicious-styles']); WP_CLI::warning("Star File Scanning..."); $scan_flag = true; $scanner = new File_Exploit_Scanner(ABSPATH, $fes_args); // Fix for save transient error delete_transient('exploitscanner_results_trans'); delete_transient('exploitscanner_files'); $file_progress = new \cli\progress\Bar('Progress', 1000); $file_progress->tick(); while ($scan_flag) { $result = $scanner->run(); if (is_wp_error($result)) { $file_progress->finish(); WP_CLI::error('Files list not properly saved as a transient'); $scan_flag = false; } else { if ($result) { $scan_flag = false; $file_progress->finish(); WP_CLI::success('All files scanned'); } else { $file_progress->tick($scanner->max_batch_size); $scanner->start = $scanner->start + $scanner->max_batch_size; } } } WP_CLI::warning("Star Database Scanning..."); $db_scanner = new DB_Exploit_Scanner(); $db_scanner->run(); WP_CLI::success('Database scanned'); $this->result($args, $assoc_args); }
/** * Convert the NextGen Gallery Shortcodes in posts in this site into WordPress gallery shortcodes. * * ## OPTIONS * * ## EXAMPLES * * wp escape-ngg convert * */ public function convert() { $count = Escape_NextGen_Gallery::init()->count(); WP_CLI::log(sprintf('Processing %d posts with NextGen Gallery shortcodes', $count)); set_time_limit(0); $uploads = wp_upload_dir(); $baseurl = $uploads['baseurl']; $post_ids = Escape_NextGen_Gallery::init()->get_post_ids(); $progress = new \cli\progress\Bar('Progress', $count); foreach ($post_ids as $post_id) { $progress->tick(); Escape_NextGen_Gallery::init()->process_post($post_id); } $progress->finish(); foreach (Escape_NextGen_Gallery::init()->infos as $info) { WP_CLI::log($info); } foreach (Escape_NextGen_Gallery::init()->warnings as $warning) { WP_CLI::warning($warning); } $lines = array((object) array('Converted' => 'posts converted', 'Count' => Escape_NextGen_Gallery::init()->posts_count), (object) array('Converted' => 'images converted', 'Count' => Escape_NextGen_Gallery::init()->images_count)); $fields = array('Converted', 'Count'); \WP_CLI\Utils\format_items('table', $lines, $fields); }
/** * Export function as it is defined in the original code of export_wp defined in wp-admin/includes/export.php */ private function export_wp($args = array()) { require_once ABSPATH . 'wp-admin/includes/export.php'; global $wpdb; /** * This is mostly the original code of export_wp defined in wp-admin/includes/export.php */ $defaults = array('post_type' => 'all', 'post__in' => false, 'author' => false, 'category' => false, 'start_date' => false, 'end_date' => false, 'status' => false, 'skip_comments' => false, 'file_item_count' => 1000); $args = wp_parse_args($args, $defaults); WP_CLI::line("Exporting with export_wp with arguments: " . var_export($args, true)); do_action('export_wp'); $sitename = sanitize_key(get_bloginfo('name')); if (!empty($sitename)) { $sitename .= '.'; } $append = array(date('Y-m-d')); foreach (array_keys($args) as $arg_key) { if ($defaults[$arg_key] != $args[$arg_key] && 'post__in' != $arg_key) { $append[] = "{$arg_key}-" . (string) $args[$arg_key]; } } $file_name_base = sanitize_file_name($sitename . 'wordpress.' . implode(".", $append)); if ('all' != $args['post_type'] && post_type_exists($args['post_type'])) { $ptype = get_post_type_object($args['post_type']); if (!$ptype->can_export) { $args['post_type'] = 'post'; } $where = $wpdb->prepare("{$wpdb->posts}.post_type = %s", $args['post_type']); } else { $post_types = get_post_types(array('can_export' => true)); $esses = array_fill(0, count($post_types), '%s'); $where = $wpdb->prepare("{$wpdb->posts}.post_type IN (" . implode(',', $esses) . ')', $post_types); } if ($args['status'] && ('post' == $args['post_type'] || 'page' == $args['post_type'])) { $where .= $wpdb->prepare(" AND {$wpdb->posts}.post_status = %s", $args['status']); } else { $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; } $join = ''; if ($args['category'] && 'post' == $args['post_type']) { if ($term = term_exists($args['category'], 'category')) { $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; $where .= $wpdb->prepare(" AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id']); } } if ($args['author']) { $where .= $wpdb->prepare(" AND {$wpdb->posts}.post_author = %d", $args['author']); } if ($args['start_date']) { $where .= $wpdb->prepare(" AND {$wpdb->posts}.post_date >= %s", date('Y-m-d 00:00:00', strtotime($args['start_date']))); } if ($args['end_date']) { $where .= $wpdb->prepare(" AND {$wpdb->posts}.post_date <= %s", date('Y-m-d 23:59:59', strtotime($args['end_date']))); } // grab a snapshot of post IDs, just in case it changes during the export if (empty($args['post__in'])) { $all_the_post_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} {$join} WHERE {$where} ORDER BY post_date ASC, post_parent ASC"); } else { $all_the_post_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE ID IN ({$args['post__in']}) ORDER BY post_date ASC, post_parent ASC"); } // Make sure we're getting all of the attachments for these posts too if ('all' != $args['post_type'] || !empty($args['post__in'])) { $all_post_ids_with_attachments = array(); while ($post_ids = array_splice($all_the_post_ids, 0, 100)) { $attachment_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_parent IN (" . implode(",", array_map('intval', $post_ids)) . ")"); $all_post_ids_with_attachments = array_merge($all_post_ids_with_attachments, $post_ids, (array) $attachment_ids); } $all_the_post_ids = $all_post_ids_with_attachments; } // get the requested terms ready, empty unless posts filtered by category or all content $cats = $tags = $terms = array(); if (isset($term) && $term) { $cat = get_term($term['term_id'], 'category'); $cats = array($cat->term_id => $cat); unset($term, $cat); } else { if ('all' == $args['post_type']) { $categories = (array) get_categories(array('get' => 'all')); $tags = (array) get_tags(array('get' => 'all')); $custom_taxonomies = get_taxonomies(array('_builtin' => false)); $custom_terms = (array) get_terms($custom_taxonomies, array('get' => 'all')); // put categories in order with no child going before its parent while ($cat = array_shift($categories)) { if ($cat->parent == 0 || isset($cats[$cat->parent])) { $cats[$cat->term_id] = $cat; } else { $categories[] = $cat; } } // put terms in order with no child going before its parent while ($t = array_shift($custom_terms)) { if ($t->parent == 0 || isset($terms[$t->parent])) { $terms[$t->term_id] = $t; } else { $custom_terms[] = $t; } } unset($categories, $custom_taxonomies, $custom_terms); } } // Load the functions available in wp-admin/includes/export.php ob_start(); export_wp(array('content' => 'page', 'start_date' => '1971-01-01', 'end_date' => '1971-01-02')); ob_end_clean(); WP_CLI::line('Exporting ' . count($all_the_post_ids) . ' items to be broken into ' . ceil(count($all_the_post_ids) / $args['file_item_count']) . ' files'); WP_CLI::line('Exporting ' . count($cats) . ' cateogries'); WP_CLI::line('Exporting ' . count($tags) . ' tags'); WP_CLI::line('Exporting ' . count($terms) . ' terms'); WP_CLI::line(); $file_count = 1; while ($post_ids = array_splice($all_the_post_ids, 0, $args['file_item_count'])) { $full_path = $this->wxr_path . $file_name_base . '.' . str_pad($file_count, 3, '0', STR_PAD_LEFT) . '.xml'; // Create the file if it doesn't exist if (!file_exists($full_path)) { touch($full_path); } if (!file_exists($full_path)) { WP_CLI::error("Failed to create file " . $full_path); exit; } else { WP_CLI::line('Writing to file ' . $full_path); } $progress = new \cli\progress\Bar('Exporting', count($post_ids)); $this->start_export(); echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n"; ?> <!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. --> <!-- It contains information about your site's posts, pages, comments, categories, and other content. --> <!-- You may use this file to transfer that content from one site to another. --> <!-- This file is not intended to serve as a complete backup of your site. --> <!-- To import this information into a WordPress site follow these steps: --> <!-- 1. Log in to that site as an administrator. --> <!-- 2. Go to Tools: Import in the WordPress admin panel. --> <!-- 3. Install the "WordPress" importer from the list. --> <!-- 4. Activate & Run Importer. --> <!-- 5. Upload this file using the form provided on that page. --> <!-- 6. You will first be asked to map the authors in this export file to users --> <!-- on the site. For each author, you may choose to map to an --> <!-- existing user on the site or to create a new user. --> <!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. --> <!-- contained in this file into your site. --> <?php the_generator('export'); ?> <rss version="2.0" xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?> /excerpt/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?> /" > <channel> <title><?php bloginfo_rss('name'); ?> </title> <link><?php bloginfo_rss('url'); ?> </link> <description><?php bloginfo_rss('description'); ?> </description> <pubDate><?php echo date('D, d M Y H:i:s +0000'); ?> </pubDate> <language><?php echo get_option('rss_language'); ?> </language> <wp:wxr_version><?php echo WXR_VERSION; ?> </wp:wxr_version> <wp:base_site_url><?php echo wxr_site_url(); ?> </wp:base_site_url> <wp:base_blog_url><?php bloginfo_rss('url'); ?> </wp:base_blog_url> <?php wxr_authors_list(); ?> <?php foreach ($cats as $c) { ?> <wp:category><wp:term_id><?php echo $c->term_id; ?> </wp:term_id><wp:category_nicename><?php echo $c->slug; ?> </wp:category_nicename><wp:category_parent><?php echo $c->parent ? $cats[$c->parent]->slug : ''; ?> </wp:category_parent><?php wxr_cat_name($c); wxr_category_description($c); ?> </wp:category> <?php } foreach ($tags as $t) { ?> <wp:tag><wp:term_id><?php echo $t->term_id; ?> </wp:term_id><wp:tag_slug><?php echo $t->slug; ?> </wp:tag_slug><?php wxr_tag_name($t); wxr_tag_description($t); ?> </wp:tag> <?php } foreach ($terms as $t) { ?> <wp:term><wp:term_id><?php echo $t->term_id; ?> </wp:term_id><wp:term_taxonomy><?php echo $t->taxonomy; ?> </wp:term_taxonomy><wp:term_slug><?php echo $t->slug; ?> </wp:term_slug><wp:term_parent><?php echo $t->parent ? $terms[$t->parent]->slug : ''; ?> </wp:term_parent><?php wxr_term_name($t); wxr_term_description($t); ?> </wp:term> <?php } if ('all' == $args['post_type']) { wxr_nav_menu_terms(); } ?> <?php do_action('rss2_head'); ?> <?php $this->flush_export($full_path, false); ?> <?php if ($post_ids) { global $wp_query, $post; $wp_query->in_the_loop = true; // Fake being in the loop. // fetch 20 posts at a time rather than loading the entire table into memory while ($next_posts = array_splice($post_ids, 0, 20)) { $where = 'WHERE ID IN (' . join(',', $next_posts) . ')'; $posts = $wpdb->get_results("SELECT * FROM {$wpdb->posts} {$where}"); // Begin Loop foreach ($posts as $post) { $progress->tick(); setup_postdata($post); $is_sticky = is_sticky($post->ID) ? 1 : 0; ?> <item> <title><?php echo apply_filters('the_title_rss', $post->post_title); ?> </title> <link><?php the_permalink_rss(); ?> </link> <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?> </pubDate> <dc:creator><?php echo get_the_author_meta('login'); ?> </dc:creator> <guid isPermaLink="false"><?php esc_url(the_guid()); ?> </guid> <description></description> <content:encoded><?php echo wxr_cdata(apply_filters('the_content_export', $post->post_content)); ?> </content:encoded> <excerpt:encoded><?php echo wxr_cdata(apply_filters('the_excerpt_export', $post->post_excerpt)); ?> </excerpt:encoded> <wp:post_id><?php echo $post->ID; ?> </wp:post_id> <wp:post_date><?php echo $post->post_date; ?> </wp:post_date> <wp:post_date_gmt><?php echo $post->post_date_gmt; ?> </wp:post_date_gmt> <wp:comment_status><?php echo $post->comment_status; ?> </wp:comment_status> <wp:ping_status><?php echo $post->ping_status; ?> </wp:ping_status> <wp:post_name><?php echo $post->post_name; ?> </wp:post_name> <wp:status><?php echo $post->post_status; ?> </wp:status> <wp:post_parent><?php echo $post->post_parent; ?> </wp:post_parent> <wp:menu_order><?php echo $post->menu_order; ?> </wp:menu_order> <wp:post_type><?php echo $post->post_type; ?> </wp:post_type> <wp:post_password><?php echo $post->post_password; ?> </wp:post_password> <wp:is_sticky><?php echo $is_sticky; ?> </wp:is_sticky> <?php if ($post->post_type == 'attachment') { ?> <wp:attachment_url><?php echo wp_get_attachment_url($post->ID); ?> </wp:attachment_url> <?php } wxr_post_taxonomy(); $postmeta = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->postmeta} WHERE post_id = %d", $post->ID)); foreach ($postmeta as $meta) { if (apply_filters('wxr_export_skip_postmeta', false, $meta->meta_key, $meta)) { continue; } ?> <wp:postmeta> <wp:meta_key><?php echo $meta->meta_key; ?> </wp:meta_key> <wp:meta_value><?php echo wxr_cdata($meta->meta_value); ?> </wp:meta_value> </wp:postmeta> <?php } if (false === $args['skip_comments']) { $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->comments} WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID)); foreach ($comments as $c) { ?> <wp:comment> <wp:comment_id><?php echo $c->comment_ID; ?> </wp:comment_id> <wp:comment_author><?php echo wxr_cdata($c->comment_author); ?> </wp:comment_author> <wp:comment_author_email><?php echo $c->comment_author_email; ?> </wp:comment_author_email> <wp:comment_author_url><?php echo esc_url_raw($c->comment_author_url); ?> </wp:comment_author_url> <wp:comment_author_IP><?php echo $c->comment_author_IP; ?> </wp:comment_author_IP> <wp:comment_date><?php echo $c->comment_date; ?> </wp:comment_date> <wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?> </wp:comment_date_gmt> <wp:comment_content><?php echo wxr_cdata($c->comment_content); ?> </wp:comment_content> <wp:comment_approved><?php echo $c->comment_approved; ?> </wp:comment_approved> <wp:comment_type><?php echo $c->comment_type; ?> </wp:comment_type> <wp:comment_parent><?php echo $c->comment_parent; ?> </wp:comment_parent> <wp:comment_user_id><?php echo $c->user_id; ?> </wp:comment_user_id> <?php $c_meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->commentmeta} WHERE comment_id = %d", $c->comment_ID)); foreach ($c_meta as $meta) { ?> <wp:commentmeta> <wp:meta_key><?php echo $meta->meta_key; ?> </wp:meta_key> <wp:meta_value><?php echo wxr_cdata($meta->meta_value); ?> </wp:meta_value> </wp:commentmeta> <?php } ?> </wp:comment> <?php } } ?> </item> <?php $this->flush_export($full_path); } } } ?> </channel> </rss> <?php $this->flush_export($full_path); $this->end_export(); $this->stop_the_insanity(); $progress->finish(); $file_count++; } WP_CLI::success("All done with export"); }
/** * Generate some posts. * * @synopsis [--count=100] [--post_type=post] [--post_status=publish] [--post_author=<login>] [--post_date=<date>] [--max_depth=1] */ public function generate($args, $assoc_args) { global $wpdb; $defaults = array('count' => 100, 'max_depth' => 1, 'post_type' => 'post', 'post_status' => 'publish', 'post_author' => false, 'post_date' => current_time('mysql')); extract(wp_parse_args($assoc_args, $defaults), EXTR_SKIP); if (!post_type_exists($post_type)) { WP_CLI::error(sprintf("'%s' is not a registered post type.", $post_type)); } if ($post_author) { $post_author = get_user_by('login', $post_author); if ($post_author) { $post_author = $post_author->ID; } } // Get the total number of posts $total = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = %s", $post_type)); $label = get_post_type_object($post_type)->labels->singular_name; $hierarchical = get_post_type_object($post_type)->hierarchical; $limit = $count + $total; $notify = new \cli\progress\Bar('Generating posts', $count); $current_depth = 1; $current_parent = 0; for ($i = $total; $i < $limit; $i++) { if ($hierarchical) { if ($this->maybe_make_child() && $current_depth < $max_depth) { $current_parent = $post_ids[$i - 1]; $current_depth++; } else { if ($this->maybe_reset_depth()) { $current_depth = 1; $current_parent = 0; } } } $args = array('post_type' => $post_type, 'post_title' => "{$label} {$i}", 'post_status' => $post_status, 'post_author' => $post_author, 'post_parent' => $current_parent, 'post_name' => "post-{$i}", 'post_date' => $post_date); // Not using wp_insert_post() because it's slow $wpdb->insert($wpdb->posts, $args); $notify->tick(); } $notify->finish(); }
*/ if (cli\choose("Are you sure", 'yn', 'n') == 'n') { exit; } require_once $cmds['cache-clear']->name(); $schema = new \Doctrine\ORM\Tools\SchemaTool($app->em->value()); cli\line('Calculating changes..'); $stmts = $schema->getUpdateSchemaSql($app->em->getMetadataFactory()->getAllMetadata(), false); if (!count($stmts)) { cli\line("Nothing to update"); exit; } cli\line("The following statements will be executed:\n " . implode("\n ", $stmts)); if (cli\choose("Execute these statements", 'yn', 'n') == 'n') { exit; } $app->em->beginTransaction(); try { $bar = new cli\progress\Bar("Executing statements..", count($stmts), 1); $conn = $app->em->getConnection(); foreach ($stmts as $stmt) { $conn->exec($stmt); $bar->tick(); } $bar->finish(); $app->em->commit(); } catch (Exception $e) { $app->em->rollback(); cli\err('Error: ' . $e->getMessage()); } require_once $cmds['proxy-generate']->name();
/** * Restore media attachments with WP CLI. * * ### Config * * Example of `~/.wp-cli/config.yml`: * * media: * restore: * generate: false * uploads_url: http://www.bedrock.com/app/uploads/ * * ### Options * * #### `[--generate=false]` * Set this optional parameter if you want to (re)generate all the different image sizes. Defaults to not generating thumbnails. * * #### `[--uploads-url]` * The URL to the uploads directory, not including any date based folder structure. * * ### Examples * * wp media restore --uploads_url=http://www.bedrock.com/app/uploads/ * * @param array $args * @param array $assoc_args */ public function __invoke(array $args = [], array $assoc_args = []) { require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; // Merge default arguments. $assoc_args = array_merge($this->default_assoc_args, $assoc_args); // Get generate thumbnails value from WP CLI config or cmd argument. $generate = $assoc_args['generate'] === false ? $this->get_config_value('generate') : $assoc_args['generate']; $generate = is_string($generate) ? $generate === 'true' : (bool) $generate; // Get url base value from WP CLI config or cmd argument. $url_base = empty($assoc_args['uploads-url']) ? $this->get_config_value('uploads_url') : $assoc_args['uploads-url']; // Don't continue without a url. if (empty($url_base)) { WP_CLI::error('Missing url'); } $warnings = []; $attachments = $this->get_attachments(); $content_dir = CONTENT_DIR; $url_base = trailingslashit($url_base); $dir = wp_upload_dir(); $base_dir = trailingslashit($dir['basedir']); $results = ['attachments' => count($attachments), 'exists' => 0, 'downloaded' => 0, 'failed' => 0, 'generated' => 0]; // Output information about what the CLI command is doing. WP_CLI::line(sprintf('Downloading %d attachments%s', $results['attachments'], $generate ? ' and generating thumbnails.' : '.')); // Create a progress bar. $progress = new \cli\progress\Bar('Progress', $results['attachments']); try { foreach ($attachments as $id) { $progress->tick(); $attachment = get_post($id); $attached_file = get_post_meta($id, '_wp_attached_file', true); if (!empty($attached_file)) { $guid = $attachment->guid; $scheme = parse_url($url_base, PHP_URL_SCHEME); $domain = $scheme . '://' . parse_url($url_base, PHP_URL_HOST); $remote_url = $domain . parse_url($guid, PHP_URL_PATH); $response = wp_remote_head($remote_url); if (is_wp_error($response)) { $warnings[] = sprintf('Could not retrieve remote file for attachment ID %d, HTTP error "%s"', $id, $response->get_error_message()); } else { if (200 != wp_remote_retrieve_response_code($response)) { $warnings[] = sprintf('Could not retrieve remote file for attachment ID %d, HTTP response code %d', $id, wp_remote_retrieve_response_code($response)); continue; } } if (strpos($attached_file, $domain . '/uploads') !== false) { $attached_file = ltrim(str_replace($domain . '/uploads', '', $attached_file), '/'); } else { $attached_file = ltrim(str_replace($url_base, '', $attached_file), '/'); } $local_path = str_replace('/' . $content_dir . '/uploads/', '', $base_dir) . $attached_file; update_post_meta($id, '_wp_attached_file', $attached_file); } else { $remote_url = $url_base . $attached_file; $local_path = $base_dir . $attached_file; } // Check if the file already exists if (file_exists($local_path)) { $results['exists']++; continue; } // Create directory if it don't exists. wp_mkdir_p(dirname($local_path)); // Download attachment. $response = wp_safe_remote_get($remote_url, ['timeout' => 300, 'stream' => true, 'filename' => $local_path]); // If'ts a error, add a warning and a failed file. if (is_wp_error($response)) { if (file_exists($local_path)) { unlink($local_path); } $warnings[] = sprintf('Could not download %s, got error: %s', $remote_url, $response->get_error_message()); $results['failed']++; continue; } else { if (200 != wp_remote_retrieve_response_code($response)) { $warnings[] = sprintf('Could not retrieve remote file for attachment ID %d, HTTP response code %d', $id, wp_remote_retrieve_response_code($response)); continue; } } // Generate thumbnails if enabled and the attachment is a image. if ($generate && $attachment && 'attachment' === $attachment->post_type && strpos($attachment->post_mime_type, 'image/') !== false) { @set_time_limit(900); $metadata = wp_generate_attachment_metadata($id, $local_path); update_post_meta($id, '_wp_attachment_metadata', $metadata); if (is_wp_error($metadata)) { $warnings[] = sprintf('Error generating image thumbnails for attachment ID %d: %s', $id, $metadata->get_error_message()); } else { if (empty($metadata)) { $warnings[] = sprintf('Unknown error generating image thumbnails for attachment ID %d', $id); } else { $results['generated']++; } } } $results['downloaded']++; } } catch (Exception $e) { WP_CLI::error($e->getMessage()); } $progress->finish(); foreach ($warnings as $warning) { WP_CLI::warning($warning); } $lines = []; foreach ($results as $name => $count) { $lines[] = (object) ['Item' => $name, 'Count' => $count]; } \WP_CLI\Utils\format_items('table', $lines, ['Item', 'Count']); }
/** * Loop through all posts, setting the first attached image as the featured images * * ## OPTIONS * * ## EXAMPLES * * wp auto-thumbnail * */ public function __invoke($args, $assoc_args) { set_time_limit(0); // Get all public post types $get_post_types = get_post_types(array('public' => true)); // Post types array that will be used by default $post_types = array(); foreach ($get_post_types as $post_type) { // Only add post types that support if (post_type_supports($post_type, 'thumbnail')) { $post_types[] = $post_type; } } // Default values for wp query $defaults = array('post_type' => $post_types, 'posts_per_page' => -1, 'post_status' => 'any'); // Merge user args with defaults $assoc_args = wp_parse_args($assoc_args, $defaults); // The Query $the_query = new WP_Query($assoc_args); // Number of posts returned by query $found_posts = $the_query->found_posts; // Generate progess bar $progress = new \cli\progress\Bar('Progress', $found_posts); // Counter for number of post successfully processed $counter_success = 0; // Counter for number of post processed $counter_processed = 0; // The Loop while ($the_query->have_posts()) { $the_query->the_post(); // Move the processbar on $progress->tick(); $has_thumb = has_post_thumbnail(get_the_ID()); if (!$has_thumb) { $attached_image = get_children("post_parent=" . get_the_ID() . "&post_type=attachment&post_mime_type=image&numberposts=1"); if ($attached_image) { foreach ($attached_image as $attachment_id => $attachment) { set_post_thumbnail(get_the_ID(), $attachment_id); $counter_success++; } } $counter_processed++; } } $progress->finish(); /* Restore original Post Data * NB: Because we are using new WP_Query we aren't stomping on the * original $wp_query and it does not need to be reset. */ wp_reset_postdata(); if ($found_posts == 0) { WP_CLI::error("No posts found"); } elseif ($counter_processed == 0) { WP_CLI::error("No posts processed"); } elseif ($counter_success == 0) { WP_CLI::success("Unable to processed any posts"); } else { WP_CLI::success("Processing compelete. {$counter_success} of {$counter_processed} where processed successfully."); } }