Yandex_Original_Text: Яндекс.Оригинальные тексты

Сервис «Яндекс. Оригинальные тексты» позволяет 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;
		}
}
Метки: seo
28.10.2014
Все статьи