Пример генерации 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;
Результат:
<?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>