WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Заполняем данными сайт на WordPress: большим количеством постов и комментариев (для тестирования)

Случилось, что нужно было протестировать кое-что на WordPress и нужно было, чтобы блог содержал много информации, большое количество постов и комментариев, т.е. нужно было большое количество контента. Решил быстренько написать пару функций для быстрого заполнения сайта огромным числом демо записей. В будущем думаю еще пригодится. Ну, а так как пригодится может не только мне, выкладываю результаты.

Чтобы наполнить сайт тестовыми данными для проверки структуры и верски, смотрите эту инструкцию.

Вот код, ставить который можно в любимый function.php:

$filler = new Fill_Database_Posts(
	$_GET['fill_db'] ?? 0,
	$_GET['fill_db_comments'] ?? 0,
	$_GET['cats'] ?? '',
	$_GET['tags'] ?? '',
);
$filler->init();

/**
 * ?fill_db=3000&cats=1|3&tags=tag1|tag2|tag3
 * ?fill_db_comments=3000
 */
class Fill_Database_Posts {

	private int $fill_limit;
	private int $fill_limit_comments;
	private string $cats;
	private string $tags;

	public function __construct( $fill_limit, $fill_limit_comments, $cats, $tags ) {
		$this->fill_limit = (int) $fill_limit ?: 50;
		$this->fill_limit_comments = (int) $fill_limit_comments ?: 50;
		$this->cats = sanitize_text_field( $cats );
		$this->tags = sanitize_text_field( $tags );
	}

	public function init() {
		add_filter( 'init', [ $this, '_fill_db' ] );
	}

	public function _fill_db() {
		wp_suspend_cache_addition( true ); // disable caching

		$this->fill_content();
		$this->fill_comments();
	}

	// ?fill_db=3000&cats=1|3&tags=tag1|tag2|tag3
	private function fill_content() {

		for( $i = 1; $i <= $this->fill_limit; $i++ ){
			$rand = rand( 1, 99999 );

			$content = '';
			for( $g = 0; $g < 30; $g++ ){
				$content .= "next post with random number: $rand . ";
			}

			$post_date = $this->get_random( '2020|2021|2022|2023' ) . '-0' . rand( 1, 9 ) . '-' . rand( 10, 30 ) . ' 23:25:59';

			$postid = wp_insert_post( wp_slash( [
				'comment_status' => $this->get_random( 'closed|open' ),
				'ping_status'    => $this->get_random( 'closed|open' ),
				'post_category'  => array_filter( [ (int) $this->get_random( $this->cats ?: '1' ) ] ),
				'tags_input'     => array_filter( [ (int) $this->get_random( $this->tags ?: '' ) ] ),
				'post_type'      => 'post',
				'post_title'     => "Post with a random number $rand",
				'post_content'   => $content,
				'post_date'      => $post_date,
				'post_status'    => 'publish',
			] ) );

			if( $postid ){
				$this->add_post_metadata( $postid );
			}

			flush();
		}
	}

	// ?fill_db_comments=3000
	private function fill_comments() {
		global $wpdb;

		$post_ids = $wpdb->get_col(
			"SELECT ID FROM $wpdb->posts WHERE post_status='publish' AND post_type='post' AND comment_status='open' ORDER BY rand() LIMIT 150"
		);

		for( $i = 1; $i <= $this->fill_limit_comments; $i++ ){
			$rand = rand( 1, 99999 );

			$content = '';
			for( $g = 0; $g < 5; $g++ ){
				$content .= "comment: $rand . ";
			}
			$post_date = $this->get_random( '2009|2011' ) . '-0' . rand( 1, 9 ) . '-' . rand( 10, 30 ) . ' 23:25:59';

			$postid = wp_insert_comment( [
				'comment_post_ID'      => (int) $post_ids[ array_rand( $post_ids ) ],
				'comment_author'       => 'commentator name',
				'comment_author_email' => 'admin@admin.com',
				'comment_author_url'   => '',
				'comment_content'      => $content,
				'comment_author_IP'    => '127.0.0.1',
				'comment_agent'        => 'Opera 10.0',
				'comment_date'         => $post_date,
				'comment_approved'     => 1,
			] );

			flush();
		}

	}

	// Add a custom field "views" to the created posts
	private function add_post_metadata( $post_id ) {
		update_post_meta( $post_id, 'views', rand( 10, 9999999 ) );
	}

	private function get_random( $data = '' ) {
		$arg = explode( '|', $data );
		$rand_key = array_rand( $arg );

		return $arg[ $rand_key ];
	}
}

Объяснять подробно не буду что и зачем. В двух словах о том, как это работает:

Чтобы заполнить блог постами

Дописываем в УРЛ, нечто такое

?fill_db=3000&cats=1|3&tags=tag1|tag2|tag3

где, 3000 - сколько постов добавятся. cats=1|3 - посты будут случайно добавляться в категорию 1 или 3. tags=tag1|tag2|tag3 - постам будут приписана одна из меток (использовать кириллицу нельзя, указываем слаги).

У постов также заполняется произвольное поле views, куда пишутся просмотры. Отредактируйте функцию fill_db_with_metadata_add_views(), чтобы изменить добавление произвольных полей.

Чтобы заполнить комментариями

Дописываем в УРЛ, нечто такое

?fill_db_comments=3000

Комментарии будут "оставляться" к случайным постам, открытым для комментирования. 3000 - количество комментариев.

Что касается того, где это можно применить? Где угодно - заполняем блог и тестируем его скорость, при 100к постов явные "болячки" всплывают на ура. Тестить можно шаблоны, функции и отдельные запросы к БД или что-нибудь еще.

11 комментариев
    Войти