Дано:
Вы предложили клиенту использовать в качестве CMS – Wordpress и создали сайт используя его. Но клиент рад бы забивать посты руками, вот только обучать сотрудников работать в Wordpress ему не в кайф. Поэтому он предлагает сделать скрипт наполнения контентом, который будет брать посты из Excel-файла и в зависимости от того, изменились ли они или добавились, производить с ними нужные действия на сайте.
Сам файл будет состоять из трех полей:
- категории (через запятую ID категорий);
- название поста;
- контент поста;
- теги (через запятую);
- уникальный идентификатор поста (внешний по отношению к Wordpress)
Решение:
Создаем в корневой директории сайта файлик (к примеру postposts.php), и пишем в его начале строки:
define(’WP_USE_THEMES’, false); // отключаем поддержку тем
require(’./wp-blog-header.php’); // подключаем blog-header в котором у нас есть штатный API Wordpress
Теперь сохраняем наш Excel-файл с постами в корневой директории сайта (как к примеру posts.txt) из Excel как текстовый файл с разделителем табуляцией. Открываем его и сохраняем в UTF-8 без BOM.
Теперь пишем код который открывает файл и разбивает его на строки. Я делаю это вот так:
$f = file_get_contents(”posts.txt”); // читаем контент файла
$f = explode(”\t \r\n”,$f); // разбиваем его на строки
Техническое отступление:
Так как поле нашего Excel-файла контент может содержать текст с переносами на новую строку мы добавляем в конец каждой его строки столбец с пробелом (таким образом я могу точно знать что ряд полей закончен и его можно считать), условившись с клиентом о том, что контент не будет содержать табуляций.
Теперь у нас есть массив $f который можно прочитать в цикле foreach к примеру вот так:
foreach ($f as $k=>$v)
{
Во время чтения в переменной $v будет храниться наш ряд значений. Изначально он не будет разбит на поля, поэтому мы должны это сделать самостоятельно, к примеру вот так:
$v = explode(”\t”,$v); // получаем массив полей
$categories = explode(”,”,$v[0]); // получаем массив ID категорий (INT)
$title = trim($v[1]); // название поста
$content = trim($v[2]); // контент поста
$tags = explode(”,”,$v[3]); // получаем массив тегов
$pid = intval($v[4]); // получаем уникальный идентификатор поста (внутренний по отношению к нашему файлу)
Теперь у нас есть считанные данные поста которые необходимо внести в базу данных Wordpress. Естественно рекомендую для этого использовать штатный Wordpress-API, не зря же мы его подключали в начале файла :)
Мы будем использовать функции wp_insert_post() и wp_update_post(). К примеру вот так:
if ($pid>0) // если у нас считался корректный ID
{
$sql = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'unique_id' AND meta_value='$pid'"; // выбираем нужный нам пост по его meta-полю unique_id
$ID = $wpdb->get_results($sql); // получаем результат запроса
$ID = intval($ID[0]->post_id); // получаем Wordpress-post_id (ID нашего поста в Wordpress)
if ($ID>0) // если он выбрался
{
//создаем массив для wp_update_post
$my_post = array(
'ID'=> $ID,//ID поста
'post_category' => $categories, // категории
'post_content' => str_replace("\r\n","<br />",$content), // контент
'post_date' => date ("Y-m-d H:i:s"), // дата внесения поста
'post_status' => 'publish', // статус поста
'post_title' => $title, // название
'post_type' => 'post', // тип (page или post)
'tags_input' => $tags, // теги
'post_author' => 1);// ID автора поста
$post_id = wp_update_post( $my_post ); // вызываем функцию обновления поста которая вернет нам ID поста.
echo $pid." - existing post update<br />"; // выводим незатейливый лог :)
}
else // если поста еще нет в базе и он не выбрался
{
$my_post = array(
'post_category' => $categories, // категории
'post_content' => str_replace("\r\n","<br />",$content), // контент
'post_date' => date ("Y-m-d H:i:s"), // дата
'post_status' => 'publish', // статус
'post_title' => $title, // название
'post_type' => 'post', // тип записи
'tags_input' => $tags, // теги
'post_author' => 1); // ID автора
$post_id = wp_insert_post( $my_post ); // функция добавления поста
add_post_meta($post_id, "unique_id", $pid); // добавляем meta-поле unique_id которое понадобится нам для ориентации в наших постах из Excel-файла
echo $pid." - insert new post<br />"; // выводим в лог
}
}
Теперь закрываем наш foreach –
}
и на этом заканчивается наш скрипт.Выводы
Мы сделали удобную утилиту для Wordpress которую вполне можно оформить как плагин и выложить на wordpress.org. Надеюсь вам это пригодилось :)