Webmaster Yandex
Наткнулся недавно на плагин, весьма интересный для, наверное, всех блогов в рунете! Я бы даже отнес его к категории «обязательные», если не считать тот факт, что Яндекс рано или поздно изменит порядок публикации "оригинальных текстов" и автор плагина прекратит его поддержку, в результате чего он перестанет работать. Или Яндекс найдет другой способ подтверждения авторства текстов. Ну, а пока - рекомендую всем, кто дорожит контентом на своих сайтах!
Плагин нуждается в доработке (нужно переписать код под новую версию API и местами поправить баги). По предложению пользователя Egor собираю средства на доработку. Кому нужен плагин, отправьте сколько сможете ($3-10) на кошелек WM Z886474893658. Как только наберется $100 начну доработку плагина.
Осталось собрать $100.
Обязательно в примечании к переводу пишите: "На доработку плагина Webmaster Yandex".
В этом случае, выложу форк плагина в репозиторий с измененным названием.
Яндекс и оригинальные тексты
Вопрос плагиата (воровства контента), а особенно хорошего, волнует всех авторов. Сравнительно недавно Яндекс представил решение этой проблемы, пусть и не изящное, и не стопроцентное, но - решение, называется оно - Оригинальные тексты. Изначально, к использованию сервиса, допускались сайты с ТИц 10+, но сегодня такого ограничения уже нет и сервис можно использовать и для сайтов с нулевым ТИц.
Как это работает
-
Добавляете свой сайт в панель вебмастера в Яндексе;
- Заходите в
Профиль сайта > Содержимое сайта > Оригинальные тексты
и добавляете текст статьи, которую вы собираетесь опубликовать. Добавлять текст нужно до или во время публикации статьи, но не после.
Так, Яндекс будет знать, что появившейся на вашем сайте текст, принадлежит вашему сайту и в случае плагиата этот момент, скорее всего, будет учитываться.
Проблема
Такая возможность проверки - это конечно хорошо, пусть и неоднозначно. Но проблема в том, что постоянно помнить об этом и заходить в Яндекс панель вебмастера каждый раз при публикации статьи - дело весьма утомительное. Тут, сразу на ум приходит: нужен плагин, который будет по нажатию на кнопку публиковать текст новой статьи в сервис. Как раз о таком плагине эта статья. Спасибо автору плагина: Sbseosoft!
Webmaster Yandex - плагин для WordPress
Позволяет добавлять оригинальные тексты в сервис Яндекса "Весмастер" из админ-панели WordPress. Информация с официальной страницы плагина:
Рекомендуется сначала добавлять тексты в Яндекс, только затем публиковать их на сайте. Исходный код плагина открыт, любой может проверить, что никакие данные не передаются никуда кроме Яндекса. Ваш пароль от Яндекса, Id и пароль приложения так-же не передаются ни на какие сторонние сайты/сервисы. Плагин не знает и не хранит ваш пароль от Яндекса. Запланировано дальнейшее развитие плагина и добавление других возможностей, предоставляемых API Яндекс вебмастер.
Скачать плагин:
Установка
-
Установите плагин WordPress.
-
Зайдите в сервис Яндекса: https://oauth.yandex.ru/ и нажмите на ссылку "Регистрация клиентских приложений" (в блоке справа).
-
В графе "название", пишите любое название создаваемого приложения, пусть будет "Уникальные тексты для сайта example.com".
-
В графе "Права", ставите галочку: Яндекс.Вебмастер - Добавлять сайты в сервис Яндекс.Вебмастер и получать информацию о статусе индексирования.
-
В графе "Callback URI", пишите:
https://oauth.yandex.ru/verification_code
. -
Жмем "создать". Приложение создано, нам нужны поля: "Id приложения" и "Пароль приложения".
-
Заходим на страницу настроек плагина и в соответствующие поля вставляем: "Id приложения" и "Пароль приложения". Сохраняем.
-
Теперь, на странице настроек должна появится ссылка "Получить токен". Жмем её, подтверждаем доступ во всплывшем окне, копируем появившиеся цифры (Код подтверждения) и вставляем их в поле "Код токена" в настройках. Сохраняемся.
- Теперь на странице настроек должен появится новый пункт: "Выберите сайт". Выбираете сайт, для которого будем отправлять оригинальные тексты. Сохраняемся.
Все! Для проверки работы плагина, зайдите в панель вебмастера в Яндексе в раздел оригинальные тексты. Создайте пост в 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 для удаления плагина, всегда когда есть такая возможность.
Так и сделал:
#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");
Три - ошибка в скрипте js
В файле 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.
Протестировал - вроде теперь все устраивает.