Итак, вводные данные.
У нас имеется каталог, в котором размещены несколько тысяч товаров. В целях SEO-оптимизации на страницах товаров должен быть размещен текст, содержащий наименование товара в различных падежах. Задача состоит в том, чтобы автоматизировать склонение наименований. Далее я буду рассматривать решение задачи на примере Битрикс, но оно достаточно универсально и может быть использовано в любой CMS с минимальной адаптацией.
Механизмов склонения слов может быть масса. Отмечу, что лучше всего использовать онлайн-сервисы и не городить «собственных решений», так как результаты работы последних могут иметь целый ряд ошибок. Я буду использовать «Морфер», а конкретно — его веб-сервис. Для начала нам понадобиться небольшая функция, которая сильно упростит наши дальнейшие действия. Выглядит она следующим образом:
function get_request($url, $params = NULL) { $ch = curl_init(); if ($params !== NULL && !empty($params)){ $url .= '?'; foreach($params as $key => $value) { $url .= $key . '=' . curl_escape($ch, $value) . '&'; } $url = rtrim($url, '&'); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json')); $result = curl_exec($ch); if ($result === false) { $result = curl_error($ch); } $json = json_decode($result); curl_close($ch); return $json; }
Обращение к сервису и получение результатов:
$base_url = 'https://ws3.morpher.ru'; $russian_declension = get_request("{$base_url}/russian/declension", ['s' => 'Пицца с сыром']); $array = (array)$russian_declension; $seoname = htmlspecialchars_decode($array['В']);
Массив в переменной $array
в данном случае будет следующим:
Array ( [Р] => Пиццы с сыром [Д] => Пицце с сыром [В] => Пиццу с сыром [Т] => Пиццей с сыром [П] => Пицце с сыром [множественное] => stdClass Object ( [И] => Пиццы с сыром [Р] => Пицц с сыром [Д] => Пиццам с сыром [В] => Пиццы с сыром [Т] => Пиццами с сыром [П] => Пиццах с сыром ) )
В данном примере меня интересовал винительный падеж, что можно заметить по переменной $seoname, с которой я и буду работать далее. Обратите внимание, что запрос возвращает нам склонения не только единственного, но и множественного числа, правда в виде stdClass Object
. Получить его значения можно так: $seoname_many = $array['множественное']->Р;
Итак, интересующие нас значения получены. Остается записать их. Дальнейший код относится сугубо к Битрикс. Добавим в инфоблок каталога новое свойство.
Заполним его следующим образом:
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array($PROPERTY_CODE => $PROPERTY_VALUE));
$ELEMENT_ID
— уникальный идентификатор товара.
$PROPERTY_CODE
— код заполняемого свойства (в моем случае — это SEO_NAME).
$PROPERTY_VALUE
— переменная, в которой содержится значение, которое нужно записать (в моем случае — это $seo_name
).
И на этом можно было и закончить, но нет. Дело в том, что сервис накладывает значительные ограничения. Заявлено, что суточный лимит на запросы с одного IP-адреса не может превышать 100 обращений. При этом стоит отметить, что на самом деле он больше, по крайней мере я замечал, что счетчик то останавливается, то вовсе сбрасывается.
Получить получить остаток на день можно следующим образом:
$requests_left = get_request("{$base_url}/get_queries_left_for_today"); echo "Остаток запросов на день: {$requests_left}";
Что касается ограничений как таковых. В ряде случаев у вас может возникать ошибка «Превышен лимит на количество запросов», хотя бесплатный лимит вы по идее исчерпать еще не должны были . Дело в том, что пользователи с одним внешним IP выглядят для веб-сервиса как один пользователь и лимит получается на всех один. Чтобы этого избежать, достаточно получить ключ доступа (токен) в личном кабинете и добавить его к запросу. Все подробности здесь.
Функцию-обертку лучше добавить в соответствующие файлы вашей CMS, а вот само обращение к сервису и запись результатов — разместить в шаблоне страницы товара, при этом добавив проверку заполнено ли это свойство или нет. Логика в том, что открывая страницу товара для которой еще не было заполнено SEO-наименование, посетитель сайта инициирует выполнение нашего кода и SEO-наименование заполняется. Если посетитель сайта открывает страницу, где данное свойство уже заполнено — код игнорируется.
Мониторинг процесса наполнения (сколько заполнено и сколько осталось заполнить) можно организовать либо штатными средствами вашей CMS, если она это позволяет. Либо сделать небольшой отчет, который будет проверять заполняемость необходимых полей.
Альтернативный веб-сервис
В качестве альтернативы можно попробовать Morphos. Сразу оговорюсь, что длительное время я его не тестировал, но пару десятков запросов через него прогнал и результатами доволен. Особенно, учитывая тот факт, что сервис совершенно бесплатный и не имеет никаких ограничений.
Основные возможности Morphos:
Через API функционал несколько скромнее и позволяет склонять только имена и географические названия. При этом стоит сказать, что данный сервис не универсален, то есть склонение фразы «Пицца с сыром» не будет работать в нем корректно.
Пример запроса к Morphos:
$name = "Иванов Иван"; $json = file_get_contents("http://morphos.io/api/inflect-name?name=".$name."&_format=json"); $out = json_decode($json); //соберем элементы массива в строку $names = implode(", ", $out->cases);
Массив $json
выглядит следующим образом:
{ "name": "Иванов иван", "cases": [ "Иванов Иван", "Иванова Ивана", "Иванову Ивану", "Иванова Ивана", "Ивановым Иваном", "Иванове Иване" ], "gender": "m" }
Привет, Денис! Лайк за статейку. Скажи а через прокси нельзя обойти ограничения по лимитам? И можешь ли помочь доделать один замечательный сайтик?
Привет.
Лимиты через прокси обойти можно. Вопрос в том, а нужно ли это делать? Если кол-во запросов небольшое — можно обойтись бесплатной версией, просто понадобиться чуть больше времени.
С проектом могу помочь, в разделе контакты есть ссылка на мой телеграм и ориентировочный ценник за работы. Пиши, все сделаем.
Денис, спасибо за статью про наш веб-сервис «Морфер».
Проблема с превышением лимита может быть вызвана тем, что сервис считает всех пользователей с одним внешним IP за одного пользователя с одним лимитом. Чтобы этого избежать, достаточно получить ключ доступа (токен) в личном кабинете и добавить его к запросу. Подробнее о том, как это сделать: morpher.ru/ws3/limit/
А если у вас действительно много товаров, лимит легко увеличить. Текущие расценки:
* 450 руб — 1000 запросов
* 750 руб — 10 000 запросов
* 950 руб — безлимит на 1 месяц
С уважением
Сергей Слепов, автор веб-сервиса «Морфер»
Здравствуйте, Сергей! Спасибо Вам за классный веб-сервис. Я учел Ваши уточнения и дополнил ими текст статьи.