Tipy & Triky (62) @ 09 Únor 2013, 2 komentáře (Poslední 6.05 2013 19:10:20), zobrazeno 374x

Pokud chcete pochopit, jak vlastně samotný WordPress funguje, určitě vám pomůže základní znalost struktury jeho databáze. Ta se zkládá z celkem 11 tabulek, které ještě mohou rozšiřovat pluginy. Každá má svůj prefix, nejčastěji wp_, který se nastavuje běhěm instalace WordPressu a vytváření databáze.

comments, commentmeta

První dvě tabulky obsahují informace o komentářích na webu. V té první naleznete základní informace o komentujícím (jméno, url, email, IP adresa), včetně samotného obsahu. Na tabulku je pak navázaná commentmeta, kde se ukládají další, rozšiřující informace. Ty jsou zpravidla využívání až nainstalovanými pluginy. Můžete tak přidat třeba právě nové Twitter políčko pro komentující.

link

V současné době už historický pozůstatek, se kterým se do dalších verzí nepočítá. Jak už název napovídá, uchovává/la informace o odkazech.

options

Tabulka options slouží jako univerzální skladiště pro nejrůznější informace. Od základních jako název, url blogu, email na autora po aktivované šablony, pluginy či nacachované informace. Využívá ji i drtivá většina pluginů pro ukládání nastavení. Jelikož část z nich uložená data po odinstalaci nesmaže, může se stát, že se vám bude plnit neaktuálními a zbytečnými informacemi.

posts, postmeta

A teď k tomu nejdůležitějšími. V tabulce posts naleznete všechny vaše články, které jste napsaly. Obsahuje také revize, které vám při větším množství úprav mohou pěkně zahltit databázi. Po bližším průzkumu si můžete všichnout, že i obrázky a další soubory ve vaší mediální knihivně jsou uloženy jako články.

Doplňující tabulka postmeta opět slouží pro rozšířené informace, jež se ukládají v podobě uživatelských polí. Některá nejsou v adminu webu vidět a poznáte je tak, že jejich název začíná podtržítkem. Buď proto, aby je uživatel nemohl editovat nebo obsahují zakódované informace.

terms, term_relationship, term_taxonomy

Nejsložitější část databáze, která spojuje hned tři tabulky, uchovává informace o štítcích, kategoriích, případně o dalších vlastních taxonomy.

Základ je opět v tabulce term, kde jsou uloženy všechny názvy. Propojením s term_taxonomy, zjišťujeme jestli se jedná o kategorii nebo tag. A poslední tabulka už je spojuje se samotnými články.

users, user_meta

Pokud jste jedinými tvůrci své stránky a nemáte povoleny registrace uživatelů, budou tyto dvě tabulky velmi skromné. Jak už jsme zvyklí, tak v users nalezneme základní informace, které následně usermeteta rozšiřuje. Opět především za pomocí pluginů.

Tipy & Triky (62) @ 04 Leden 2013, 3 komentáře (Poslední 5.01 2013 00:08:45), zobrazeno 215x

Moderní prohlížeče si dokážou s webovými stránkami docela dobře poradit, takže jejich tisk už není utrpení. I přesto nejsou jejich algoritmy dokonalé a jelikož myslíme na uživatele, tak nechceme, aby plýtval svým drahým tonerem na zbytečnosti. Proto si ukážeme, jak ve WordPressu vytvořit jednoduchou stránku pro tisk dokumentů.

V praxi vypíšeme pouze text příspěvku a zbytečnosti jako hlavičku, patičku nebo sidebar jednoduše vynecháme. Pokud budete chtít, není problém si do dokumentu ještě připsat třeba autora nebo url zdrojového webu. My si ale ukážeme to nejjednodušší řešení.

Do souboru šablony functions.php přidáme:

add_action('init', 'tisk');

function tisk(){
	if(isset($_GET['tisk'])){
		global $wpdb;
                $posts = get_posts("include=" . url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ));
		$post = $posts[0];
		?>
		<html>
		<head>
			<meta charset="utf-8">
			<title><?=$post->post_title;?> Tisk</title>
		</head>
		<body onLoad="window.print();">
		<?php
		echo "<h1>" . $post->post_title . "</h1>";
		echo apply_filters('the_content', $post->post_content);
		?>
		</body>
		</html>
		<?php		
		die();
	}
}

Stránky pro tisk lze zavolat jednoduše pomocí parametru ?tisk. Odkaz vypadá takto. Ještě doporučuji přidat základní styly pro WordPress. Ty zaručují například správné pozicování obrázků.

body {width: 80%; margin: 0 auto;}
img {
	margin: 0 0 1.5em 0;
	}
.alignleft, img.alignleft {
	margin-right: 1.5em;
	display: inline;
	float: left;
	}
.alignright, img.alignright {
	margin-left: 1.5em;
	display: inline;
	float: right;
	}
.aligncenter, img.aligncenter {
	margin-right: auto;
	margin-left: auto;
	display: block;
	clear: both;
	}
.wp-caption {
	margin-bottom: 1.5em;
	text-align: center;
	padding-top: 5px;
	}
.wp-caption img {
	border: 0 none;
	padding: 0;
	margin: 0;
	}
.wp-caption p.wp-caption-text {
	line-height: 1.5;
	font-size: 10px;
	margin: 0;
	}
.wp-smiley {
	margin: 0 !important;
	max-height: 1em;
	}
blockquote.left {
	margin-right: 20px;
	text-align: right;
	margin-left: 0;
	width: 33%;
	float: left;
	}
blockquote.right {
	margin-left: 20px;
	text-align: left;
	margin-right: 0;
	width: 33%;
	float: right;
	}
Tipy & Triky (62) @ 26 Prosinec 2012, 1 komentář (Poslední 8.04 2013 11:14:05), zobrazeno 142x

Dnešní tip je widget pro nejaktivnější komentátory. Jeden podobný už zde byl k vidění, ale ten dnešní má nový grafický kabát. Nevypisuje se totiž textově, ale graficky v podobě gravatarů. Na škodu je, že pořád velká část lidí dosud neví, jak si takový gravatar zařídit a tudíž se může stát, že namísto mixu osobností to bude jen hromada bezduchých panáků.

Trochu může pomoci návod „Jak v komentářích zobrazit avatara z Twitteru“, ale obecně platí, že kdo má Twitter, má i gravatar.

A samotný snippet pro widget:

class komentatoriWidget extends WP_Widget {

    function komentatoriWidget() {
        parent::WP_Widget(false, $name = 'Nejaktivnější komentátoři');
    }

    function widget($args, $instance) {
        extract($args);
        $title = apply_filters('widget_title', $instance['title']);
        $pocet = $instance['pocet'];
        echo $before_widget;
        if ($title)
            echo $before_title . $title . $after_title;
       	global $wpdb;
		foreach($wpdb->get_results("
		    SELECT *, COUNT(*) as komentaru 
		    FROM ". $wpdb->comments ." 
		    WHERE comment_approved = 1 AND user_id NOT IN (1) 
		    GROUP BY comment_author_email 
		    ORDER BY komentaru DESC 
		    LIMIT " . $pocet) as $comment){
		    $url = $comment->comment_author_url;
		    if($url != '') $element = "a";
		    else $element = "span";
		    echo "<". $element ." ";
		    if($url != "") echo "href='". $url ."'";
		    echo "title='". $comment->comment_author .", komentoval ". $comment->komentaru ."x' alt='". $comment->comment_ID ."'>" . get_avatar($comment, 63) . "</". $element .">";
		  };
        echo $after_widget;
    }

    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['pocet'] = $new_instance['pocet'];
        return $instance;
    }

    function form($instance) {
        $title = esc_attr($instance['title']);
        $pocet = esc_attr($instance['pocet']);
        ?>
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
            <input class='widefat' id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('pocet'); ?>"><?php _e('Počet komentujících:'); ?></label>
            <input class='widefat' id="<?php echo $this->get_field_id('pocet'); ?>" name="<?php echo $this->get_field_name('pocet'); ?>" type="text" value="<?php echo $pocet; ?>" />
        </p>
        <?php
    }

}

add_action('widgets_init', create_function('', 'return register_widget("komentatoriWidget");'));

Na co je dobré upozornit? Velikost obrázků si můžete upravit ve funkci get_avatar. Pozor, Twitter profily mají maximální velikost 73×73, takže abyste to nepřehnaly. V SQL příkazu si ještě všimněte „user_id NOT IN (1)“. Zde je nutné vypsat ID všech uživatelů, které nechcete vypisovat. Zpravidla to jste vy, jako administrátor, s ID 1.

Nemusí vypisovat nejaktivnější. Stačí úprava SQL příkazu a zobrazovat lidi lze náhodně.

SELECT *, COUNT(*) as komentaru 
FROM ". $wpdb->comments ." 
WHERE comment_approved = 1 AND user_id NOT IN (1) 
GROUP BY comment_author_email 
ORDER BY RAND()
LIMIT " . $pocet

A k čemu to všechno? Jako malá odměna těm, kteří se vám rozhodnou něco okomentovat. Či pro nálety spamerů. Záleží, jak na to nahlížíte.

Tipy & Triky (62) @ 10 Listopad 2012, Žádné komentáře, zobrazeno 264x

V předchozím článku jsme si ukázali, jak získat počet přečtení článku přímo z Google Analytic. Dnes budeme pokračovat, takže se dozvíte, jak celý proces ještě zdokonalit a jak přidat widget pro nejčtenější články.

První věc, kterou musíte udělat je nainstalovat si a aktivovat plugin Google Analytics Dashboard. Všechna data si budeme aktualizovat pomocí cronu, čímž se nezpomalí načítání samotné stránky pro návštěvníky. Script se velmi podobá tomu, pro načítání tweetů o článku.

add_action('ana_nactipost_hook', 'ana_nactipost', 10, 1);

add_action('ana_hodina', 'nactiAnalytics');

function ana_cron_activation() {
    if (!wp_next_scheduled('ana_hodina')) {
        wp_schedule_event(time(), 'hourly', 'ana_hodina');
        nactiAnalytics();
    }
}

add_action('wp', 'ana_cron_activation');

function ana_nactipost($id) {
    global $wpdb;
    $url = get_permalink($id);
    $rozdil = time() - Date("U", strtotime($wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE ID = '" . $id . "'")));
    wp_schedule_single_event(time() + rand(300, 1600), 'ana_nactipost_hook', array('id' => $id));
    $data = new SingleGADWidgetData(); 
	update_post_meta($id, 'analytics', $data->get_page_views($url));
	}

function nactiAnalytics() {
    global $wpdb;
    foreach ($wpdb->get_results("SELECT ID 
        FROM $wpdb->posts 
            WHERE post_type='post' AND post_status='publish'") as $post) {
        if (!wp_next_scheduled('ana_nactipost_hook', array('id' => $post->ID))) {
        	wp_schedule_single_event(time() + rand(60 * 10, 60 * 30), 'ana_nactipost_hook', array('id' => $post->ID));
        	}
    	}
	}

add_action('init', 'GALoad');

function GALoad(){
	class SingleGADWidgetData extends GADWidgetData {

    function gad_pageviews_text_begining($link_uri){
	    if($this->auth_type == 'oauth') $ga = new GALib('oauth', NULL, $this->oauth_token, $this->oauth_secret, $this->account_id);
	    else $ga = new GALib('client', $this->auth_token, NULL, NULL, $this->account_id);
	    $start_date = date('Y-m-d', strtotime("2005-01-01"));
	    $end_date = date('Y-m-d');
	    $data = $ga->total_uri_pageviews_for_date_period($link_uri, $start_date, $end_date);
	    $error_type = gad_request_error_type($ga);
	    if($error_type == 'perm') return '';
	    else if($error_type == 'retry') $data = $ga->total_uri_pageviews_for_date_period($link_uri, $start_date, $end_date);
	    return $data['value'];
	  	}

	 function get_page_views($url){
	 	$url = parse_url($url);
	 	$url = $url['path'];
	 	return $this->gad_pageviews_text_begining($url);
	 }
	}
}

Všimněte si především řádku 19, kde je interval pro obnovení cache. V tomto konkrétním případě to je náhodná veličina mezi 300 a 1600 vteřinami. Je už na vás, jestli si nastavíte rychlejší aktualizaci či naopak pomalejší. Až script vložíte do šablony, tak začnou postupně načítat data, která se ukládají do uživatelských polí (konkrétně „analytics“). Vypsat je můžete takto:

echo str_replace(' ', ' ', number_format(get_post_meta(get_the_ID(), 'analytics', true), 0, ",", " ")));

A ještě script pro widget nejčtenějších článků:

class nejctenejsiWidget extends WP_Widget {

    function nejctenejsiWidget() {
        parent::WP_Widget(false, $name = 'Nejčtenější články');
    }

    function widget($args, $instance) {
        extract($args);
        $title = apply_filters('widget_title', $instance['title']);
        $pocet = $instance['pocet'];
        echo $before_widget;
        if ($title)
            echo $before_title . $title . $after_title;
        echo "<ul>";
        foreach(get_posts('post_type=post&meta_key=analytics&orderby=meta_value_num&order=DESC&posts_per_page=' . $pocet) as $post){
        	echo "<li><a href='". get_permalink($post->ID) ."'>" . $post->post_title . "</a> (". str_replace(' ', ' ', number_format(get_post_meta($post->ID, 'analytics', true), 0, ",", " ")) ."x)</li>";
        }
        echo "</ul>";
        //zde napíšete kód widgetu
        echo $after_widget;
    }

    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['pocet'] = $new_instance['pocet'];
        return $instance;
    }

    function form($instance) {
        $title = esc_attr($instance['title']);
        $pocet = esc_attr($instance['pocet']);
        ?>
        <p>
            <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
            <input class='widefat' id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('pocet'); ?>"><?php _e('Počet článků:'); ?></label>
            <input class='widefat' id="<?php echo $this->get_field_id('pocet'); ?>" name="<?php echo $this->get_field_name('pocet'); ?>" type="text" value="<?php echo $pocet; ?>" />
        </p>
        <?php
    }

}

add_action('widgets_init', create_function('', 'return register_widget("nejctenejsiWidget");'));
Tipy & Triky (62) @ 04 Listopad 2012, 12 komentářů (Poslední 27.03 2013 20:49:18), zobrazeno 885x

Pokud u svých článků chcete zobrazovat počet přečtení, tak WordPress vám nabídne velké množství pluginů, které můžete použít. Velkou nevýhodou je ovšem fakt, že začínáte lidově řečeno od nuly. I když už vaším blogem prošly tisíce lidí, tak u všech článků vám bude svítit děsivá nula. Pokud k měření návštěvnosti používáte Google Analytics, mám pro vás řešení.

Právě v analytikách máte počet přečtení uložený, takže ho musíte jen nějak chytře vytáhnout. Prvním krokem je instalace pluginu Google Analytics Dashboard. Ten sám o sobě umí zobrazit grafy o návštěvnosti přímo ve WordPressu, ale pro nás bude sloužit především jako prostředek pro komunikaci s Google účtem.

Tutoriály (10) @ 22 Říjen 2012, 5 komentářů (Poslední 8.12 2012 17:42:51), zobrazeno 1 102x

Ano, jak všichni správně víte, tak WordPress je pravidelně překládán do češtiny (v poslední době to trochu vázne, ale měl by to být jen dočasný problém). Ovšem, může se stát, že si stáhnete anglickou verzi nebo vám hosting sám vytvoří cizojazyčnou mutaci. Vy si web nastavíte, vložíte články a ejhle, uvědomíte si, že potřebujete nahodit češtinu.

Nebojte se ovšem. Nebudete muset přeinstalovávat celý WordPress, ale stačí vám nahrát lokalizační soubory. A jak tedy na to? Všechny úpravy lze shrnout do následujících kroků.

  1. z webu cs.wordpress.org si stáhněte poslední českou verzi. Pokud je vaše cizojazyčná mutace staršího data, doporučuji nejdříve aktualizovat nebo vybrat příslušnou verzi na cs.wordpress.org/releases
  2. stažený zip soubor je třeba rozbalit a nakopírovat soubory ze složky wp-content\languages\ do stejné pozice na webu přes FTP. Pokud budete používat nějakou výchozí šablonu, tak to samé se složkami wp-content\themes\twentyeleven\languages\ a wp-content\themes\twentyten\languages\
  3. a poslední úprava, v kořenové složce webu upravte soubor wp-config.php. Najděte define(‚WPLANG’, “); a změňte na define(‚WPLANG’, ‚cs_CZ’); Uložte a radujte se z českého WordPressu

Jaké problémy mohou nastat? Třeba takový plugin E-commerence nahraje některé překlady natvrdo do databáze. Takže i když změníte jazyk, v jeho výrazivu se to neprojeví. V takovém případě máte dvě možnosti – buď příslušné tabulky ručně upravit nebo smazat a plugin nainstalovat znovu.

Ve většině případů by ale takový problém nastat neměl. Rovněž nepočítejte s tím, že by se anglické šablony zázračně překládaly do češtiny. Pokud nejsou použity pouze a jenom výrazy výchozích šablon (což není zvykem), tak bez dalších úprav se neobejdete…

Tipy & Triky (62) @ 15 Říjen 2012, Žádné komentáře, zobrazeno 203x

Jak je známo, tak WordPress pro obrázky avatarů používá externí službu Gravatar. Do té člověk zaregistruje svůj email a ten pak bude spárován s příslušným obrázkem vaši maličkosti. Dnes si ukážeme, jak tam dostat obrázek z Twitteru. Jako základ nám bude sloužit můj plugin „Twitter follow button in coments“ Ten obstarává především možnost vložení Twitter účtu.

Získat url obrázku je následně už snadné. V Twitteru developers si nalezneme následující tvar:

http://api.twitter.com/1/users/profile_image?screen_name=USERNAME&size=normal

Jak si můžete všimnou, tak je možné definovat různé velikosti podle toho, jak veliký obrázek potřebujeme. Podporované hodnoty jsou bigger, normal, mini nebo original. Největší bigger je čtverec 73×73. Velikost original není specifikována a může se lišit.

Do functions.php v šabloně přidáme filter, který nám obrázek nahradí.

add_filter('get_avatar', 'site_get_avatar', 10, 5);	
	
function site_get_avatar($avatar, $id_or_email, $size, $default, $alt){
	if($id_or_email->user_id == 0) $twitter = get_comment_meta($id_or_email->comment_ID, 'twitter', true );
	else $twitter = get_user_meta($id_or_email->user_id, 'twitter', true);
	$twitter = explode("/", str_replace("@","",$twitter));
	$twitter = $twitter[count($twitter) - 1];
	if($twitter != "") {
		if ($size <= 24) $twSize = 'mini';
		elseif ($size <= 48) $twSize = 'normal';
		else $twSize = 'bigger';
		$imgUrl = "http://api.twitter.com/1/users/profile_image?screen_name=".$twitter."&size=" . $twSize;
		$avatar = "<img src='". $imgUrl ."' width='". $size ."' class='avatar avatar-". $size ." photo' />";
		}			
	return $avatar;
	}

 

Mějte prosím na paměti, že největší obrázek, který vám Twitter vrátí, má rozměry 73×73. Více z něho nedostanete. Pokud chcete zdůraznit, že se nejedná o jen tak ledajaký obrázek, můžete ho obalit „divem“, který bude mít v pravém horním rohu background malého ptáčka.

Tutoriály (10) @ 15 Září 2012, Žádné komentáře, zobrazeno 1 902x

Dnes si ukážeme chytré úpravy, které nám usnadní pohyb a především listování v administraci. To nejen v příspěvcích, ale i ve stránkách, odkazech či komentářích, které využívají stejný interface. Jako ve většině případů i zde můžete použít pluginy, které váš WordPress patřičně vylepší.

A jak může vypadat takový upravený výpis?

Všimněte si především tlačítka „Nastavení zobrazovaných informací“, které jako vždy nabízí zajímavá nastavení. Jedná se především o možnost změnit počet položek, které chcete na jedné stránce zobrazit. Čím více jich mít budete, tím méně budete muset stránkovat, ale tím déle bude načítání trvat.

Rovněž si můžete skrýt sloupce, které ve výpisu nechcete. Pokud píšete osobní blog, tak vám třeba takový autor pro vás bude naprosto zbytečný a jen zabírá místo. Určitě jste si také všimly, že na obrázku mám jiné sloupce pro skrytí/zobrazení než vy. Mohou být přidávány automaticky různými pluginy (u mě třeba All in one seo pack), ale můžete si je také sami vytvářet pomocí pluginu Codepress Admin Columns. Ten vám vřele doporučuji.

Na výběr máte buď předdefinované atributy jako ID, Náhledový obrázek, počet slov, stručný výpis, datum poslední modifikace… nebo přidávat uživatelská pole. Těch můžete přidávat více a definovat i jejich podobu – hodnotou může být obyčejný text, obrázek, datum nebo odkaz na článek. Poradí si s hodnotami oddělenými čárkou.

Samozřejmě je možné pomocí drag and drop změnit jejich pořadí.

Můžete si klidně všechny položky zapnout najednou a jejich skrytí či zobrazení kontrolovat na jednom místě – přímo ve výpisu, jak jsme si o pár odstavců výše ukázali.

Všimněte si, že samotné články můžete filtrovat podle data a kategorie. To buď selectboxy nahoře nebo kliknutí odkazy rubrik a štítků v jednotlivých sloupečcích. Filtrování si můžete ještě rozšířit o autora pluginem Admin author filter.

Tipy na další pluginy

Admin Management Xtended – Rychlá editace článku přes ajax. Upravit můžete status, změnit tagy, autora, datum okamžitě bez zbytečného proklikávání. WordPress sice v základu nabízí rychlé úpravy, ale i k němu se musíte doklikat a navíc nenabízí takový komfort.

Add Admin CSS – Upravte si v administraci kaskádové styly. Je na vás jestli si nějaké prvky skryjete či si změnšíte/zvětšíte písmo. Stačí třeba použít tento kod:

.widefat tbody th,.widefat tbody td {padding-top: 1px !important; padding-bottom: 1px !important}

a váš výpis článků se stane kompaktnější, což se hodí zvláště na menších monitorech.