Сервис «Яндекс. Оригинальные тексты» позволяет SEO-специалистам заносить уникальные тексты, которые недавно были опубликованы или только готовятся к выходу. Т. к. сервис активно эксплуатируется в интернет-маркетинге, то автоматизация процесса сборки и отправки текстов значительно облегчила бы работу на сайте.
Для решения этой задачи был разоработан компонент YandexOriginalText: Яндекс.Оригинальные тексты. Изначально он создавался для работы с контентом, получаемым из нодус-объектов, но методы классов были расширены для работы с данными объектов других типов. Так что компонент универсален и не требует дополнительной установки компонента Nodus, если в этом нет необходимости.
В статье будет рассмотрен общий принцип настройки компонента и особенности работы с объектами разных типов.
Настройка компонента
Для начала необходимо настроить доступ к Вэбмастеру Яндекса. Но этот вопрос будет рассмотрен позже.
Пока рассмотрим настройки и параметры конфигурационного файла. Файл находится по адресу app/components/YandexOriginalText/config/config.php. Массив настроек уже определен, нам необходимо поменять значения двух настроек: site_yandex_id и site_yandex_oauth. Значения, установленные в этих двух настройках приведены для примера и не являются настоящими.
// app/components/YandexOriginalText/config/config.php return array( 'max_at_day' => 100, 'min_text' => 500, 'max_text' => 32000, 'auth' => array( 'ru' => array( 'site_yandex_id' => 55566777, 'site_yandex_oauth' => 'a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1', ), ) );
Параметры
Большинство значений установлены, исходя из условий сервиса Яндекса, предъявляемых к материалам.
- max_at_day - максимальное количество материалов, которое может быть отправлено в день.
- min_text - минимально допустимое количество знаков в материале.
- max_text - максимально допустимое количество знаков в материале.
- auth - настройка доступа к Вебмастеру Яндекса. В ключе указывается параметр, определяющий язык.
- site_yandex_id - идентификатор сайта, полученный из Вэбмастера.
- site_yandex_oauth - отладочный токен, полученный из Вэбмастера.
Кроме того, можно заметить, что у auth ключом служит параметр, указывающий на язык. Если сайт разработан на нескольких языках, то для каждой версии заводят свой Вэбмастер, и для каждого необходимо будет описать настройки в конфигурационном файле.
Например, настройки для русской и английской версии сайта.
// app/components/YandexOriginalText/config/config.php return array( 'max_at_day' => 100, 'min_text' => 500, 'max_text' => 32000, 'auth' => array( 'ru' => array( 'site_yandex_id' => 55566777, 'site_yandex_oauth' => 'a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1', 'en' => array( 'site_yandex_id' => 55548777, 'site_yandex_oauth' => 'a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8', ), ) );
Получение идентификатора сайта и токена
Теперь вернемся к вопросу о том, как получить доступ к Яндексу. От него нам понадобится идентификатор сайта.
1. Заходим в Вебмастер в раздел Мои сайты. Проходим авторизацию. Выбираем сайт, для которого настраивается компонент. Следуем на страницу Содержимое сайта->Оригинальные тексты. Из url этой страницы можно получить идентификатор сайта. Например есть url:
http://webmaster.yandex.ru/site/service-plugin.xml?host=189645&service=ORIGINALS&need_auth=false&new_site=false
Где числовой идентификатор сайта - это число в GET-параметре host, то есть в данном случае host=189645.
2. Для агентского аккаунта client-adv получение идентификатора происходит таким же путем, который был описан выше. Только сначала нужно войти в агентский аккаунт, потом выбрать нужный сайт.
3. Теперь необходимо получить токен.
Для этого на странице с зарегистрированными приложениями https://oauth.yandex.ru/client/my пройдем по ссылке Client Вебмастер API
https://oauth.yandex.ru/client/c5302a50e6f6495fa10d23b407f7a105
Следуя инструкции на странице
http://api.yandex.ru/oauth/doc/dg/tasks/get-oauth-token.xml (пропустив второй пункт, т.к. приложение уже есть), получить токен.
Т.е. переходим на страницу
https://oauth.yandex.ru/verification_code?dev=True#access_token=a346cf664f5645c29ac3a9279e261d81&token_type=bearer&expires_in=15552000.
В ответной ссылке значение GET-параметра access_token и будет токеном. В данном случае access_token=a346cf664f5645c29ac3a9279e261d81.
Если же для сайта используется свой Вебмастер, то необходимо воспользоваться инструкцией для получения токена
http://api.yandex.ru/oauth/doc/dg/tasks/get-oauth-token.xml.
Итак, получив идентификатор и токен, записываем их в параметры site_yandex_id и site_yandex_oauth.
... 'auth' => array( 'ru' => array( 'site_yandex_id' => 189645, 'site_yandex_oauth' => 'a346cf664f5645c29ac3a9279e261d81, ...
Предустановленные возможности
1. Если установлен компонент Nodus, то YandexOriginalText предоставляет дополнительную возможность отмечать на отправку каждый материал или термин словаря при его создании или редактировании. После установки в каждом материале и в словаре появляется чекбокс Отправить в Yandex Оригинальные тексты. Он выводится или на вкладке с полем content или на первой вкладке, если такого поля нет.
Если текст из редактируемого объекта ни разу не отправлялся ранее, то «галочка» по умолчанию взведена. Иначе она по умолчанию отключена и рядом выводятся данные последней отправки.
2. Если компонент Nodus не установлен, то вывод чекбокса не предусмотрен. Решение о его реализации остается на усмотрение разработчика.
Список заданий на отправку
Для каждого помеченного к отправке материала или термина словаря, собираются данные и формируется задание на отправку. Увидеть список заданий можно в админе: вкладка «Компоненты->Yandex - оригинальные тексты» (/admin/yandex_original_text/).
Список представляет собой таблицу, каждая строка которой соответствует определенному материалу или термину словаря. В этом списке можно будет отслеживать как идет процесс отправки, возникали ли какие-то ошибки.
Кроме того, предусмотрена возможность создать задание вручную, указав id материала в таблице, его тип и таблицу. Аналогично можно заполнять эту таблицу по крону (например, написать скрипт добавляющий нужные записи при модификации данных контента).
Настройка крона для отправки данных в Яндекс
После того как список заданий сформирован, необходимо в кроне запустить скрипт для отправки уникальных текстов.
Для этой цели в компоненте был создан класс Component_YandexOriginalText_CLI с методом send_to_yandex_original_texts. Таким образом, при запуске скрипта в командной строке нужно добавить этот метод.
Например:
*/1 * * * * (cd /путь/www/; /usr/local/bin/php5 index.php send_to_yandex_original_texts)
Результаты работы скрипта будут заноситься в таблицу заданий /admin/yandex_original_text/. Новые тексты можно будет посмотреть и в списке оригинальных текстов в Яндексе.
Произвольное формирование оригинального текста для объектов Nodus
1. По умолчанию текст для отправки формируется из заголовка (title) и контента (content). Часто этого не достаточно для полноценного уникального текста. Тогда нужно создать свой метод, который будет формировать контент нужным образом.
Для этого необходимо переопределить метод getcontent_selector в классе Component_YandexOriginalText_App_ItemContent, который будет формировать каким-то образом выбранные данные и возвращать строку. Если необходимо описать метод для конкретного типа данных (например, news, page, ...), то в имени метода необходимо добавить getcontent_selector_datatype, где datatype - тип данных объекта Nodus.
Рассмотрим пример. Необходимо формировать уникальные тексты для раздела новостей. На странице новости выводится заголовок (title), анонс (announce), а затем текст новости (content), то определим соответствующий метод для типа news:
// app/components/YandexOriginalText/app/ItemContent.php Core::load('Component.YandexOriginalText.ItemContent'); class Component_YandexOriginalText_App_ItemContent extends Component_YandexOriginalText_ItemContent implements Core_ModuleInterface { const VERSION = '1.0.0'; public static function getcontent_selector_news($item, $lang) { $item_lang = $item->lang; if ($item_lang == 'all' || $item_lang == $lang) { $langs = CMS::lang()->langs(); if ($langs && isset($langs[$lang])) { CMS::site_set_lang($lang); } $content = trim(sprintf('%s', $item->field('title'))); $content = self::setTitle($content); if ($item->announce) { $content .= trim(sprintf('%s', $item->field('announce'))); } if ($item->content) { $content .= trim(sprintf('%s', $item->field('content'))); } } return $content; }
2. В качестве оригинального текста можно передать весь текст шаблона full какого-либо материала. Например, для новостей теперь передадим шаблон вывода одной новости ful.
// app/components/YandexOriginalText/app/ItemContent.php Core::load('Component.YandexOriginalText.ItemContent'); class Component_YandexOriginalText_App_ItemContent extends Component_YandexOriginalText_ItemContent implements Core_ModuleInterface { const VERSION = '1.0.0'; public static function getcontent_selector_news($item, $lang) { $item_lang = $item->lang; if ($item_lang == 'all' || $item_lang == $lang) { $langs = CMS::lang()->langs(); if ($langs && isset($langs[$lang])) { CMS::site_set_lang($lang); } $content = $item->render('full', 'auto'); } return $content; } }
Часто в шаблоне кроме нужных данных для передачи, содержится множество посторонней информации, например, ссылки на предыдущую и следующую новость, ссылка на все новости, и т. д. Можно создать либо свой шаблон вывода в нужном типе данных с заданными полями и отдавать уже его. Или скопировать существующий, а в нем уже оставить нужные поля.
Например для новостей можно создать шаблон full-original-text.phtml:
// app/components/Nodus/app/Datatype/News/full-original-text.phtml Core::load('Component.YandexOriginalText.ItemContent'); class Component_YandexOriginalText_App_ItemContent extends Component_YandexOriginalText_ItemContent implements Core_ModuleInterface { const VERSION = '1.0.0'; public static function getcontent_selector_news($item, $lang) { ... $content = $item->render('full-original-text', 'auto'); ... } }
Если надо отключить отправку для большинства типов материалов
Если требуется отсылать только материалы определенного типа, например, только новости или анонсы статей. В этом случае проще не писать обработку для каждого типа материала, а сразу разрешить на отправку только нужные. Для этого в классе Component_YandexOriginalText_App_ItemContent перегрузим метод для материалов:
// app/components/Nodus/app/Datatype/News/full-original-text.phtml Core::load('Component.YandexOriginalText.ItemContent'); class Component_YandexOriginalText_App_ItemContent extends Component_YandexOriginalText_ItemContent implements Core_ModuleInterface { const VERSION = '1.0.0'; // материалы нодуса public static function getitem_selector($item_table, $item_id) { $need_datatypes = array('news', 'articles'); if (!in_array($item_table, $need_datatypes) { return null; } if (!Component_Nodus::selector($item_table)->has_page()) { return null; } $item = Component_Nodus::selector($item_table)->mapper_for_select()->find($item_id); // проверить активность элемента if (!$item->published) { $item = null; } return $item; }
Аналогично если надо исключать все словари, то следует перегрузить функцию getitem_taxonomy.
// app/components/Nodus/app/Datatype/News/full-original-text.phtml Core::load('Component.YandexOriginalText.ItemContent'); class Component_YandexOriginalText_App_ItemContent extends Component_YandexOriginalText_ItemContent implements Core_ModuleInterface { const VERSION = '1.0.0'; // исключать все словари public static function getitem_taxonomy($item_table, $item_id) { return null; } }
Работа с объектами других типов
Можно наладить отсылку текстов в «Яндекс. Оригинальные тексты» для объектов, не являющихся сущностями нодус-объекта. Cначала необходимо получить массив данных из нужной таблицы, а уже затем получить контент для формирования уникального текста.
Например, есть таблица news, и для нее организован компонент, который отображает новости (списком, по одной и т.д.) Требуется наладить отправку текстов в Яндекс. Для этого необходимо, при изменении сущностей, помещать данные о них в список на отправку.
На картинке:
- ID элемента (tem_id) - идентификатор новости из таблицы news.
- Тип элемента (item_type) - задается в таблице произвольно.
- Таблица (item_table) - news
- На отправку (чекбокс) - галка установлена (to_send = 1)
Далее необходимо написать метод, который будет возвращать нужный объект по данным из списка заданий.
Используя полученные аргументы, каким-либо образом получаем объект. Затем, если объект найден, проверяем активен ли он (это важно, т.к. для отключенных данных нет страницы, а значит не надо отправлять и оригинальный текст). Далее описываем метод формирования оригинального текста полученного объекта.
// app/components/YandexOriginalText/app/ItemContent.php Core::load('Component.YandexOriginalText.ItemContent'); class Component_YandexOriginalText_App_ItemContent extends Component_YandexOriginalText_ItemContent implements Core_ModuleInterface { const VERSION = '1.0.0'; public static function getitem_table_news($item_table, $item_id) { $item = CMS::orm()->{$item_table}->find($item_id); if ($item) if (!$item->isactive) $item = null; return $item; } public static function getcontent_table_news($item_table, $item, $lang) { $content = trim(sprintf('%s', $item->title)); $content = self::setTitle($content); if ($item->content) { $content .= trim(sprintf('%s', $item->field('content'))); return $content; } }