WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

Webmaster Yandex: анти-плагиат для Яндекса

Наткнулся недавно на плагин, весьма интересный для, наверное, всех блогов в рунете! Я бы даже отнес его к категории «обязательные», если не считать тот факт, что Яндекс рано или поздно изменит порядок публикации "оригинальных текстов" и автор плагина прекратит его поддержку, в результате чего он перестанет работать. Или Яндекс найдет другой способ подтверждения авторства текстов. Ну, а пока - рекомендую всем, кто дорожит контентом на своих сайтах!

Плагин нуждается в доработке (нужно переписать код под новую версию API и местами поправить баги). По предложению пользователя Egor собираю средства на доработку. Кому нужен плагин, отправьте сколько сможете ($3-10) на кошелек WM Z886474893658. Как только наберется $100 начну доработку плагина.

Осталось собрать $100.

Обязательно в примечании к переводу пишите: "На доработку плагина Webmaster Yandex".

В этом случае, выложу форк плагина в репозиторий с измененным названием.

Яндекс и оригинальные тексты

Оригинальные тексты в Yandex в панели вебмастера

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

Как это работает
  1. Добавляете свой сайт в панель вебмастера в Яндексе;

  2. Заходите в Профиль сайта > Содержимое сайта > Оригинальные тексты и добавляете текст статьи, которую вы собираетесь опубликовать. Добавлять текст нужно до или во время публикации статьи, но не после.

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

Проблема

Такая возможность проверки - это конечно хорошо, пусть и неоднозначно. Но проблема в том, что постоянно помнить об этом и заходить в Яндекс панель вебмастера каждый раз при публикации статьи - дело весьма утомительное. Тут, сразу на ум приходит: нужен плагин, который будет по нажатию на кнопку публиковать текст новой статьи в сервис. Как раз о таком плагине эта статья. Спасибо автору плагина: Sbseosoft!

Webmaster Yandex - плагин для WordPress

Позволяет добавлять оригинальные тексты в сервис Яндекса "Весмастер" из админ-панели WordPress. Информация с официальной страницы плагина:

Рекомендуется сначала добавлять тексты в Яндекс, только затем публиковать их на сайте. Исходный код плагина открыт, любой может проверить, что никакие данные не передаются никуда кроме Яндекса. Ваш пароль от Яндекса, Id и пароль приложения так-же не передаются ни на какие сторонние сайты/сервисы. Плагин не знает и не хранит ваш пароль от Яндекса. Запланировано дальнейшее развитие плагина и добавление других возможностей, предоставляемых API Яндекс вебмастер.

Скачать плагин:
Установка
  1. Установите плагин WordPress.

  2. Зайдите в сервис Яндекса: https://oauth.yandex.ru/ и нажмите на ссылку "Регистрация клиентских приложений" (в блоке справа).

  3. В графе "название", пишите любое название создаваемого приложения, пусть будет "Уникальные тексты для сайта site.ru".

  4. В графе "Права", ставите галочку: Яндекс.Вебмастер - Добавлять сайты в сервис Яндекс.Вебмастер и получать информацию о статусе индексирования.

  5. В графе "Callback URI", пишите: https://oauth.yandex.ru/verification_code.

  6. Жмем "создать". Приложение создано, нам нужны поля: "Id приложения" и "Пароль приложения".

  7. Заходим на страницу настроек плагина и в соответствующие поля вставляем: "Id приложения" и "Пароль приложения". Сохраняем.

  8. Теперь, на странице настроек должна появится ссылка "Получить токен". Жмем её, подтверждаем доступ во всплывшем окне, копируем появившиеся цифры (Код подтверждения) и вставляем их в поле "Код токена" в настройках. Сохраняемся.

  9. Теперь на странице настроек должен появится новый пункт: "Выберите сайт". Выбираете сайт, для которого будем отправлять оригинальные тексты. Сохраняемся.

Все! Для проверки работы плагина, зайдите в панель вебмастера в Яндексе в раздел оригинальные тексты. Создайте пост в 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;
	}

Вот что получилось в итоге:

webmasterYandex
Два

Автор предусмотрел, что когда плагин будет удаляться, чтобы он удалил свое прибывание на сайте. Но почему-то там не предусмотрено удаление его опции - удаляются только таблиц из базы данных. Но это еще пол беды. Основная беда в том, что плагин не удаляет ничего за собой, код не работает как надо. Неправильная логика использования функции register_uninstall_hook(). Разработчики WordPress предлагают использовать файл unistall.php для удаления плагина, всегда когда есть такая возможность.

Так и сделал:

#1. Удалил из файла 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);
}

#2. Добавил в папку плагина файл 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 данные (jQuery.post), а обрабатывает как 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 теги и может что-то еще, Yandex выдавал ошибку "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, заменил его тремя строчками выше. Как я понял, суть осталась одна - подключить все php файлы из папки includes.

Протестировал - вроде теперь все устраивает.

Webmaster Yandex (kama-change) v99.5
Скачано: 856, размер: 23.0 KB
70 комментов
Полезные 3 Вопросы 1 Все
  • Dimox

    С недавнего времени пользуюсь этим плагином. Спасибо за твои правки! Они мне нравятся.

    Ответить4.9 года назад #
    • Kama7079

      Пожалуйста!

      Ответить4.9 года назад #
    • petrozavodsky773 cайт: alkoweb.ru

      и как есть какая то разница в выдаче до и после использования? Или просто используется на всякий случай?

      Ответить4.9 года назад #
  • jkeks cайт: jkeks.ru

    Вы какой-то мега маньяк. Поправил плагин на ходу..
    Уважение и почет.

    Ответить4.9 года назад #
  • Михаил cайт: artstorm.su

    Спасибо за исправления плагина. смущали недоработки, поэтому и не использовал, а лезть в код, я не настолько квалифицирован.

    Ответить4.9 года назад #
    • Kama7079

      Пожалуйста!

      Ответить4.9 года назад #
      • Михаил cайт: artstorm.su

        Тимур, еще раз спасибо, можете еще одну правочку в плагин внести? Чтобы шорткоды вырезались )

        Ответить4.9 года назад #
        • Kama7079

          Мне было не очень удобно, когда правил оригинальный плагин и выложил эту статью... Обращайтесь пожалуйста к автору. Плюс, чем вам мешают шоткоды? Как я понимаю текст передаваемый в Яндекс, не должен на сто процентов соответствовать тексту статьи на сайте, потому что публикуется он единожды, а поправки в нем могут быть после публикации, таким обазом 100% совпадения быть не может в принципе. Отсюда, маленький шоткод ничего по сути не меняет...

          Можете сами подправить плагин: файл WebmasterYandex.php, строка 672:

          $text = urlencode($text);

          добавьте после нее

          $text = urlencode($text);
          $text = preg_replace( '~\[[^\]]+\]~', '', $text );
          Ответить4.9 года назад #
  • @ o3erka cайт: www.o3erka.com

    Привет! Поставила плагин, но когда нажимаю "Получить токен" никакого всплывающего окна не появляется. Думала, это может глюк браузера, но нет. В других браузерах та же хрень (((
    Что не так? Вроде все делаю как в видео (((

    Ответить4.9 года назад #
    • Kama7079

      Задайте вопрос разработчику, я момент общения плагина с Яндексом не понял в этом плагине. Там нужно в API Яндекса разбираться. А вообще, у меня все хорошо получает, видимо вы что-то не так делаете. Попробуйте все сделать пошагово, по текстовой инструкции установки плагина в этой статье.

      Ответить4.9 года назад #
    • Михаил cайт: artstorm.su

      Вы проверьте, возможно у Вас просто стоит блокировка всплывающих окон. Сделайте исключение блокировки на сайт.

      Ответить4.9 года назад #
  • Shtirlitz cайт: blogbankir.ru

    Спасибо за вашу доработку, поставил себе!

    Ответить4.8 года назад #
  • Александр cайт: biz-terri.ru

    Тоже поставил себе плагин. Огромное спасибо что доработали. С установкой проблем не возникло как и с поучением токена. Все работает.

    Ответить4.8 года назад #
  • Дмитрий15 cайт: pribylvseti.ru

    Как обычно респектую данному блогу (считаю его уникальным) и его автору (благодарным делом занимается). Снимаю шляпу в очередной раз, установил допиленную версию, так как на двух своих блогах использую произвольные поля, протестировал, все нормально работает. Успехов тебе Kama.
    С уважением, Дмитрий

    Ответить4.8 года назад #
  • Seosko cайт: seosko.ru

    Хоть Яндекс и разрешил использовать сервис с нулевым ТИЦ, но к сожалению сам яндекс признает оригинальные сайты лишь от +10 тиц и более.

    Ответить4.7 года назад #
    • @ Eliom cайт: eliom.ru

      но к сожалению сам яндекс признает оригинальные сайты лишь от +10 тиц и более

      На чем основано это утверждение?

      Ответить4.7 года назад #
  • Александр

    Добрый день.
    Уважаемый Kama, сам плагин хорош, давно искал похожее решение для wordpress, за доработки вам огромное спасибо. А нельзя ли отправку текста сделать по кнопке "Опубликовать"? Есть ли вообще смысл в дополнительной кнопке "Отправить", если можно будет сделать отправку и публикацию по одной кнопке? Просто иногда при публикации можно случайно забыть нажать на кнопку отправки (у меня тексты публикует отдельный человек). Если есть возможность, напишите, пожалуйста, решение.

    Ответить4.5 года назад #
    • Kama7079

      Плагин уже обновился и вроде даже не раз. Просите автора, предлагайте ему. Автор внес ряд поправок из этой статьи. Я больше этот плагин трогать не буду. sorry

      1
      Ответить4.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться