Nasze serwisy prasowe oparte są na przebudowanej, komercyjnej aplikacji InBefore. Zmian w stosunku do oryginału jest bardzo dużo, ale:
- utrzymujemy pełną kompatybilność na poziomie schematu bazy danych (dodaliśmy sporo dodatkowych tabel, kolumn i indeksów, natomiast modyfikacje oryginalnych obiektów sprowadzają się do zmiany typów 2 tabel na InnoDB)
- utrzymujemy identyczny schemat routingu do poszczególnych typów podstron
- utrzymujemy identyczną strukturę ścieżek do plików (obrazków, JS, CSS, elementów szablonu i tłumaczeń)
- nie robimy żadnych zmian w oryginalnych plikach JS i CSS, a oryginalne style CSS nadpisujemy własnymi, podpinanymi w osobnych plikach
- zmiany w kodzie szablonów (katalog
site/themes/default
) są stosunkowo niewielkie i punktowe
Dzięki temu, jeśli chcesz zacząć eksperymenty z układem strony jeszcze przed nawiązaniem współpracy z nami, możesz zacząć od zakupu oryginalnej wersji InBefore, a potem na swój kod nanieść nasze zmiany, które otrzymasz w postaci tzw. diffa.
import artykułów
- Dodaliśmy nasz analizator języka polskiego oparty na AI (w oryginalnej aplikacji InBefore artykuły po prostu dziedziczą kategorię po kategorii strony źródłowej).
- Przebudowaliśmy importer artykułów, dzięki czemu jesteśmy w stanie sprawdzać kolejki co 5 minut i indeksować w razie potrzeby nawet 200 nowych artykułów na minutę:
- podział jednej kolejki na 11 osobnych, każda dla artykułów innego typu (np. 3 polityka, 4 technologia, 5 celebryci, 6 sport itd.)
- osobna kolejka dla źródeł “problematycznych” (gdzie ktoś lub coś próbuje nas blokować lub robić throttling), oraz mechanizmy do łatwej identyfikacji takich problematycznych źródeł
- użycie memcached i różne optymalizacje, aby odciążyć bazę danych
- integracja push z Google, Bingiem i Twitterem (powiadamianie o nowych artykułach), możliwość dopinania kolejnych klas integracyjnych
- integracja pull z mniejszymi partnerami przez wystawianie dedykowanych feedów w formacie RSS lub JSON
- pełny monitoring wszystkich działań: drożności poszczególnych kolejek, drożności powiadomień itd. (z użyciem Heartbeat i Uptimerobot)
- Mocno usprawniliśmy wyszukiwanie obrazków w treści importowanych feedów RSS. Dzięki temu ponad 3x więcej importowanych artykułów posiada obrazek.
obsługa wielu niezależnych domen i stron
- Dodaliśmy obsługę wielu różnych stron na różnych domenach:
- każda strona ma własny plik konfiguracyjny, wg nazwy domeny
- funkcja
get_option
najpierw czyta ustawienia z plików konfiguracyjnych, dopiero potem (opcjonalnie) z bazy danych i innych mechanizmów InBefore - każda strona obsługuje tylko “swoje” kategorie, a do pozostałych kategorii funkcja
post_url
automatycznie tworzy linki do innych stron - każda strona ma swój logotyp, obrazek OpenGraph, favicon, oraz dedykowany plik ze stylami CSS
- Dodaliśmy obsługę cross-linkowania pomiędzy stronami i kategoriami:
- podstawą są klastry tematyczne kategorii (np. kategorie Pozostały hardware, Motoryzacja i Wyścigi są w tym samym klastrze tematycznym)
- artykuły zawierają dwie osobne sekcje linków: Powiązane (inne artykuły z tej samej kategorii) i Polecane (artykuły z innych stron w ramach klastra tematycznego)
- Dodaliśmy obsługę strony-konsoli do łatwej moderacji treści:
- widoczne są wszystkie kategorie
- można ad hoc włączać i wyłączać widoczność artykułów z poszczególnych kategorii i źródeł
funkcjonalność strony
- Dodaliśmy tryb “restricted”, czyli bardzo uproszczony tryb strony (przykład) – strona taka ma:
- trwale wyłączone oba sidebary
- schowane nazwy kategorii (w założeniu większość takich stron pokazuje tylko jedną kategorię, mamy tylko 2 wyjątki)
- slider ze zdjęciami poszerzony na całą szerokość strony
- Dla pozostałych stron dodaliśmy możliwość selektywnego wyłączania poszczególnych widgetów na prawym sidebarze (wyłączany jest nie tylko widok widgetu, ale również zaciąganie danych do niego).
- Możliwe jest również tworzenie nowych, własnych widgetów i osadzanie ich na prawym sidebarze.
- Detekcja urządzeń mobilnych za pomocą Mobile Detect, możliwość delikatnego fine-tuningu strony pod dany typ urządzeń:
- strony typu “restricted” na przeglądarkach desktopowych mają pełniejsze i ładniejsze listy artykułów na stronie głównej (poniżej slidera)
jakość wyświetlanych treści
- Poszczególne artykuły są pokazywane na podstawie szeregu kryteriów jakościowych i kierunkowych:
- dla każdego kryterium możliwa biała lub czarna lista
- np. na stronie głównej pomijane są artykuły bez zdjęć, oraz artykuły ze źródeł, dla których zostały zidentyfikowane zabezpieczenia przez hotlinkowaniem zdjęć, lub inne problemy techniczne, przez które zdjęcia się nie wyświetlają
- możliwe jest tworzenie list źródeł spełniających określone założenia (np. tylko strony prorosyjskie, albo strony z obrazkami bardzo niskiej jakości) i podpinanie ich jako czarne lub białe listy
- Cały kod do obsługi wyszukiwania artykułów z klasy
SiteController
został przeniesiony do dedykowanej klasy, która obsługuje wspomniane wyżej dodatkowe funkcjonalności. To jest przypuszczalnie największa z naszych zmian, z punktu widzenia ilości zmienionych linii kodu. - Napisany na nowo mechanizm przepisywania artykułów:
- przepisywanie następuje już na etapie zwracania wyniku zapytania SQL, a więc działa też w trybach RSS, sitemap, wyszukiwarce i wszystkich innych
- przepisywanie jest też robione na etapie powiadamiania o nowych artykułach, podczas ich importu
- do poszczególnych stron możliwe jest podłączanie różnych słowników przekształceń, np. tutaj jest słownik podstawowy, a tutaj smerfowy
- same słowniki mają nadal identyczny format jak w InBefore, możesz więc użyć pliku
site/plugins/article-rewriter/dict/English.php
jako przykładu
statystyki odwiedzin
- Informacje o wszystkich odwiedzinach każdej ze stron zapisywane są lokalnie w plikach JSON.
- Klient może zdecydować, czy statystyki odwiedzin oraz liczniki prezentowane użytkownikom końcowym mają obejmować również odwiedziny ze stron demonstracyjnych, czy jedynie swoje własne.
wydajność
- Żadna operacja, jaką jest w stanie wykonać użytkownik końcowy, nie powoduje zmian w bazie danych. Odwiedziny i wszystkie działania użytkowników odnotowywane są jedynie w lokalnych plikach, które są następnie importowane offline (na serwerze klienta, lub po przesłaniu na serwer centralny).
- Większość podstawowych danych (np. informacje o kategoriach i źródłach danych, statystyki odwiedzin itd.) są generowane w postaci tzw. includów PHP.
- Pozostałe dane są kilkupoziomowo cache’owane w użyciem memcached.
- Okres cache’owania danych jest wyliczany dynamicznie i zależy od:
- ich typu – np. zawartość strony głównej od 5 do 30 minut w zależności od poniższych kryteriów, ale już dane do stronicowania 10 minut do nawet 32 godzin
- wielkości kategorii – generalnie im większa kategoria, tym agresywniej cache’owane są jej kolejne podstrony z artykułami
- konfiguracji priorytetu strony – newsy o celebrytach zmieniają się szybciej od artykułów medycznych o nowotworach, stąd dla każdej ze stron można osobno określić 1 z 4 poziomów agresywności cache’owania
- pory dnia – w nocy pojawia się bardzo niewiele nowych artykułów, dzięki czemu wiele danych można bezpiecznie cache’ować aż do rana