<?php
/*
Plugin Name: FlatBaseControl
Plugin URI:
Description: плагин для управления базой данных информации о квартирах с использованием мета-полей (custom fields)
Version: 0.1
Author: Сорокин Роман
Author URI:
*/
/* Copyright 2009 Сорокин Роман (email:gameronly@yandex.ru)
Все права принадлежат его автору.
*/
// ID рубрики для базы квартир
define('FLATBASECONTROL_BASE_TERM_ID', 5);
// мета-поле "выводить на главной"
define('FLATBASECONTROL_SHOW_ON_MAINPAGE', 'Выводить на главной');
// перечень полей
$flat_base_control_fields = array
(
1 => "ID",
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 => "В собственности более 3-х лет",
32 => "Планируется снос",
33 => "Продажа доли",
34 => "Размер доли",
35 => "Соседей в квартире",
36 => "Городской телефон",
37 => "Интернет",
38 => "Приватизированная квартира",
39 => "Ремонт",
40 => "Свободная планировка",
41 => "Дополнительные сведения",
42 => "Фото",
43 => "e-mail",
44 => "www-адрес",
45 => "Контактное лицо",
46 => "Контактный телефон"
);
function flat_base_control_config_page()
{
if ( function_exists('add_submenu_page') )
add_submenu_page('plugins.php', 'Загрузка файла', 'База квартир', 'manage_options', 'upload_file', 'upload_file');
}
add_action('admin_menu', 'flat_base_control_config_page');
function upload_file()
{
global $wpdb;
global $flat_base_control_fields;
// данные для вставки новой записи в базу
$post = array
(
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_author' => 1,
'post_date' => date('Y-m-d H:i:s'),
'post_excerpt' => '',
'post_name' => 'base',
'post_category' => array(FLATBASECONTROL_BASE_TERM_ID),
'post_parent' => 0,
'post_password' => '',
'post_status' => 'publish',
'post_title' => '--',
'post_content' => '',
'post_type' => 'post',
'to_ping' => '',
);
if(!empty($_POST))
{
// список полей
$post_fields = $_POST['fields'];
// ищем поле с параметром ID
$post_id_field = null;
foreach($post_fields as $key=>$post_field)
{
if($post_field==1)
{
$post_id_field = $key;
}
}
//print '<pre>';var_dump($post_fields, $post_id_field);'</pre>';exit();
if(!$_FILES['csv']['size'] || empty($_FILES['csv']))
{
//return array('error'=>true, 'msg'=>'Загруженный файл пуст');
throw new Exception('Загруженный файл пуст', -1);
}
if($_FILES['csv']['error'])
{
//return array('error'=>true, 'msg'=>'Ошибка при загрузке файла');
throw new Exception('Ошибка при загрузке файла', -1);
}
if('.csv'!=stristr($_FILES['csv']['name'], '.csv'))
{
//return array('error'=>true, 'msg'=>'Файл должен иметь расширение CSV');
throw new Exception('Файл должен иметь расширение CSV', -1);
}
try
{
// отключаем лимит на используемое время
set_time_limit(0);
// смотрим, что делать с присутствующими в базе записями
switch($_POST['action'])
{
// удаляем
case '2':
{
$query =
'DELETE FROM '.$wpdb->prefix.'posts, '.$wpdb->prefix.'postmeta, '.$wpdb->prefix.'term_relationships '.
'USING '.$wpdb->prefix.'posts, '.$wpdb->prefix.'term_relationships, '.$wpdb->prefix.'postmeta '.
'WHERE '.$wpdb->prefix.'term_relationships.object_id = '.$wpdb->prefix.'posts.ID AND '.$wpdb->prefix.'term_relationships.`term_taxonomy_id`='.FLATBASECONTROL_BASE_TERM_ID.' AND '.$wpdb->prefix.'postmeta.post_id = '.$wpdb->prefix.'posts.ID';
//var_dump($query, $wpdb->query($query));
$wpdb->query($query);
break;
}
// деактивируем (в черновики)
case '3':
{
$query =
'UPDATE '.$wpdb->prefix.'posts, '.$wpdb->prefix.'term_relationships '.
'SET '.$wpdb->prefix.'posts.post_status = "pending" '.
'WHERE '.$wpdb->prefix.'term_relationships.object_id = '.$wpdb->prefix.'posts.ID AND '.$wpdb->prefix.'term_relationships.`term_taxonomy_id`='.FLATBASECONTROL_BASE_TERM_ID;
//var_dump($query, $wpdb->query($query));
$wpdb->query($query);
break;
}
default: null;
}
// открываем файл
$handle = fopen($_FILES['csv']['tmp_name'], 'r');
// первая строка - заголовок? пропускаем...
if($_POST['have_header'])
{
fgetcsv($handle);
}
// обрабатываем строки файла
while($data = fgetcsv($handle, 100000, ';'))
{
// переводим в кодировку UTF8
if($_POST['charset']!='utf-8')
{
foreach($data as &$el)
{
$el = htmlentities(mb_convert_encoding($el,'utf-8', $_POST['charset']), ENT_QUOTES, 'utf-8');
}
}
// обрабатываем саму запись
$post['post_title'] = (isset($post_id_field) && $post_fields[$post_id_field]?'Квартира №'.$data[$post_id_field-1]:'Квартира');
//print '<pre>';var_dump($data, $post);print '</pre>';exit();
// ищем запись с мета-полем ID
$result = null;
if(isset($post_id_field) && !empty($data[$post_id_field-1]))
{
$query =
'SELECT ID FROM '.$wpdb->prefix.'posts AS p '.
'LEFT JOIN '.$wpdb->prefix.'term_relationships AS tr ON tr.object_id = p.ID '.
'LEFT JOIN '.$wpdb->prefix.'postmeta AS pm ON pm.post_id = p.ID '.
'WHERE tr.`term_taxonomy_id`='.FLATBASECONTROL_BASE_TERM_ID.' AND pm.meta_key = "ID" AND pm.meta_value="'.$data[$post_id_field-1].'"';
$result = $wpdb->get_row($query, ARRAY_A);
//var_dump($result);exit();
}
// нашли запись с ID - обновим ее
if($result)
{
wp_update_post(array_merge($post, array('ID'=>$result['ID'])));
$result = $result['ID'];
}
// иначе - добавим новую
else
{
$result = wp_insert_post($post);
}
//print '<pre>';var_dump($result);print '</pre>';exit();
if($result)
{
foreach($post_fields as $key=>$el)
{
if(!empty($el))
{
//print $el.'-'.$data[$key].'<br/>'.PHP_EOL;
add_post_meta($result, $flat_base_control_fields[$el], $data[$key-1], true) or update_post_meta($result, $flat_base_control_fields[$el], $data[$key-1]);
}
else
{
delete_post_meta($result, $el);
}
}
add_post_meta($result, FLATBASECONTROL_SHOW_ON_MAINPAGE, 1, true) or update_post_meta($result, FLATBASECONTROL_SHOW_ON_MAINPAGE, 1);
//print 'Запись с ID #'.$post_id_field.' успешно добавлена';
}
else
{
// ошибка
throw new Exception('');
}
}
print '<br>'.PHP_EOL;
// закрываем файл
fclose($handle);
print 'Данные из файла успешно импортированы<br><br>';
}
catch (Exception $e)
{
if($e->getCode() == -1)
{
print $e->getMessage().'<br><br>';
}
else
{
print 'Ошибка при выполнении импорта данных<br><br>';
}
}
}
?>
<form action="" method="post" enctype="multipart/form-data">
<table border="0" cellpadding="2" cellspacing="3">
<tr>
<td>Файл с данными</td>
<td><input type="file" name="csv" /></td>
<td> </td>
</tr>
<tr>
<td>Первая строка файла - заголовок</td>
<td><input type="checkbox" name="have_header" checked /></td>
<td> </td>
</tr>
<tr>
<td>Кодировка файла</td>
<td>
<select name="charset">
<option value="windows-1251">windows-1251</option>
<option value="utf-8">utf-8</option>
<option value="koi8-r">koi8-r</option>
</select>
</td>
<td> </td>
</tr>
<tr>
<td valign="top">Записи, отсутствующие в файле</td>
<td style="padding-bottom:20px;">
<input type="radio" name="action" value="1" checked />Оставить как есть<br/>
<input type="radio" name="action" value="2" />Удалить из базы<br/>
<input type="radio" name="action" value="3" />Деактивировать
</td>
<td> </td>
</tr>
<?php $counter = 0;?>
<?php foreach($flat_base_control_fields as $key=>$field):?>
<tr>
<td>Поле <?=++$counter;?> (<span style="color:grey;"><?=$field;?></span>):</td>
<td>
<?php
// выпадающий список полей
$select = '<select id="id_'.$key.'" name="fields['.$key.']"><option value="0">-</option>'.PHP_EOL;
foreach($flat_base_control_fields as $key1=>$field1)
{
$select .= '<option value="'.$key1.'"'.($key==$key1?' selected="selected"':'').'>'.strip_tags($field1).'</option>'.PHP_EOL;
}
$select.= '</select>';
print $select;
?>
</td>
<td><input type="button" value="очистить поле" onclick="document.getElementById('id_<?=$key;?>').selectedIndex=0;" /></td>
</tr>
<?php endforeach;?>
<tr>
<td> </td>
<td style="padding-top:20px;"><input type="submit" name="submit" value="загрузить файл" /></td>
<td> </td>
</tr>
</table>
</form>
<?php
}
?>