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

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

Иногда возникает необходимость провести тестирование на WordPress, и для этого нужно наполнить блог большим количеством информации — постами и комментариями. Я решил написать несколько функций, которые помогут быстро заполнить сайт демонстрационными постами. Думаю, это может пригодиться не только мне, поэтому делюсь своим решением.

Как создать демонстрационные данные для тестирования

Для того чтобы заполнить сайт тестовыми данными и проверить его структуру и внешний вид, вы можете следовать этой инструкции.

Вот код, который необходимо вставить в ваш файл functions.php:


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

Примечание: Для использования кода вы можете добавлять параметры к URL, как описано ниже.

Как заполнить блог постами

Чтобы добавить посты, добавьте к URL следующую строку:

?fill_db=3000&cats=1|3&tags=tag1|tag2|tag3
  • 3000 — количество постов, которые нужно добавить.
  • cats=1|3 — посты будут случайным образом добавлены в категории 1 или 3.
  • tags=tag1|tag2|tag3 — посты получат один из указанных тегов (не используйте кириллические символы, указывайте слаги).

Каждый пост будет также содержать дополнительное поле "views", в котором будет указан случайный номер просмотров. Если хотите изменить добавление пользовательских полей, редактируйте функцию add_post_metadata().

Как заполнить блог комментариями

Чтобы добавить комментарии, добавьте к URL:

?fill_db_comments=3000

Эти комментарии будут "оставлены" на случайных постах, для которых активирована возможность комментирования. 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 ); // отключаем кэширование

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

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

        $content = '';
        for( $g = 0; $g < 30; $g++ ){
            $content .= "следующий пост с случайным номером: $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'     => "Пост с случайным номером $rand",
            'post_content'   => $content,
            'post_date'      => $post_date,
            'post_status'    => 'publish',
        ] ) );

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

        flush();
    }
}

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 .= "комментарий: $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'       => 'имя комментатора',
            'comment_author_email' => '[email protected]',
            '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();
    }
}

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 ];
}

}

Заключение

Этот код может быть полезен в самых разных ситуациях: для заполнения блога и проверки его быстродействия. При наличии 100000 постов сразу выявляются очевидные "проблемы". Вы можете тестировать шаблоны, функции или отдельные запросы к базе данных.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *