Генерация контента в WordPress c помощью wp_create_category и wp_insert_post

Генерация контента WordPressСейчас занимаюсь тем что создаю небольшой сайт на WP для работы с партнеркой, база которой выгружается в отдельный файл. Одна из задач состоит в том, как из этого файла сгенерировать посты, соответствующие им рубрики и метки. Тут есть два пути: использовать набор имеющихся WP функций или писать их самостоятельно. Второй путь предполагает знание структуры вордпрессовской базы и sql. Я предпочел первый :-) .


Цель:
Продемонстрировать работу WP функций: добавления поста (wp_insert_post), категории (wp_create_category) и др., а также привести пример куска php кода для генерации контента.

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

  • wp_create_category (добавление категории).
  • wp_insert_post (добавление поста и связанных меток).
  • get_post_status (получение статуса поста, для проверки существования поста в базе).

wp_create_category – создание категории (рубрики)

1
<?php wp_create_category( $cat_name, $parent ); ?>

$cat_name – имя создаваемой категории,
$parent – идентификатор родительской категории, если родительской категории нет, то ставим 0.
Функция возвращает либо 0, если создать категорию не удалось, либо идентификатор созданной категории. Прелесть еще заключается в том, что если такая категория есть уже, то функция просто вернет ее идентификатор.

wp_insert_post – создание поста

1
<?php wp_insert_post( $post ); ?>

$post – ассоциативный массив, содержащий параметры поста.
Хочется обратить внимание на следующие его элементы:
$post['import_id'] – в этом элементе можно задать желаемый идентификатор поста. Т.е. если у Вас есть база (файл), в котором проставлены идентификаторы записей, то эти ид можно подставить сюда.
$post['tags_input'] – элемент-строка, куда запихиваются тэги (метки) через запятую.
$post['post_category'] – элемент-массив, содержащий идентификаторы категорий (рубрик), с которыми необходимо связать пост.
Описания остальных элементов массива $post можете найти в документации к wp_insert_post.
Функция возвращает либо 0, если создать пост не удалось, либо идентификатор созданного поста.

get_post_status – получить статус поста.

1
<?php get_post_status( $ID ) ?>

$ID – идентификатор поста.
Используется мной не по назначению. С ее помощью проверяется существование поста в базе с таким ид.
Функция возвращает либо false, если поста нет, либо статус поста.
Допустим содержимое дампа базы мы распарсили и загнали в подобный массив:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$imp_posts = array
(
array(
        "id"=>10,
        "title"=>"title10",
        "content"=>"<p>This is <h1>content10</h1></p>",
        "categories"=>"category1, category15, category16", 
        "tags"=>"tag10, tag22, tag27"
      ),
array(
        "id"=>23,
        "title"=>"title23",
        "content"=>"<p>This is <h1>content23</h1></p>",
        "categories"=>"category51, category1, category6", 
        "tags"=>"tag13, tag25, tag57"
       ),
array(
        "id"=>7,
        "title"=>"title7",
        "content"=>"<p>This is <h1>content7</h1></p>",
        "categories"=>"category6, category16, category31", 
        "tags"=>"tag27, tag10, tag57"
       ),
);

Тогда код реализующий вышеописанную задачу будет следующий:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//Создаем родительскую категорию
$parent_cat_id    = wp_create_category('Родительская категория', 0); 
 
//счетчик количества добавленных постов
$count_of_inserted_posts = 0;
 
foreach ($imp_posts as $imp_post) 
	{
	//если у поста есть хоть какой-нибудь статус, значит он существует, :-)
	//его пропускаем
	if ( get_post_status((int)$imp_post["id"]) ) {continue;}
 
        $post_category = array ();
 
	//строку с категориями тек. поста разбиваем на эл-нты массива
	$cats_of_cur_post = split(',',$imp_post["categories"]);
 
	while (list($key, $value) = each($cats_of_cur_post))
		{
		//в post_category помещаем ид. категорий
		$post_category[]=wp_create_category($value, $parent_cat_id); 
		}
 
	// Create post object
	$my_post = array();
	$my_post['post_title'] 	 = $imp_post["title"];
	//тело поста
	$my_post['post_content'] = $imp_post["content"];
	$my_post['post_status']  = 'publish';
	$my_post['post_author']  = 1;
	//если в файле есть ид поста, то указываем его
	$my_post['import_id']  	 = $imp_post["id"];
	//строка с тэгами	
	$my_post['tags_input']  = $imp_post["tags"];
	//массив ид категорий, которым принадлежит пост
	$my_post['post_category'] = $post_category;
 
	// Insert the post into the database
	$id=wp_insert_post($my_post);
	if ($id <> 0) {$count_of_inserted_posts++;}
 
	unset($post_category);
	}
 
echo("Добавлено ".$count_of_inserted_posts." постов в базу");

Теперь что касается настроек сервера. Дело в том что процесс создания контента занимает немало времени и я категорически не советую делать это на сервере хостера из-за наличия таймаутов (об этом ниже). Куда проще запустить локально Apache и PHP и выполнить первоначальную генерацию постов, меток и категорий, после чего выгрузить базу в файл и перенести на хостинг. Дальнейшие же обновления естественно запускать уже на хостинге. Для того чтобы скрипт не вываливался по таймауту необходимо выполнить три настройки: в httpd.conf установить переменную Timeout 5000 (время ожидания в секундах, прежде чем попытки приема или отправления данных выдадут сообщение о тайм-ауте.), в php.ini установить max_execution_time = 5000 (время выполнения скрипта) и там же max_input_time = -1 (время приема и парсинга запросов).

Комментарии:

  1. Dinar

    Почему добавляется 2 записи одинаковые?
    Я вывел $id, допустим равно 343. а в бд добавляются 2 записи одинаковые с id(343, 344)