XML для Яндекс.Недвижимости на PHP

XML для Яндекс.Недвижимости на PHP

Пример генерации XML фида на PHP в формате YRL (Yandex Realty Language) для Яндекс.Недвижимости и других сервисов.

В примере приводятся объявления для продажи жилой недвижимости, заполнены самые распространенные и обязательные поля.

Полное описание формата на https://yandex.ru/support/realty/requirements/requirements-sale-housing.html

<?php
header('Content-Type: text/xml; charset=utf-8');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');

$offer = '';

// Предполагается что объекты и все хар-ки хранятся в одной таблице.
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `apartments` ORDER BY `id` DESC");
$sth->execute();
$items = $sth->fetchAll(PDO::FETCH_ASSOC);

foreach ($items as $row) {
	// internal-id - уникальный id объявления
	$offer .= '<offer internal-id="' . $row['id'] . '">' . "\r\n";
	
	// Тип сделки (продажа или аренда)
	$offer .= '<type>продажа</type>' . "\r\n";
	
	// Тип недвижимости (только жилая)
	$offer .= '<property-type>жилая</property-type>' . "\r\n";
		
	// Категория объекта (дача, коттедж, дом, дом с участком, часть дома, квартира, комната, таунхаус, дуплекс, гараж)
	$offer .= '<category>квартира</category>' . "\r\n";

	// Дата создания объявления
	$offer .= '<creation-date>' . date('c', $row['date_add']) . '</creation-date>' . "\r\n";

	// Расположении объекта
	$offer .= '<location>' . "\r\n";;

	// Страна
	$offer .= '<country>' . $row['country'] . '</country>' . "\r\n";;
	
	// Название субъекта РФ. Необязательно для Москвы и Санкт-Петербурга
	$offer .= '<region>' . $row['region'] . '</region>';

	// Район
	$offer .= '<district>' . $row['district'] . '</district>';

	// Населенный пункт
	$offer .= '<locality-name>' . $row['city'] . '</locality-name>';
	
	// Улица и номер здания
	$offer .= '<address>' . $row['address'] . '</address>';

	// Ближайшая станция метро
	if (!empty($row['metro'])) {
		$offer .= '<metro>     
			<name>' . $row['metro'] . '</name>
		</metro>';
	}

	$offer .= '</location>';

	// Цена
	$offer .= '<price>
		<value>' . $row['price'] . '</value>
		<currency>RUR</currency> 
	</price>';	
	
	// Общая площадь
	$offer .= '<area>
		<value>' . $row['area'] . '</value>
		<unit>кв.м</unit> 
	</area>';			

	// Площадь комнаты, обязательный элемент для продажи и аренды комнаты
	//$offer .= '<room-space>
	//	<value>' . $row['room_area'] . '</value>
	//	<unit>кв.м</unit> 
	//</room-space>';	

	// Жилая площадь
	$offer .= '<living-space>
		<value>' . $row['live_area'] . '</value>
		<unit>кв.м</unit> 
	</living-space>';	
	
	// Площадь кухни
	$offer .= '
	<kitchen-space>
		<value>' . $row['kitchen_area'] . '</value>
		<unit>кв.м</unit> 
	</kitchen-space>';	
	
	// Общее количество комнат в квартире
	$offer .= '<rooms>' . $row['rooms'] . '</rooms>' . "\r\n";
	
	// Количество комнат, участвующих в сделке
	$offer .= '<rooms-offered>' . $row['rooms'] . '</rooms-offered>' . "\r\n";
	
	// Этаж
	$offer .= '<floor>' . $row['floor'] . '</floor>' . "\r\n";
	
	// Дополнительная информация
	$offer .= '<description><![CDATA[' . strip_tags($row['text']) . ']]></description>' . "\r\n"; 
	
	// Фото, может быть несколько тегов
	$images = explode(';', $row['image']);
	foreach ($images as $img) {
		$offer .= '<image>' . $img . '</image>' . "\r\n";		
	}

	// Информация о продавце:
	$offer .= '<sales-agent>';
	
	// Имя продавца или агента
	$offer .= '<name>' . $row['agent'] . '</name>' . "\r\n";
	
	// Номер телефона (+74951234567), несколько номеров передаются в отдельном элементе phone
	$phone = $row['phone'];
	$phone = str_replace(array('+', '-', '(', ')', ' '), '', $phone);
	$phone = substr_replace($phone, '+7', 0, 1);
	$offer .= '<phone>' . $phone . '</phone>';

	// Тип продавца (агентство или застройщик)
	$offer .= '<category>агентство</category>' . "\r\n";
 
	// Название организации
	$offer .= '<organization>' . $row['organization'] . '</organization>' . "\r\n";
 
	// Сайт агентства или застройщика
	$offer .= '<url>https://example.com</url>' . "\r\n"; 
	
	// Электронный адрес продавца. Мы не покажем его покупателям
	$offer .= '<email>' . @$row['email'] . '</email>' . "\r\n";
	
	// Ссылка на фотографию агента или логотип компании (только 1 изображение)
	$offer .= '<photo>https://example.com/logo.png</photo>' . "\r\n";

	$offer .= '</sales-agent>' . "\r\n";
	$offer .= '</offer>' . "\r\n";
}

echo '<?xml version="1.0" encoding="utf-8"?>
<realty-feed xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06">
	<generation-date>' . date('c') . '</generation-date>
	' . $offer . '
</realty-feed>';

exit;
PHP

Результат:

<?xml version="1.0" encoding="utf-8"?>
<realty-feed xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06">
	<generation-date>2020-01-27T17:59:44+03:00</generation-date>
	<offer internal-id="123">
		<type>продажа</type>
		<property-type>жилая</property-type>
		<category>квартира</category>
		<creation-date>2020-01-27T15:38:43+03:00</creation-date>
		<location>
			<country>Россия</country>
			<region>Московская область</region><district></district><locality-name>Красногорск</locality-name><address>ул.Школьная, д.17</address>
			<metro>     
				<name>Митино</name>
			</metro>
		</location>
		<price>
			<value>5500000</value>
			<currency>RUR</currency> 
		</price>
		<area>
			<value>32</value>
			<unit>кв.м</unit> 
		</area>
		<living-space>
			<value>19</value>
			<unit>кв.м</unit> 
		</living-space>
		<kitchen-space>
			<value>5.4</value>
			<unit>кв.м</unit> 
		</kitchen-space>
		<rooms>1</rooms>
		<rooms-offered>1</rooms-offered>
		<floor>1</floor>
		<description><![CDATA[Агентство недвижимости предлагает купить однокомнатную квартиру, расположенную по адресу...]]></description>
		<image>https://example.com/uploads/1.jpg</image>
		<image>https://example.com/uploads/2.jpg</image>
		<sales-agent>
			<name>Иван Иванов</name>
			<phone>+74951234567</phone><category>агентство</category>
			<organization>Фирма</organization>
			<url>https://example.com</url>
			<email>mail@example.com</email>
			<photo>https://example.com/logo.png</photo>
		</sales-agent>
	</offer>
</realty-feed>
27.01.2020
5992
Предыдущая запись Как обновить iframe
Следующая запись Удаление символов в JavaScript

Комментарии

, чтобы добавить комментарий.

Другие публикации

Перекодировка текста UTF-8 и WINDOWS-1251
Проблема кодировок часто возникает при написании парсеров, чтении данных из xml и csv файлов. Ниже представлены способы...
79914
-12
date() – форматирование даты PHP
date($format, $timestamp) – форматирует дату/время по шаблону, где...
74107
+1
Чтение XML файла Яндекс Маркета в PHP
Если требуется сделать импорт или обновление товаров по XML файлу Яндекс Маркета, можно применить расширении PHP...
15008
+5
RSS-файл для Яндекс Турбо-страниц
Турбо-страницы позволяют пользователям посмотреть легкую версию сайта, которая загружается быстрее в десятки раз, а...
23724
+7
RSS канал на PHP
Пример генерации фида RSS 2.0 на PHP, полную спецификацию можно посмотреть на https://validator.w3.org/feed/docs/rss2.html
6906
+2
Описание мета-тегов
В статье представлены все самые встречающеюся мета-теги с примерами и пояснениями их использования.
29884
+4