Привет всем постоянным и новым читателям блога SEOBID.NET! Предлагаю сегодня к рассмотрению одну интересную идейку, а в чем она состоит, в двух словах не расскажешь. Поэтому начну сначала. Вы уже должны знать о таком сервисе Яндекса, как «Оригинальные тексты». Кто не знает – объясняю, как это работает. Вы написали уникальную, полезную, читабельную и интересную статью и, естественно, дорожите ею, не хотите, чтобы кто-то скопировал ее сразу после публикации на свой ГС.

Как работает защита текстов

О вопросах защиты от копирования мы поговорим позже, а сейчас речь о том, что Яндекс предлагает такую схему защиты: вы публикуете свою статью в «Оригинальных текстах», и Яндекс (предположительно) определяет вашу версию текста как оригинал, присваивая вам авторство. То есть, другие копии этой статьи будут считаться плагиатом и (тоже предположительно) в поиске учитываться не будут.

Оригинальные тексты

Все это очень спорно, да и сами яндексоиды очень туманно объясняют принцип действия этого механизма защиты, но лучше уж так, чем никак. Я, например, пользуюсь этим сервисом уже месяцев 4-5, и заметил одну хорошую тенденцию – все тексты, которые я сначала публикую в «Оригинальных текстах», появляются в выдаче или сразу (через 1-5 часов), или на следующий день.

Кстати, один нюанс – текст нужно добавлять на Яндекс или раньше, или во время публикации статьи, но никак не позже – враг не дремлет, и ваш уникальный текст уже через несколько минут может быть скопирован и опубликован.

А, учитывая разную скорость индексации разных сайтов, ваш контент может оказаться уже копией, а не оригиналом. Вот так. Один сайтик я оставил без внимания этого сервиса, и новые страницы с него ну ох как плохо входят в индекс. Даже не заползают – я их туда молотком вбиваю, и не всегда успешно. Не думаю, что это простое совпадение, поэтому и предлагаю подробнее изучить эту тему. А тема диспута такая – не проще ли не вбивать все новые тексты вручную, а провести автоматизацию этого процесса?

Ведь если у вас несколько (или несколько десятков) сайтов, то кроме ручной публикации, если это не парсер, вам еще нужно и отмечаться в «Оригинальных текстах». Получается двойная работа, и при определенном количестве сайтов вы просто не будете вставать из-за компьютера. Так вот, есть плагин, который любезно предоставляет нам тот же Яндекс, который на автомате «запуливает» ваши новые статьи в этот сервис. Попробовав его, я сразу поставил его на все свои сайты, но не всем остался доволен.

Оригинальные тексты в ВМ

Воровство контента успешно процветает, и я думаю, будет процветать и дальше. Но, как говорится, сила солому ломит, и мы все своими силами пытаемся бороться с этим, а копипастеры выдумывают все новые методы «тырения» чужих уникальных текстов. Плагин Webmaster Yandex довольно хорошо решает поставленные задачи, но не без огрехов. Без плагина вам придется добавлять тексты в панели вебмастера в Яндексе руками. Ка это происходит: идете в свою панель ВМ, выбираете нужный сайт, переходите в «Оригинальные тексты». Дальше – «Добавить новый текст» и после добавления – кнопка «Далее». Теперь – о самом главном.

Как работает плагин

Авторство замечательного плагина Webmaster Yandex принадлежит Sbseosoft. В чем суть работы – плагин добавляет ваши новые статьи в «Оригинальные тексты» прямо из админки. Удобно? Конечно. Вот скриншот с официальной страницы плагина:

Как работает плагин

Там же вы можете скачать плагин, или зайти на GitHub, где вы можете посмотреть, как он разрабатывался, что у него внутри, какие изменения производились, и узнать, какие изменения предполагается внести. Установка плагина подробно описана здесь.

После установки и активации идете сюда и нажимаете «Регистрация клиентских приложений».

Регистрация нового приложения

Здесь, на этой странице, вы увидите несколько обязательных к заполнению полей. Рассмотрим, что куда писать:

  1. Название – любое название, просто чтобы вы ориентировались, если у вас много сайтов.
  2. Описание – лучше похожее на description.
  3. Права – нажмите на надпись «Яндекс.Вебмастер». После этого ниже откроются две радиокнопки – «Добавлять сайты в сервис Яндекс.Вебмастер и получать информацию о статусе индексирования» и «Получать информацию о внешних ссылках на сайт». Если хотите включить вторую функцию, то для этого вам понадобится подтвердить свои права и пройти идентификацию, чтобы потом, после модерации приложения, получить токен. Его нужно будет, как ID и пароль, ввести в поле настроек плагина.
  4. Ссылка на иконку – укажите путь до иконки, которая будет отображаться в «Оригинальных текстах» для вашего сайта.
  5. Ссылка на приложение – адрес сайта.
  6. Callback URI – если вы укажете, что вам нужен клиент для разработки приложения (указано ниже на странице плагина), то в поле появится ссылка вида: https://oauth.yandex.ru/verification_code. Дальше нажмите «Создать».

Вас перебросит на новую страницу, на которой будет указан ваш ID и пароль. Тут же вы можете отредактировать свои данные, и не забудьте сохранить их.

Пароль приложения

Если вы хотите получать данные о внешних ссылках на свой сайт в этом приложении, то вам придется получить токен. Я этого не делал – вся информация есть в панели ВМ. Если токен нужен, придется подождать, когда приложение пройдет модерацию. Код подтверждения и токен для отладки приложения можно также получить вручную, через веб-интерфейс сервиса oauth.yandex.ru.

Но модерации все равно придется подождать. Затем введите код токена в поле настроек плагина, и сразу получите подтверждение авторизации на Яндексе.

Токен

Пишу дальше – как настроить плагин. Переходите в админпанель сайта, в настройки плагина, и там введите свой код токена (писал выше), идентификатор и пароль, который вы получили при создании приложения:

Настройки плагина

Все! Чтобы проверить, как работает плагин, зайдите на страницу создания новой записи в админке Вордпресс. Предварительно, конечно, вам нужен какой-нибудь текст, пусть даже и не уникальный – вы его сразу же можете удалить из того же вебмастера. Введите текст в поле ввода WordPress и попробуйте его отправить в Яндекс.

Новая запись

Проверьте теперь наличие текста в панели ВМ Яндекса. Чтобы было понятнее, посмотрите видеоролик:

А теперь о том, что мне понравилось, а что — не понравилось в плагине. Безопасность модуля обеспечена хорошо — вредоносного кода не обнаружено, да и сам Яндекс разу говорит, что личная и конфиденциальная информация никуда передается и не отправляется.

Не понравилось — плагин после одобрения модератором добавляет мета-блок на страницу редактирования постов, а я хотел, чтобы плагин работал и с произвольными типами записей. Решил исправить немного – думаю, автор не обидится, ведь исходный код плагина открыт для редактирования. Недоработки (как я считаю) которые я перечислю ниже, я публикую здесь, в этой статье.

  • Чтобы плагин мог работать с произвольными типами записей, нужно было изменить его вставку на страницы: код добавления кнопки не в новый мета-блок, а в тот, который есть в шаблоне, в мета-блок «Опубликовать», немного выше самой этой кнопки. Сделал это, потому что для одной кнопки создавать отдельный блок – слишком жирно. Да и по странице не нужно скроллить, чтобы добраться до кнопки – она теперь всегда на виду. Поэтому поменял: функцию adminOptions() — на такой фрагмент post_submitbox_misc_actions:
public function adminOptions() {
add_options_page(__('Webmaster Yandex settings', 'wm_ya'), 'Webmaster Yandex',
'manage_options', 'webmaster_yandex_options_page',
array($this, 'showSettingsPage'));
// on next release
//        add_dashboard_page('Webmaster Yandex', 'Webmaster Yandex', 'manage_options',
//                           'webmaster_yandex_dashboard', array($this, 'showAdminDashboard'));
// add_meta_box('wm_ya_metabox_add_text', __('Send text to Yandex', 'wm_ya'),
// array($this, 'metaboxSendTextsToYandexCallback'), 'post', 'advanced',
// 'high');
add_action( 'post_submitbox_misc_actions', array($this, 'metaboxSendTextsToYandexCallback') ); // добавил
}

Дальше пришлось также изменить код вывода контента кнопки: это функция metaboxSendTextsToYandexCallback():

public function metaboxSendTextsToYandexCallback() {
$str = '<div class="misc-pub-section">';
if ($this->_websiteIdNotSet) {
print "<p>" . __('Set website Id in plugin settings page', 'wm_ya') . "</p>";
return;
}
wp_register_script('webmaster_yandex_script', plugins_url('/../main.js', __FILE__), array('jquery'));
wp_enqueue_script('webmaster_yandex_script');
wp_enqueue_script('jquery');
$postId = get_the_ID();
$postDataDb = $this->getTextInfoFromDb($postId);
if (!count($postDataDb)) {
$str .= "<p id='wmYaTextSendDate'>" . __("You haven't sent this text to Yandex yet", 'wm_ya') . "</p>";
$str .= "<div id='wmYaSendButton'>";
} else {
$obj = $postDataDb[0];
$textSentDatetime = date('Y-m-d H:i:s', $obj->timestamp_added);
$str .= "<p id='wmYaTextSendDate'><span onclick=\"jQuery('#wmYaSendButton').toggle();\" style='cursor:pointer; border-bottom:1px dashed #aaa;'>" . __('Text was sent at ', 'wm_ya') . "{$textSentDatetime}</span></p>";
$str .= "<div id='wmYaSendButton' style='display:none;'>";
}
$str .= "<a class='button button-primary' onclick='jQuery(Main.wmAddText);'>" . __('Send', 'wm_ya') . "</a>";
$str .= "<div id='wmYaResultsTextSend'></div>";
$str .= "<input type='hidden' id='wmYaCurrentPostId' value='{$postId}' />";
$str .= "</div><!-- wmYaSendButton -->";
$str .= '</div><!-- misc-pub-section -->';
print $str;
}

Результат – перед вами:

Перенос кнопки

  • При удалении плагина плагин он должен удалять и все следы свой работы – таблицы БД, записи, и т.д. Но нет удаления его функции — удаляются только таблицы из БД. Но главная проблема в том, что плагин оставляет все записи, то есть, код не доработан в каком-то месте. Где именно – я нашел, это неправильное использование register_uninstall_hook(). Команда программистов WordPress для таких случаев предусмотрела использование файла unistall.php, который полностью удаляет плагин. Я применил этот файл вот такими образом: нужно удалить из файла плагина webmaster-yandex.php следующие строки:
 register_uninstall_hook(__FILE__, 'wm_ya_db_uninstall'); 

и

function wm_ya_db_uninstall() {
global $wpdb;
$sql = 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'wm_ya_texts';
$wpdb->query($sql);
$sql = 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'wm_ya_stat_texts';
$wpdb->query($sql);

Затем в папку с плагином нужно добавить файл uninstall.php, внутри которого нужно прописать этот код:

<?php
if( ! defined('WP_UNINSTALL_PLUGIN') )
exit;
// проверка пройдена успешно. Начиная от сюда удаляем опции и все остальное.
global $wpdb;
$sql = 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'wm_ya_texts';
$wpdb->query($sql);
$sql = 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'wm_ya_stat_texts';
$wpdb->query($sql);
delete_option("ya_wm_db_verstion");
delete_option("webmaster_yandex_app_id");
delete_option("webmaster_yandex_app_password");
delete_option("webmaster_yandex_token");
delete_option("webmaster_yandex_token_expire");
delete_option("webmaster_yandex_website_id");
delete_option("webmaster_yandex_options_app");

Скрипт, который находится в файле main.js, получает AJAX информацию как JSON. Поэтому при ошибке, которая может появиться при отправке нового текста, мы получаем сообщение «text added». Еще одна доработка — строка

 jQuery('#wmYaResultsTextSend').clear().append(contents) 

не работала, поэтому пришлось изменить ее на такую:

 jQuery('#wmYaResultsTextSend').html(contents) 

все встало на свои места, вот так:

wmAddText : function () {
var data = { postId : jQuery('#wmYaCurrentPostId').val(), action : 'wm_ya_add_text'};
jQuery('#wmYaResultsTextSend').html('<p>Отправка данных...</p>');
jQuery.getJSON(ajaxurl, data, function(response) {
if (response.error === 1) {
var contents = '<p style="color: red">Error: ' + response.errorText + '</p>';
jQuery('#wmYaResultsTextSend').html(contents);
} else {
var contents = '<p style="color: green">Text added</p>';
jQuery('#wmYaResultsTextSend').html(contents);
var currentdate = new Date();
var datetime = currentdate.getFullYear() + "-"
+ (currentdate.getMonth() + 1)  + "-"
+ currentdate.getDate() + " "
+ currentdate.getHours() + ":"
+ currentdate.getMinutes();
contents = 'Text added on ' + datetime;
jQuery('#wmYaTextSendDate').text(contents);
}
});
return false;
}
  • Еще одна ошибка – если в новой статье присутствовали HTML теги, плагин показывал ошибку «incorrect xml». Чтобы ее обнаружить, я закомментировал строку ajaxAddTextToYandex():
$responseObj->error = 1;
// $responseObj->errorText = __('Unable to fetch data for post Id provided', 'wm_ya');
print json_encode($responseObj);
die;

А также добавил коды strip_tags() и htmlspecialchars() к новому тексту, который будет отправляться при помощи этого плагина, в функции sendTextToYandex():

public function sendTextToYandex($text) {
$url = "/api/v2/hosts/" . $this->getWebsiteId() . "/original-texts/";
// добавил
$text = strip_tags($text);
$text = htmlspecialchars($text);
$text = urlencode($text);
$text = "<original-text><content>{$text}</content></original-text>";
$additionalHeaders = array('Content-Length: ' . strlen($text));
$curlOptions = array(CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_POSTFIELDS => $text);
$response = $this->performYandexWebmasterApiRequest($url, 'POST', $curlOptions, $additionalHeaders);
$result = array();
$dom = new DOMDocument();
if ( $dom->loadXML($response['result']) ) {
$yandexError = $dom->getElementsByTagName('message')->item(0) ? $dom->getElementsByTagName('message')->item(0)->nodeValue : 'unknown';
$yandexId = $dom->getElementsByTagName('id')->item(0) ? $dom->getElementsByTagName('id')->item(0)->nodeValue : 'unknown';
$yandexLink = $dom->getElementsByTagName('link')->item(0) ? $dom->getElementsByTagName('link')->item(0)->getAttribute('href') : 'unknown';
}
$result = array('error' => true, 'yandexError' => $yandexError, 'yandexId' => $yandexId, 'yandexLink' => $yandexLink);
if ($response['info']['http_code'] == 201) {
$result['error'] = false;
}
return $result;
}

И еще пришлось изменить логику в функции проверки if ($response[‘info’][‘http_code’] == 201).

  • Плагин автоматически подключается к лицевой части сайта, что мне, например, совершенно не нужно. Поэтому код в файле webmaster-yandex.php пришлось тоже подправить:
require_once('Autoloader.php');spl_autoload_register(array('Autoloader', 'loadClass'));$wm = new WebmasterYandex();

На такой:

add_action( 'init', 'initWebmasterYandex' );
function initWebmasterYandex(){
// выходим если не админка
if( ! defined('WP_ADMIN') )
return;
// подключаем все php файлы из папки includes
$includesFiles = glob( plugin_dir_path( __FILE__ )."includes/*.php" );
foreach ( $includesFiles as $file )
include_once $file;
new WebmasterYandex();
}

То есть, плюс ко всему пришлось удалить файл Autoloader.php и заменить на строчки, прописанные выше. После всех проделанных изменений плагин соответствует всем моим требованиям. А вот и сам подправленный плагин Webmaster Yandex. Успехов вам!

Кстати, все эти изменения совсем не обязательны к выполнению – это просто моя личная инициатива. Возможно, на вашем хостинге плагин будет работать корректно. До встречи в следующих публикациях!