Создаем плагин разметки изображений schema.org для Joomla

В данной статье показано создание плагина для разметки изображений http://schema.org/ImageObject. Разметка schema.org помогает поисковым системам получать информацию о вашем материале, поддерживается основными поисковиками google и yandex.

Плагин будет добавлять разметку непосредственно в материал, после того как пользователь нажмет кнопку сохранить, плагин создаст разметку для всех картинок, и только после этого материал сохранится в базе данных.

Для создания разметки нам понадобиться узнать:

  • name – (Text) название картинки;
  • description – (Text) описание изображения;
  • height – (Distance) высота изображения;
  • width – (Distance) ширина изображения.

О том как создать и установить плагин в Joomla написано в статье создаем плагин в Joomla для JCE редактора. В нашем случае полный список файлов будет следующим (название плагина zxschema, zx - просто префикс для уникальности имени):

  1. zxschema.xml - установочный файл;
  2. zxschema.php - исполняемый код плагина;
  3. language/ru-RU/ru-RU.plg_content_zxschema.ini - файл определения языковых констант;
  4. language/ru-RU/ru-RU.plg_content_zxschema.sys.ini - файл определения языковых констант;
  5. classSimpleImage.php - класс для работы с изображениями
  6. simple_html_dom.php - парсер с jQuery подобными селекторами

Рассмотрим более подробно функцию onContentBeforeSave файла zxschema.php (остальное практически не отличается от предыдущего примера, скачать файлы можно по ссылке внизу статьи). Считаем, что изображения имеют относительный путь, обрабатывать будем полный текст, а описание (description) создадим из текста материала.

public function onContentBeforeSave($context, $article, $isNew) {
    
    // Выполняем только при сохранении материала
    if ($context == 'com_content.article') {
        
        // Определим адрес сайта
        if ($urlSite) if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) $urlSite = "https://" . $_SERVER['SERVER_NAME'];
            else $urlSite = "http://" . $_SERVER['SERVER_NAME'];
       
        // Получаем описание
        $description = mb_substr($article->introtext, 0, 140);
        $description = strip_tags($description);
        $description = htmlentities($description, ENT_QUOTES, "UTF-8");
        
        // Загружаем библиотеки
        include_once ("simple_html_dom.php");
        include_once ("classSimpleImage.php");
        
        $item = str_get_html($article->fulltext, true, true, DEFAULT_TARGET_CHARSET, false);
        
        // Удаляем предыдущую разметку
        foreach ($item->find("span") as $span) {
            if ($span->itemtype == 'http://schema.org/ImageObject') {
                foreach ($item->find("meta") as $meta) {
                    $meta->outertext = '';
                }
            } 
            $span->outertext = $span->innertext;
        }
        
        // Переберем все картинки
        foreach ($item->find("img") as $img) {
        
            // Полная ссылка на картинку
            $link = "$urlSite/" . $img->src;
            
            // Если картинка существует получаем размеры
            if (getimagesize($link)) {
                $image = new abeautifulsite\SimpleImage();
                $image->load($link);
                $width = '<meta itemprop="width" content="' . round($image->get_width($link)) . ' px">';
                $height = '<meta itemprop="height" content="' . round($image->get_height($link)) . ' px">';
            }
            
            // Найти заголовок
            $name = htmlentities($document->title, ENT_QUOTES, "UTF-8");
            
            // Создание разметки
            $img->itemprop = "contentUrl";
            $img->outertext = "<span itemscope itemtype=\"http://schema.org/ImageObject\">
                                   <meta itemprop=\"name\" content=\"$name\">
                                   <meta itemprop=\"description\" content=\"$description\">
                                   $height
                                   $width
                                   $img->outertext
                               </span>";

            $article->fulltext = "$item";
        }
    }
}

Ниже можно скачать более доработанный плагин, в частности добавлены настройки:

  • Обрабатывать вступительный текст (introtext);
  • Обрабатывать полный текст (fulltext);
  • Делать описание (description) из вступительного текста или из заголовка материала;
  • Адрес изображения относительный (не включает в себя путь сайта) или полный.

Добавить комментарий


Защитный код
Обновить