Генерация контента в WordPress c помощью wp_create_category и wp_insert_post
Сейчас занимаюсь тем что создаю небольшой сайт на 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 (время приема и парсинга запросов).
Почему добавляется 2 записи одинаковые?
Я вывел $id, допустим равно 343. а в бд добавляются 2 записи одинаковые с id(343, 344)