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

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

14 марта 2019 г.Просмотров: 1839Комментарии: 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.
Галерея изображений для MaxSite CMS Taggallery-2-0
Галерея изображений для MaxSite CMS Taggallery-2-0
Плагин CSV Banner для импорта списка товаров AliExpress в MaxSite CMS
Плагин CSV Banner для импорта списка товаров AliExpress в MaxSite CMS
Компонент для MaxSite CMS, создающий в header коллаж из изображений
Компонент для MaxSite CMS, создающий в header коллаж из изображений
Новая версия плагина галерей для MaxSite CMS Taggallery-2.1
Новая версия плагина галерей для MaxSite CMS Taggallery-2.1
Новая версия плагина галерей для 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:

Регистрация

Вход через
Разделы
  • Пожарная сигнализация123
    • Инструкции13
    • Проекты2
  • Автоматика54
  • Отопление33
  • Мониторинг30
  • Электрика16
  • Пожаротушение31
  • Умный дом32
  • Arduino12
  • Гаджеты32
  • MaxSite CMS26
Актуальное
  • СП 484
  • Автоматизация теплого пола
  • Болид vs Рубеж
  • С2000-АСПТ
  • ПЦН в кармане
  • Системы противопожарной зашиты
  • Cloud IoT
  • Проектирование
  • Программирование
  • Ссылки
Последние комментарии
9+10 ошибок при монтаже автоматической системы пожаротушения на основе С2000-АСПТ
  • Аноним » Любопытно, первая страница инструкции на АСПТ содержит "БЛОК ПРИЁМНО–КОНТРОЛЬНЫЙ И УПРАВЛЕНИЯ АВТОМАТИЧЕСКИМИ СРЕДСТВАМИ ПОЖАРОТУШЕНИЯ «С2000-АСПТ»", т.е. АСПТ является ПКУ. Читаем...
  • Андрей » "Блок" же. Не "прибор".
Идеальное техническое решение по противопожарной автоматике в разделе ЭОМ
  • Виктор Чекавин » У исполнительных модулей Рубежа МДУ-1 какая то конструктивная болячка с залипшими реле. Такому давать сертификат подсудное дело. Если программно добавлено...
  • Андрей » Ну так санкции. В таких условиях, когда снипы-хрипы накладывают требования, невыполнимые в текущем социально-экономичес ком развитии общества, я считаю вообще надо...
Контроллер теплых полов Beok CCT-10 с AliExpress для зонального отопления
  • Андрей » Здравствуйте. Видимо неправильно собраны контроллеры по логической схеме ИЛИ в цепь управления котлом. Надо нормально разомкнутые контакты выхода на котел соединить...
Последние загрузки
Все загрузки
Дискуссии на форуме
  • Выбор ОПС для коттеджа
  • Отключение питания раздвижных дверей при пожарном сценарии.
  • Подключение люков дымоудаления Mercor
Реклама

Gigabit Media Converter SFP Transceiver Module 5KM 1000Mbps Fast Ethernet RJ45 to Fiber Optic switch 2 port SC Single Mode

NEWACALOX EU/US 60w DIY Adjustable Temperature Electric Soldering Iron Welding Kit Screwdriver Glue Gun Repair Carving Knife

RCA Audio Cable 2RCA Male to 3.5mm Jack to 2 RCA AUX Cable Nylon Braided Splitter Cable for Home Theater iPhone Headphone

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