Search
Write a publication
Pull to refresh

Wordpress – скрипт наполнения контентом

Дано:



Вы предложили клиенту использовать в качестве 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. Надеюсь вам это пригодилось :)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.