menex.ru
← Все статьи

Добавляем на сайт свой фид (feed) для Яндекса

09.08.2019 • Теги: #hook #wordpress #Хук

Если с сайта нужно выгрузить фид для Яндекса или для другого сервиса. То есть два способа. Первый это всевозможные плагины, но они почти все работаю с Woocommerce. Второй вариант, написать выгрузку вручную.

С такой проблемой я столкнулся на сайте застройщика, квартиры были выполнены кастомными записями. А нужно было несколько фидов в XML-формате для разных сервисов. И вот как я поступил, покажу на примере одного фида. Я же по подобию делал их несколько.

В файл functions.php вставляю следующий код:

// Yandex.Realty RSS
add_action('init', 'AddYandexRSS');
function AddYandexRSS(){
  add_feed('yandex-realty.xml', 'ProceedYandexRealtyRSS');
}
function ProceedYandexRealtyRSS() {
  get_template_part('rss-realty');
}

Описание: yandex-realty.xml это адрес фида https://название\_сайта/yandex-realty.xml/ и rss-realty — это название шаблона который нужно положить в папку с темой сайта (rss-realty.php).

В файле rss-realty.php вставляем цикл WP_Query который берет из кастомных записей, кастомные поля. Для примера приведу готовый код Яндекс.Недвижимость.

<?php header('Content-Type: '.feed_content_type('rss-http').'; charset='.get_option('blog_charset'), true);
echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?>'; 
?>
<realty-feed xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06">
<generation-date><?= date('c'); ?></generation-date>

<?php
// задаем нужные нам критерии выборки данных из БД
$args = array(
    'post_type' => 'flat',
    'posts_per_page' => -1,
    'meta_query' => array(
    array(
        'key'     => 'flat_reservation',
        'value'   => 1,
        'compare' => '!=',
    ),
  ),
);

$query = new WP_Query( $args );
// Цикл
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
?>

<offer internal-id="<? the_ID(); ?>">
<type>продажа</type>         
<property-type>жилая</property-type>         
<category>квартира</category>
<creation-date><?= date('c'); ?></creation-date>   
<location>             
  <country>Россия</country>             
  <locality-name>Город</locality-name>             
  <address>Улица ул., д. номер</address> 
  <apartment><? echo get_field( 'flat_number', get_the_ID() ); ?></apartment> 
</location>         
<sales-agent>
<category>agency</category>             
  <phone>+71111111111</phone>
</sales-agent>     
<price>     
  <value><? echo get_field( 'flat_price', get_the_ID() ); ?></value>        
  <currency>RUR</currency> 
</price>
<area>     
  <value><? echo get_field( 'flat_area', get_the_ID() ); ?></value>     
  <unit>кв. м</unit> 
</area> 
<? if ( get_field( 'flat_rooms', get_the_ID() ) == 'студия' ) { ?>
<studio>да</studio>
<? }
else {
?>
<rooms><? echo preg_replace("/[^0-9]/", '', get_field( 'flat_rooms', get_the_ID() )); ?></rooms> 
<rooms-offered><? echo preg_replace("/[^0-9]/", '', get_field( 'flat_rooms', get_the_ID() )); ?></rooms-offered>
<? } ?>

<floor><? echo get_field( 'flat_level', get_the_ID() ); ?></floor>

</offer>
<?php       
    }
} else {
    // Постов не найдено
}
// Возвращаем оригинальные данные поста. Сбрасываем $post.
wp_reset_postdata();
?>

</realty-feed>