Jak na jednoduché počítadlo zobrazení článků ve WordPressu

Hodně si v poslední době hraju s WordPressem a snažím se co nejvíce využít jeho základních možností bez nutnosti instalovat pluginy třetích stran. Na sledování návštěvnosti samozřejmě používám Google Analytics, ale potřeboval jsem i hloupoučké inkrementální počitadlo zobrazení článků. S jeho pomocí pak mohu vyrobit žebříček nejčtenějších článků ve formě widgetu.

Pokud budete hledat počitadlo zobrazení článků či stránek ve WordPressu, najdete bezesporu hromadu pluginů. Ale nechtěl jsem se probírat kopou vylepšení, zjišťovat, které mi sedne nejlépe a případně se spoléhat, že jej nebudu muset v jednom kuse aktualizovat.

Napadlo mě: co takhle s každým zobrazením zapsat o jedničku více coby nějaké číslo do uživatelského pole ve WordPressu? To by mohlo být ono. Uživatelská pole jsou standard, nemusím nic instalovat a články seřazené podle návštěvnosti na základě hodnoty z uživatelského pole snadno vypíšu pomocí WP_Query.

Zapisování návštěvnosti článků do uživatelského pole ve WordPressu

Celý koncept zápisu návštěvnosti do uživatelského pole u příspěvku je velice jednoduchý. Co budeme potřebovat:

  • Zjištění, zda je zobrazen detail článku a nefiguruje jen někde ve výpisu
  • Načtení aktuální hodnoty počitadla z uživatelského pole
  • Její zvýšení o jedničku
  • Uložení nové hodnoty

Úpravu si tedy připravíme novou funkcí v souboru functions.php v tématu vzhledu:

function pocitadlo() {
    if(is_single()) {
        global $post;
        $pocet = get_post_meta($post->ID, 'pocitadlo', true);
        $novy_pocet = $pocet + 1;
        update_post_meta($post->ID, 'pocitadlo', $novy_pocet);
    }
}

Nyní jen poprosíme WordPress o to, aby tuto funkci spouštěl při načtení stránky. Učiníme tak přidáním jednoho dalšího řádku do functions.php:

add_action('wp_head', 'pocitadlo');

Poznámka: Jako především drupalistovi se mi samozřejmě příčí vkládání v podstatě funkčních záležitostí do kódu tématu vzhledu. Ale ten binec ve WordPressu je tak návykový, že si na to taky brzy zvyknete a nebudete tvořit speciální plugin.

Zobrazení počitadla návštěvnosti článku

Počitadlo nám začalo fungovat. Jakmile si různé články několikrát otevřete, mrkněte do jejich editace. Tam bude nejprve nutné zapnout zobrazení uživatelských polí, pokud jste tak ještě neučinili. Klikněte na tlačítko se třemi tečkami vpravo nahoře a zvolte Možnosti. V novém panelu zatrhněte vespod Uživatelská pole a panel křížkem zavřete.

Přesuňte se na spodek editační stránky, kde byste měli vidět uživatelská políčka včetně našeho přidaného počitadla.

Takové sledování návštěvnosti není úplně pohodlné. Vlastně není pohodlné vůbec. Já jsem potřeboval podobné zobrazení, na které jsem zvyklý z Drupalu. Tedy info o počtu zobrazení každého článku někde u data vydání nebo jména autora. Jak na to ve WordPressu?

Používám téma vzhledu postavené z generátoru Underscores, takže příslušný soubor, ve kterém je potřeba provést úpravu, se jmenuje template-parts/content.php. V podstatě potřebujete najít soubor, který v šabloně řídí zobrazení článku. Klidně je možné, že to budete mít přímo v single.php.

Funkcí get_post_custom si načtu informace z uživatelských políček pro aktuální článek.

$get_meta = get_post_custom($post->ID);

V místě, kde chci informaci z počitadla návštěvnosti ve WordPressu zobrazit, jen vložím následující:

if( current_user_can('administrator') ){
  echo ' – <span class="hits-counter">Zobrazeno: '.$get_meta['pocitadlo'][0].'&times;</span>';
}

Podmínkou ověřuji, že na web zrovna kouká přihlášený administrátor. Nechci totiž počitadlo zobrazovat běžným čtenářům. Funkcí echo jej pak vypíšu do HTML značky span spolu se znakem × zapsaným HTML entitou &times;.

Informace o počtu přečtení článků ve WordPressu

Úkol pro vás: když víte, jak otestovat, zda na článek kouká administrátor webu, zkuste si do kódu navyšujícího počitadlo přidat podmínku, že se tak stane jen v případě, kdy na web nekouká admin, ale běžný čtenář. Nechcete přeci svými vlastními návštěvami článku počitadlo zkreslovat.

Zobrazení počitadla ve výpisu článků

Zobrazení počitadla u výpisu článků na webu je sice pěkné, ale pro správce či provozovatele webu by bylo příjemnější, mít informaci o návštěvnosti článků přímo v jejich přehledu v administraci WordPressu. Spolu s možností si články dle čtenosti seřadit klepnutím do záhlaví přehledu, tak jako to lze třeba dle data vydání.

K tomu musíme do functions.php přidat několik dalších funkcí a filtrů. V první řadě použijeme filtr manage_post_posts_columns, kterým budeme WordPress informovat o přidávaném sloupečku do výpisu příspěvků v administraci.

function my_filter_posts_columns( $columns ) {
    $columns['pocitadlo'] = __( 'Počet zobrazení' );
    return $columns;
}
add_filter( 'manage_post_posts_columns', 'my_filter_posts_columns' );

Následujícím filtrem manage_post_posts_custom_column a funkcí v něm volanou naplníme data pro každý z článků v daném sloupečku. Funkce volaná filtrem využívá načtení hodnoty z uživatelského pole, které jsme si již ukázali výše.

function my_post_column( $column, $post_id ) {
    if ( 'pocitadlo' === $column ) {
        echo get_post_meta($post_id, 'pocitadlo', true).'&times;';
    }
}
add_action( 'manage_post_posts_custom_column', 'my_post_column', 10, 2);

Data z počitadla by se vám v tuto chvíli již měla zobrazovat a zbývá doplnit možnost řazení seznamu článků podle nového sloupečku. WordPress k tomu nabízí filtr manage_edit-post_sortable_columns.

function my_post_sortable_columns( $columns ) {
    $columns['pocitadlo'] = 'pocitadlo';
    return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'my_post_sortable_columns');

A konečně poslední část. Řazení sice máme, ale musíme WordPressu říci, jak přesně má řazení při požadavku setřídění dle nového sloupce proběhnout. Jinými slovy, že chceme řadit podle číselné hodnoty v uživatelském poli pro počitadlo.

function my_posts_orderby( $query ) {
    if( ! is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( 'pocitadlo' === $query->get( 'orderby') ) {
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'meta_key', 'pocitadlo' );
        $query->set( 'meta_type', 'numeric' );
    }
}
add_action( 'pre_get_posts', 'my_posts_orderby' );

Nyní se podívejte do administrace WordPressu a řazení článku dle hodnoty z počitadla přečtení si vyzkoušejte.

Počitadlo zobrazení v adminu WordPressu

Widget se seznamem nejčtenějších článků

Poslední věc, kvůli které jsem si jednoduché počitadlo přečtení nebo spíše zobrazení článků připravil, je widget zobrazující seznam nejpopulárnějších článků. Nastala otázka, jak vymyslet výběr dat. Z aktuálního měsíce nebo roku? Co když bude zrovna 1. ledna? Pak by se v boxíku nic nezobrazilo.

Použil jsem tedy WP_Query, které volám s požadavkem pěti článků seřazených dle uživatelského pole sestupně, ale zároveň vyfiltrovaných tak, aby ve výběru figurovaly jenom články vydané rok dozadu. Nikoli minulý rok, ale v podstatě 365 dnů ode dneška dozadu.

Widget jsem sestrojil třídou umístěnou opět do souboru functions.php. V argumentech pro WP_Query, okolo kterého se vše točí, vidíte date_query volané pro rok dozadu. Můžete použít jiný filtrovací řetězec, kterému PHP rozumí. Například zadáním -1 month zajistíte zobrazení nejpopulárnějších článků vydaných za poslední průběžný měsíc.

class my_popular_posts_widget extends WP_Widget {
    function __construct() {
        parent::__construct(
// Base ID of your widget
            'vylety_popular_posts_widget',
// Widget name will appear in UI
            __('Nejčtenější články', 'mujweb'),
// Widget description
            array( 'description' => __( 'Nejčtenější články za poslední rok', 'vylety' ), )
        );
    }
// Creating widget front-end
    public function widget( $args, $instance ) {
        $title = apply_filters( 'widget_title', $instance['title'] );
// before and after widget arguments are defined by themes
        echo $args['before_widget'];
        if ( ! empty( $title ) )
            echo $args['before_title'] . $title . $args['after_title'];
// This is where you run the code and display the output
        $args = array(
            'post_status' => 'publish',
            'posts_per_page' => 5,
            'post_type' => 'post',
            'meta_key' => 'pocitadlo',
            'orderby' => 'meta_value_num',
            'order' => 'DESC',
            'date_query' => array(
                array(
                    'after' => '-1 year',
                    'column' => 'post_date',
                ),
            ),
        );
        $the_query = new WP_Query( $args );
        print '<div class="recent">';
        while ($the_query -> have_posts()) :
            $the_query -> the_post();
            ?>
            <div bp="grid">
                <div bp="4" class="thumb"><a href="<?php print get_permalink(); ?>"><?php print get_the_post_thumbnail(null,'thumbnail'); ?></a></div>
                <div bp="8"><a href="<?php print get_permalink(); ?>"><?php print get_the_title(); ?></a></div>
            </div>
        <?php
        endwhile;
        wp_reset_postdata();
        print '</div>';
        echo $args['after_widget'];
    }
// Widget Backend
    public function form( $instance ) {
        if ( isset( $instance[ 'title' ] ) ) {
            $title = $instance[ 'title' ];
        }
        else {
            $title = __( 'Nejčtenější články', 'vylety' );
        }
// Widget admin form
        ?>
        <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 esc_attr( $title ); ?>" />
        </p>
        <?php
    }
// Updating widget replacing old instances with new
    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
        return $instance;
    }
} // Class wpb_widget ends here

Aby se vám widget objevil v administrační části Vzhled > Widgety a začal ve WordPressu fungovat, musíte ještě zavolat filtr, kterým o novém widgetu dáte WordPressu vědět:

function my_load_widget() {
    register_widget( 'my_popular_posts_widget' );
}
add_action( 'widgets_init', 'my_load_widget' );

A to je celé. Bez potřeby pluginu jsme sestrojili jednoduché počitadlo přečtení, které využívá jen standardních věcí dostupných přímo v základní instalaci WordPressu. Jistě, není nijak sofistikované, prostě se jen s každým zobrazením článku zdvihne o jedničku. Ale pro daný účel myslím naprosto stačí. Nač suplovat pokročilé statistiky, když tu máme Google Analytics nebo logy ze serveru.

Zdroje: Jak vytvořit widget (EN), Počítání návštěv (EN)

Tagy

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru