Cоздание плагина wordpress – часть 4
Дорогие друзья, вот и заканчивается наш урок по созданию плагина для wordpress.
Сегодня мы с вами рассмотрим серверный скрипт — Yandex XML, который будет обрабатывать наши запросы к поисковику, и выдавать позиции сайта по ключевой фразе.
Ну что же, приступим.
Создадим пустой php файл в директории плагина, и назовем его search. Я взял готовый скрипт, который предоставляет Яндекс. Но пришлось переписать основу скрипту, под нашу поисковую форму.
Привожу вам скрипт который предоставил Яндекс:
// Для запуска требуется PHP 5 header ("Content-Type: text/html;charset=utf-8"); // верхняя части страницы include "template_header.html"; # обработка полей формы $host = array_key_exists('host', $_REQUEST) ? $_REQUEST['host'] : ''; $query = array_key_exists('query', $_REQUEST) ? $_REQUEST['query'] : ''; $query_esc = htmlspecialchars($query); $host_esc = htmlspecialchars($host); $host = preg_replace("[^http://|www\.]", '', $host); // спрашивать яндекс только после сабмита формы $exit = $_SERVER["REQUEST_METHOD"] != 'POST'; $page = 0; $found = 0; $pages = 20; $error = false; print "<table width='100%'><tr><td width='16%'/><td>"; // мы должны получить место сервера в выдаче по некому запросу. // делаем запрос по десять ссылок на страницу и запрашиваем 20 // страниц. при нахождении сервера останавливаемся и выдаем его // место в выдаче while (!$exit && $page < $pages && $host) { // XML запрос $doc = <<<DOC <?xml version='1.0' encoding='utf-8'?> <request> <query>$query_esc</query> <page>$page</page> <maxpassages>0</maxpassages> <groupings> <groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/> </groupings> </request> DOC; $context = stream_context_create(array( 'http' => array( 'method'=>"POST", 'header'=>"Content-type: application/xml\r\n" . "Content-length: " . strlen($doc), 'content'=>$doc ) )); $response = file_get_contents('http://xmlsearch.yandex.ru/xmlsearch', true, $context); if ( $response ) { // print $response->getBody(); $xmldoc = new SimpleXMLElement($response); $xmlresponce = $xmldoc->response; if ($xmlresponce->error) { print "Возникла следующая ошибка: " . $xmlresponce->error . "<br/>\n"; $exit = 1; $error = true; break; } $pos = 1; $nodes = $xmldoc->xpath('/yandexsearch/response/results/grouping/group/doc/url'); foreach ($nodes as $node) { // если URL начинается с имени хоста, выходим из цикла if ( preg_match("/^http:\/\/(www\.)?$host/i", $node) ) { $found = $pos + $page * 10; $exit = 1; break; } $pos++; } $page++; } else { print "внутренняя ошибка сервера\n"; $exit = 1; } } if (!$error) { // если что-то найдено, то выводим результат if ($found) { print "<p>сайт «$host» находится на месте № $found по запросу «$query»</p>"; print "<p>Попробуйте узнать позицию другого сайта!</p><br/>\n"; } elseif ($host) { print "<p>сайт «$host» находится далее, чем на ". $pages*10 ." месте в выдаче «Яндекса»"; print" по запросу «$query»</p><p>Попробуйте узнать позицию другого сайта!</p><br/>\n"; } else { print "<p>Узнайте позицию сайта в выдаче «Яндекса» по запросу!</p>"; } } ?> </td></tr></table> <form method='POST' accept-charset='utf-8'> <table width='100%'> <tr> <td width="16%"/> <td width="75%"> <table> <tr> <td><label for='query'>Запрос:</label></td> <td><input type='text' name='query' id='query' value='<?php print $query_esc ?>'/> Пример: волшебные травы</td> </tr> <tr> <td><label for='host'>Имя сервера:</label></td> <td><input type='text' name='host' id='query' value='<?php print $host_esc ?>'/> Пример: narcom.ru</td> </tr> <tr> <td/> <td><input type="submit" value="Искать!"/></td> </tr> </table> </td> <td width="9%"> </tr> </table> </form> <?php // дописываем html include "template_footer.html";
Переписав основную часть кода , наш скрипт превращается в:
header('Content-type: text/html; charset=windows-1251'); if(version_compare(phpversion(), '5.0.0', '<')){ exit('Ваша версия php ('.phpversion().'), не поддерживает данный плагин!'); } #-> обработка полей формы $_POST['p']=trim($_POST['p']); $_POST['h']=trim($_POST['h']); $_POST['s']=trim($_POST['s']); #-> more if(strlen($_POST['p'])===0){exit('Ошибка: Вы не ввели ключевую фразу!');} $query_esc = htmlspecialchars($_POST['p']); if(strlen($_POST['h'])===0){exit('Ошибка: Вы не ввели URL вашего сайта!');} if(!preg_match("/^(https?:\/\/([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6})$/i",$_POST['h'])){exit('Ошибка: Неверный формат URL, пользуйтесь подсказкой!');} if(!preg_match('|^[\d]*$|', $_POST['s'])){exit('Ошибка: Вы не выбрали поисковую систему!');} if($_POST['s']<1 or $_POST['s']>2){exit('Ошибка: Вы не выбрали поисковую систему!');} #-> Yandex search === if(strcmp($_POST['s'],1)===0){ $host = preg_replace("[^http://]", '', $_POST['h']); #-> options $page = 0; $found = 0; $pages = 30; $error = false; #-> go go go while($page < $pages && $host){ // XML запрос $doc = <<<DOC <?xml version='1.0' encoding='utf-8'?> <request> <query>$query_esc</query> <page>$page</page> <maxpassages>0</maxpassages> <groupings> <groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/> </groupings> </request> DOC; $context = stream_context_create(array('http' => array('method'=>"POST",'header'=>"Content-type: application/xml\r\n" ."Content-length: " . strlen($doc),'content'=>$doc))); $response = file_get_contents('http://xmlsearch.yandex.ru/xmlsearch', true, $context); if($response){ $xmldoc = new SimpleXMLElement($response); $xmlresponce = $xmldoc->response; if($xmlresponce->error) { print "Ошибка: ".iconv("UTF-8", "WINDOWS-1251", $xmlresponce->error)."<br/>\n"; $exit = 1; $error = true; break; } $pos = 1; $nodes = $xmldoc->xpath('/yandexsearch/response/results/grouping/group/doc/url'); foreach ($nodes as $node) { if(preg_match("/^http:\/\/(www\.)?$host/i", $node)){ $found = $pos + $page * 10; $exit = 1; break; } $pos++; } $page++; }else{ print "внутренняя ошибка сервера\n"; $exit = 1; } } if(!$error){ if($found){ print "<p>Ваш сайт находится на месте № ".$found." по запросу «".iconv("UTF-8", "WINDOWS-1251", $query_esc)."»</p>"; print "<p>Попробуйте узнать позицию другого сайта!</p><br/>\n"; }elseif($host){ print "<p>Ваш сайт находится далее, чем на ". $pages*10 ." месте"; print" по запросу «".iconv("UTF-8", "WINDOWS-1251", $query_esc)."»</p><p>Попробуйте узнать позицию по другой ключевой фразе!</p><br/>\n"; }else{ print "<p>Узнайте позицию сайта в выдаче «Яндекса» по запросу!</p>"; } } exit(); } if(strcmp($_POST['s'],2)===0){ exit('Гугл пока что не работает'); }
Как вы можете заметить, пришлось поменять кодировку на windows-1251, так как были косяки с отображаемыми данными. J Так же сделал проверку на вводимые данные. Переменная pages – отвечает за то, на скольких страницах выдачи искать нужный сайт, по умолчанию стоит 20, я поставил 30, так как это значение оказалось самое оптимальное. Я тестировал со значениями 40 -50, но иногда скрипт выдавал ошибку, о превышении лимита выполнения скрипта. Можно поставить больше, если только у вас на сервере время выполнения скрипта стоит выше, чем стандартное значение.
Теперь немного разберем параметры, которые передаются скрипту от AJAX скрипта. AJAX скрипт мы писали в прошлом уроке.
$_POST['p'] – переменная передает значение поля – ключевая фраза.
$_POST['h'] – переменная передает значение поля – URL вашего сайта.
$_POST['s'] – переменная передает значение поля – Поисковая система.
Лимит проверок в день не может превышать 1000 раз. Для этого надо добавить IP адрес вашего сайта здесь — http://xml.yandex.ru/ .
Вот и все, друзья.
На этом наш урок закончен, можете тестировать получившийся скрипт. Если у кого-то возникли трудности или вопросы, пишите в комментарии, всем помогу.
Вот готовый вариант плагина — Поиск позиции в Яндекс.