Skip to content

Instantly share code, notes, and snippets.

@OzzyCzech
Last active December 20, 2015 18:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OzzyCzech/43d9b5514a838ca81268 to your computer and use it in GitHub Desktop.
Save OzzyCzech/43d9b5514a838ca81268 to your computer and use it in GitHub Desktop.
Zdrojak.cz a jeho zdrojáky

Jak vznikal nový Zdrojak.cz

K týmu nového Zdrojáku jsem se připojil zhruba po dvou měsících jeho existence. V té době zrovna usilovně pracovali na šabloně nového Zdrojáku a řešili import dat z původního systému.

Hlavním vývojářem byl tehdy Tomáš Kapler (tímto ho zdravím). Tomáš náš tým bohužel opustil nedlouho po mém příchodu. Zdroják mi spadl takříkajíc do klína a na několik měsíců se stal mým denním chlebem (místo mé původní práce).

S odstupem času jsem se rozhodl podělit o několik postřehů a poodhalit zdrojáky Zdrojáku.

Začínáme importem dat

Nejvíce jsme si samozřejmě užili hned na začátku, při importu původních dat. Na starém Zdrojáku vyšlo na 2800 zpráviček a zhruba 1000 článků. Do těchto článků bylo vloženo přibližně 600 souborů - většinou se jednalo o obrázky nebo zip soubory.

Na první pohled nebyla databáze nijak objemná. Zdálo se, že za týden nebudeme mít co řešit. Postupem času se ukázalo, že původní redakční systém (RS) procházel celou řadou nedokumentovaných změna. Tak například:

  • řada vložených souborů nebyla v databázi vůbec dohledatelná
  • některé soubory už neexistovali vůbec
  • původní RS dovoloval duplicitní emaily uživatele
  • formátování článků se v průběhu let pochopitelně měnilo
  • uživatele měli několik druhů avatarů na různých místech
  • některé perexové obrázky si Zdroják "půjčil" z jiného serveru

Importní skript byl napsán v PHP - jako 26 samostatně spustitelných souborů. Data jsme nakonec importovali zhruba měsíc.

Funkce redakčního systému

Původní redakční systém byl postaven tak, aby hravě zvládal některé funkce, které jsou běžnému Wordpress cizí. Wordpress například neumí do procesu schvalování článku začlenit roli korektora článků. Rovněž nedokáže k jednomu článku přidat více spoluautorů. Tyhle osvědčené funkce jsme se ale rozhodli zachovat i za cenu větších úpravy systému.

Nakonec se vše obešlo bez jediného zásahu do jádra Wordpress a vzniklo něco, čemu říkáme redakční flow. Automatizovaný postup, při kterém autor článku uloží své dílo jako draft do systému. Jeho článek je pak buď vrácen k přepracování, nebo je schválen odeslán ke korekci a naplánován k publikování.

Z celého relativně komplikovaného kódu jsem se rozhodl vybrat několik zajímavých částí. Začnu změnou stavu článku:

add_action('transition_post_status', 'transitionPostStatus', 10, 3);

/**
 * draft -> pending => clánek ke kontrole
 * ? -> draft => vraceno zpet
 * ? -> publish => publikovano hned
 * ? -> future => bude publikovano v budoucnu
 */
function transitionPostStatus($new_status, $old_status, $post) {
	// ošetří revizi článku
	$post = (wp_is_post_revision($post->ID)) ? get_post($post->post_parent) : $post;
	// ignoruj autosave
	if (wp_is_post_autosave($post->ID)) return;

	// autor zmeni stav z draft -> pending (ke schválení) 
	if ( $old_status === 'draft' && $new_status === 'pending' && $post->post_author == get_current_user_id()) {
		// informuj šéfredaktora a všechny redaktory systému o novém článku
	}
	// add...
}

Některé věci jsme museli zakázat. Příkladem budiž znemožnění úprava článku, který byl poslán ke scvhálení:

add_action('pre_post_update', 'prePostUpdate');

function prePostUpdate($post_id) {
	global $post;

	if ($post->post_author == get_current_user_id() && ($post->post_status === 'pending' || $post->post_status === 'future')) {
		wp_die('Nemůžete upravovat článek, který čeká na schválení')
	}

	// atd...
}

Občas bylo potřeba sáhnout trochu hlouběji. Do míst, kde se běžným způsobem nedostanete. Konkrétně se jednalo o změnu vzhledu divu pro odeslání nebo uložení článku. Potřebovali jsme zde přidat checkbox, signalizující zda článek prošel korekcí nebo ne:

$wp_meta_boxes[$current_screen->id]['side']['core']['submitdiv']['callback'] = 'modifySubmitDiv';
function modifySubmitDiv($post) {

	if (current_user_can('edit_others_posts')) {
		$nonce = wp_nonce_field(plugin_basename(__FILE__), 'nonce', false, false);
		$korekce = PostMetaKorekce::getValue($post);
		require_once 'checkboxKorekce.phtml'; // zobrazí formulář
		return post_submit_meta_box($post);
 	}
}

Výsledek vypadá takto:

![Článek prošel korekcí](https://gist.github.com/OzzyCzech/43d9b5514a838ca81268/raw/6f18d53b06055a3a426e85c3c1d4435e4b1afb13/korekce.png Korekce "Článek prošel korekcí")

Pluginy, pluginy a zase pluginy

Zdroják pomáhá udržovat v chodu celkem 17 pluginů. Všechny pluginy jsme vybírali velmi pečlivě. Nebáli jsme se jich vyzkoušet několik s podobnou funkcionalitou. Cílem vždy bylo najít minimalistické řešení - tedy plugin, který neumí nic navíc.

Pro několik pluginů jsem sáhl do vlastních zdrojů:

  • omSocialButtons - plugin pro automatické vkládání sociálních tlačítek do článků a stránek
  • omPreformat - pomáhá vkládat správně naformátovaný zdrojový kód
  • omRememberMe - abychom si pamatovali přihlášené uživatele

A některé jsme museli napsat:

  • omSlimBox - pro zobrazování obrázků v Lightboxu
  • omSocialLogin - na přihlášení uživatel prostřednictvím sociálních sítí

Rychlost

Wordpress nikdy nepatřil k nejrychlejším redakčním systémům. Protože své čtenáře nechceme trápit, byla rychlost webu jednou z hlavních priorit:

  • Ukládání všech interních objektů dostal na starost mírně upravený memcached plugin.
  • Všechny náročnější procesy, jako např. aktualizaci počtu sdílení článků, jsme přesunuli do cronu.
  • Tam kde to dávalo smysl, ukládáme výsledky do cache.
  • Nepoužívali jsme zbytečně pluginy, tam kde to šlo vyřešit jinak.
  • Minimalizovali jsme množství requestů.
  • Oddělili jsme komentáře od článku.

Co bychom už znovu neudělali

U každého projektu člověk postupem času dospěje do bodu prozření. Zjistí, že některé věci měl udělat jinak a jiné naopak nedělat vůbec.

Osobně považuji za největší chybu to, že jsme začali stavět vlastní šablonu nad defaultní šablonou Twenty Twelve. Tento postup nám ze startu uspořilo nějaký čas, ale v současnosti je tomu právě naopak. Komplikuje správu naší šablony a zejména vnáší neuvěřitelnou nepřehlednost do CSS.

Pravděpodobně bych znovu nepoužil plugin Co-Authors Plus. Tento plugin nás totiž mnohokrát vypekl. Navíc různé aktualizace a opravy jeden čas vycházeli až příliš často. Ale nakonec jsme se spolu sžili.

Měli jsem začít stavět design tak, aby byl responzivní hned od začátku. Pozdější úpravy často znamenali spoustu práce navíc.

Použili bych znovu Wordpress? Jednoznačně ano! Je to výborný systém. Dají se na něm postavit zajímavé a kvalitní weby. Je prověřen neuvěřitelným množství lidí a ve finále je vlastně jedno na čem svůj web postavíte.

Na co se chystáme

Od znovu spuštění Zdrojáku uběhlo půl roku. Samozřejmě máme v plánu Zdroják nadále vylepšovat. Chystáme například tolik žádané preview komentářů. Musíme ještě zapracovat na vylepšení vyhledávání. Budeme dál upravovat a ladit vzhled webu.

Třešnička závěrem

Na závěr jsem si pro vás připravil statistiky našeho git repozitáře a hezké video:

http://www.youtube.com/watch?v=e0DKfVLgmO8

Pro generování statistik jsem použil nástroj git_stats s malou úpravou. Video jsem vytvořil pomocí vizualizačního nástroje Gource.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment