• Обратная связь
  • Карта сайта
  • Отзыв
  • Комментарии
  • Форум
discord
Технические заметки
  • Главная
  • Лекции
  • Практикум
  • Обзоры
  • Сравнение
  • Нормы
  • События
  • Вход
ГлавнаяMaxSite CMS
Цветные блоки на основе UniCSS - плагин для MaxSite CMS
Плагин алфавитный каталог для MaxSite CMS

Похожие по меткам страницы для MaxSite CMS

14 марта 2019 г.Просмотров: 2159Комментарии: 0
MaxSite CMSMaxSiteПлагин

В базовом комплекте MaxSite CMS список похожих страниц для блока "Еще записи по теме" формируется на основе их принадлежности к категориям. Более достоверный список похожих страниц можно получить, используя в качестве меры похожести число общих меток.

Этим и займется наш плагин similar_post_tag.

Способ определения похожести.

Все страницы сравниваются с текущей страницей и для каждой страницы формируется мера похожести на текущую - сколько у страниц общих меток и категорий.

foreach ($all_pages as $cur_page) // сравниваем все страницы с текущей
{
  if ($cur_page['page_id'] == $page['page_id']) continue;
  // похожесть страниц - это сколько у них одинаковых меток и категорий
  $tag_similarity = count(array_intersect($cur_page['page_tags'] , $page['page_tags'])); 
  $cat_similarity = count(array_intersect($cur_page['page_categories'] , $page['page_categories'])); 
  $k = 1; // коэффициент
  $similarity = $tag_similarity*$k + $cat_similarity;
  if ($similarity) // похожесть > 0 - есть общие метки и категории
  {
     $cur_page['similarity'] = $similarity;
     $bl_pages[] = $cur_page; 
  } 
}

Отсортированный по мере похожести массив номеров и используется в дальнейшем для получения похожих страниц.

Способ вывода.

В предыдущей версии плагина использовался вывод похожих страниц по хуку content_end.

В последних версиях MaxSite CMS есть стандартный блок вывода похожих страниц "Еще записи по теме", который можно использовать.

При формировании страниц в блоке "Еще записи по теме" есть возможность добавить в вызов mso_get_pages свои строчки SQL-запроса.

Вот как выглядит функция mso_page_other_pages в фале common\page.php:

Показать код функции

# блок "Еще записи этой рубрики"
function mso_page_other_pages($page_id = 0, $page_categories = array())
{
    if ($bl_title = mso_get_option('page_other_pages', 'templates', tf('Еще записи по теме')))
    {
        // алгоритм получения записей
        $algoritm = mso_get_option('page_other_pages_algoritm', 'templates', 'all');
        
        $type_page = mso_get_option('page_other_pages_type_page', 'templates', '');
        if (!$type_page) $type_page = false;
        
        $custom_type = 'category';
        
        if ($algoritm == 'lowlewel') // только из подрубрик
        {
            $all_cat = mso_cat_array_single(); // все рубрики
            
            $bl_page_categories = array(); // обработаный массив id-level
            
            foreach ($page_categories as $cat_id)
            {
                $bl_page_categories[$cat_id] = $all_cat[$cat_id]['level'];
            }
            
            arsort($bl_page_categories); // сортируем в обратном порядке
            $bl_page_categories = array_keys($bl_page_categories); // оставляем только ключи (id)
            
            // если что-то есть, то оставляем только первую рубрику, иначе $page_categories
            if (isset($bl_page_categories[0]))
                 $bl_page_categories = array($bl_page_categories[0]);
            else $bl_page_categories = $page_categories;
            
        }
        elseif ($algoritm == 'no-cat') // не учитывать рубрики
        {
            $bl_page_categories = array(); 
            $custom_type = 'home';
        }
        else
        {
            // обычный вывод по всем рубрикам 
            $bl_page_categories = $page_categories; 
        }
        
        // своя функция sql-запроса для function_add_custom_sql
        // задается через mso_set_val()
        $fasc = mso_get_val('page_other_pages_function_add_custom_sql', false);
        $bl_pages = mso_get_pages(
                array(  'type'=> $type_page, 
                        'content'=> false, 
                        'pagination'=>false, 
                        'custom_type'=> $custom_type, 
                        'categories'=>$bl_page_categories, 
                        'exclude_page_id'=>array($page_id), 
                        'limit'=> mso_get_option('page_other_pages_limit', 'templates', 7), 
                        'order'=>mso_get_option('page_other_pages_order', 'templates', 'page_date_publish'),
                        'order_asc'=>mso_get_option('page_other_pages_order_asc', 'templates', 'random'),
                        'function_add_custom_sql' => $fasc,
                    ),
                    $_temp);
        
        if ($bl_pages)
        {
            if ($f = mso_page_foreach('page-other-pages-out')) // свой вывод
            {
                require($f);
            }
            else
            {
                echo '<div class="mso-page-other-pages">' . mso_get_val('page_other_pages_start', '<h4>') . $bl_title . mso_get_val('page_other_pages_end', '</h4>') . '<ul>';
                
                foreach ($bl_pages as $bl_page)
                {
                    mso_page_title($bl_page['page_slug'], $bl_page['page_title'], '<li>', '</li>', true);
                }
                
                echo '</ul></div>';
            }
        }
    }
}

Необходимо только добавив в запрос получения записей для этого блока всего одну строчку:

$CI->db->where_in('page.page_id', $array_id);

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

// функция - добавка, получаемая в mso_get_val('page_other_pages_function_add_custom_sql', false);
// добавляем условие получения только похожих страниц
function sql_add_similar_posts_tags()
{
 global $page;
 // не страница
 if (!isset($page['page_id']) or !$page['page_id']) return array();
  $CI = & get_instance();
 // добавим в запрос id похожих страниц
 $field_of_numbers = 'similar_post_tags_id'; // метаполе, где находится список похожих страниц
 // на всякий случай проверка, хотя поле должно быть обязательно
 if ( isset($page['page_meta'][$field_of_numbers][0]) and $page['page_meta'][$field_of_numbers][0]) 
 {    
   $array_id = mso_explode($page['page_meta'][$field_of_numbers][0]);
   if ($array_id) $CI->db->where_in('page.page_id', $array_id);
 }
}

Имя этой функции занесем в специальную переменную при помощи mso_set_val.

Кроме того, нам нужно между моментом, когда текущая запись уже получена, и моментом получения записей для блока "Еще записи по теме" получить массив номеров записей, похожих на текущую запись и записать этот массив в искусственное метаполе. Это удобно сделать по хуку content_end.

Искусственность метаполя состоит в том, что оно не хранится в базе данных и используется только для передачи массива из функции в функцию.

# функция автоподключения плагина
function similar_posts_tags_autoload($args = array())
{
 if ( is_type('page') )
 {
    // зададим функцию - добавку к запросу получения страниц
    mso_set_val('page_other_pages_function_add_custom_sql', 'sql_add_similar_posts_tags');
    // определим функцию - добавку к запросу получения страниц
    require(getinfo('plugins_dir').'similar_posts_tags/functions.php');
    // после получения страницы нам нужно в результат добавить метаполе с похожими страницами
    mso_hook_add('content_end', 'similar_posts_tags_get_id');
 }
}

Скачать плагин похожих статей для MaxSite CMS.

similar_posts_tags2.zip

Ноябрь 2019.

Версия 2.1.

Добавлена возможность указать коэффициент для категорий и меток.

Целочисленное число, позволяющее придать приоритет вычислениях.

Например:

Вес категорий=0 => категории не учитываются.

Вес меток=2 => метки в два раза важнее категорий.

Алгоритм очень простой.

foreach ($all_pages as $cur_page) // сравниваем все страницы с текущей
    {
        if ($cur_page['page_id'] == $page['page_id']) continue;
        // похожесть страниц - это сколько у них одинаковых меток и категорий
        $tag_similarity = count(array_intersect($cur_page['page_tags'] , $page['page_tags'])); 
        $cat_similarity = count(array_intersect($cur_page['page_categories'] , $page['page_categories'])); 
        $similarity = $tag_similarity*$k_tag + $cat_similarity*$k_cat;
        if ($similarity) // если похожесть больше 0, тоесть есть общие метки и категории
        {
               $cur_page['similarity'] = $similarity;
            $bl_pages[] = $cur_page; 
        } 
    }

similar_posts_tags2-1.zip

  • Плагины MaxSite CMS
    • Плагин profile личного кабинета для MaxSite CMS
    • Плагин My_ESP8266 для MaxSiteCMS.
    • Версия 02 плагина My_ESP8266 для MaxSiteCMS.
    • Настраиваемое облако меток для MaxSite CMS.
    • Загрузка файлов комъюзерами - плагин для MaxSite CMS.
    • Пользовательские пункты в меню и breadcrumbs в MaxSite CMS.
    • Плагин личного кабинета комюзера profile2 для MaxSite CMS .
      • Алгоритм расстановки пожарных извещателей согласно СП 484
    • Плагин алфавитный каталог для MaxSite CMS
    • Цветные блоки на основе UniCSS - плагин для MaxSite CMS
    • Похожие по меткам страницы для MaxSite CMS
    • Плагин форума Dialog для MaxSite CMS.
    • Галерея изображений для MaxSite CMS Taggallery-2-0
    • Галерея изображений для MaxSite CMS Taggallery-2-5
    • Плагин tags_tree дерева меток для MaxSite CMS
    • Плагин CSV Banner для импорта списка товаров AliExpress в MaxSite CMS

Еще записи по теме

Создание коллажа изображений Taggallery на MaxSite CMS.
Создание коллажа изображений Taggallery на MaxSite CMS.
Плагин CSV Banner для импорта списка товаров AliExpress в MaxSite CMS
Плагин CSV Banner для импорта списка товаров AliExpress в MaxSite CMS
Новая версия плагина галерей для MaxSite CMS Taggallery-2.1
Новая версия плагина галерей для MaxSite CMS Taggallery-2.1
Компонент для MaxSite CMS, создающий в header коллаж из изображений
Компонент для MaxSite CMS, создающий в header коллаж из изображений
Галерея изображений для MaxSite CMS Taggallery-2-0
Галерея изображений для MaxSite CMS Taggallery-2-0
Новая версия плагина галерей для MaxSite CMS Taggallery-2.2.
Новая версия плагина галерей для MaxSite CMS Taggallery-2.2.
Оставьте комментарий.

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question


Выберите для анонимного комментирования (комментарий будет опубликован после проверки).

     

  

Выберите если нужно войти или зарегистрироваться и оставить комментарий от своего аккаунта.

Войти, используя

(обязательно)

Подписка на новости
discord

Email:

Регистрация

Вход через
Разделы
  • Пожарная сигнализация124
    • Инструкции13
    • Проекты2
  • Автоматика58
  • Отопление33
  • Мониторинг30
  • Электрика17
  • Пожаротушение32
  • Умный дом32
  • Arduino12
  • Гаджеты32
  • MaxSite CMS26
Актуальное
  • СП 484
  • Автоматизация теплого пола
  • Болид vs Рубеж
  • С2000-АСПТ
  • ПЦН в кармане
  • Системы противопожарной зашиты
  • Cloud IoT
  • Проектирование
  • Программирование
  • Ссылки
Последние комментарии
Можно ли использовать независимый расцепитель в противопожарных системах
  • Виталий » "Примечание. В статье применяется аббревиатура СПА (системы противопожарной автоматики), которая может резать глаза. Но к ней стоит привыкать, ибо аббревиатуру...
  • Андрей » Неправда Ваша. "Мысль изречённая есть ложь." Но это и не система сигнализации, а система оповещения.
  • Андрей » Замечательная статья, все по делу, все по полочкам, основательный инженерный подход, спасибо! И я тоже проходил подобные искания и копания,...
  • Андрей » Спасибо. Если данный участок расположен внутри щита (шкафа) управления вентиляцией, то контролировать его целостность не требуется, т.к. этот участок не подпадает...
  • Андрей » Думаю для данного случая подходит вариант из п.3.20: "между системой пожарной автоматики и другими инженерными системами" Корпус щита, шкафа вентиляции не является...
Последние загрузки
Все загрузки
Дискуссии на форуме
  • КПБ
  • Выбор ОПС для коттеджа
  • Отключение питания раздвижных дверей при пожарном сценарии.
Реклама

XH-W1411 Thermostat LED Digital Temperature Controller AC 110V 220V 10A Switch Thermometer Smart Temperature Regulator DC 12V

222-423 Push In Connector Compact wire Wiring Connector Terminal Block Fast plastic terminator terminal block Connectors 20pcs

48W Quick Charger 3.0 USB Charger for Samsung A50 A30 iPhone 7 8 Xiaomi mi9 Tablet QC 3.0 Fast Wall Charger US EU UK Plug Adapte

Пожарка 126 Проектирование 99 Болид 64 Лекции 58 Социальное 53 Рубеж 49 Обзор 47 Автоматика 47 Инженерные системы 40 Курьез 36 Практикум 36 Адресные системы 35 Пожаротушение 34 Отопление 33 Интернет Вещей 29 MaxSite 28 ГОСТ 26 Терморегуляторы 24 Облачный Сервис 24 Мониторинг 22 Вентиляция 21 Теплый пол 21 Плагин 21 Сравнение 20 AliExpress 20 Законы Ома 20 ППУ 20 Техобслуживание 19 Эксплуатация 19 СП 484 19 Астра 17 ППК 17 Клапана 15 Электрика 14 С2000-АСПТ 14 Рубикон 13 Arduino 13 Оповещение 13 WiFi 12 С2000М 12 Ritm 11 Гранд Магистр 11 Датчики 11 Насосная Станция 11 ESP8266 10 Юнитест 10 ПЦН 9 ВЭРС 9 Сценарии 8 Авария 8 Жилой дом 8 Taggallery 7 Отзыв 7 Освещение 7 Программирование 7 Сообщества 7 Диспетчеризация 7 Плазма-Т 6 Гаджеты 5 ПО 5 С2000-СП4 5 Спрут-2 5 Радиоканал 4 МПН 4 GeoRITM 4 МПТ 4 Версет 3 Firesec3 3 Гранит 3 РИП 3 Баня 3 Учет ресурсов 3 ИПДЛ 3 Navigard 3 Visio 3 Рубеж-2ОП 3 My_ESP8266 3 Гидравлика 2 Задвижка 2 Zigbee 2 Security Hub 2 ТО 2
  • Обратная связь
  • Карта сайта
  • Отзыв
  • События
  • Комментарии
  • Форум
© Технические заметки 2026. Работает на MaxSite CMS. ( Вход )
Автор не несет ответственность за последствия применения материалов сайта на практике.