Licznik wyświetleń strony w WordPress
Stwórzmy prosty licznik, który pod artykułem będzie wyświetlał ile razy strona była wyświetlana. Niech to będzie zwykły tekst, podobnie jak miało to niegdyś np. Allegro przy ofertach. Będziemy się przy tym posiłkować kursem tworzenia wtyczek w WordPress oraz bazą danych WordPress.
Nagłówek
Tradycyjnie zaczniemy od nagłówka pluginu
/**
* Plugin Name: Prosty licznik wyświetleń od eskim.pl
* Plugin URI: https://eskim.pl/licznik-wyswietlen-strony-w-wordpress/
* Description: Przykład tworzenia wtyczek w WordPress na podstawie kursu https://eskim.pl/licznik-wyswietlen-strony-w-wordpress/
* Version: 1.0
* Requires at least: 5.2
* Requires PHP: 5.6
* Author: Maciej Włodarczak
* Author URI: https://eskim.pl
* License: GPL v3 or later
* Text Domain: simple_page_views_counter_eskim_pl
* Domain Path: /languages
*/
if ( !function_exists( 'add_action' ) ) {
echo 'Zapraszam do artykułu <a href="https://eskim.pl/licznik-wyswietlen-strony-w-wordpress/">Licznik wyświetleń strony w WordPress</a>';
exit;
}
Nagłówek zawiera podstawowe informacje o wtyczce. Dodatkowo jest zabezpieczenie związane z próbą wywołania wtyczki bezpośrednio.
Podpięcie akcji
Licznik będzie liczył wyświetlenia w momencie ładowania danej strony. Można to zrobić na wiele sposobów. My skorzystamy z hooka wp_footer
, który odpala się raz podczas ładowania danej strony. Dodatkowo dodamy sprawdzenie czy nie jesteśmy w panelu administratora – za pomocą is_admin
.
if ( !function_exists('eskim_pl_post_count_load') ) :
function eskim_pl_post_count_load()
{
// kod
}
if (!is_admin()) add_action( 'wp_footer', 'eskim_pl_post_count_load' );
endif;
W powyższym przykładzie podpinamy funkcję eskim_pl_post_count_load
pod akcję wp_footer
. Funkcja będzie oczywiście zwiększała licznik o jeden dla aktualnego posta – przy każdym odpaleniu.
Baza danych
Do trzymania informacji o ilości wyświetleń danego posta możemy wykorzystać bazę danych. Utwórzmy tabelę w trakcie aktywacji wtyczki. O akcji aktywującej pisałem tutaj – dystrybucja własnej wtyczki WordPress z prywatnego serwera
if ( !function_exists('eskim_pl_post_count_activate') ) :
function eskim_pl_post_count_activate() {
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
global $wpdb;
$table_name = $wpdb->prefix . 'eskim_pl_post_count';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
postId INT NOT NULL,
views INT
);";
dbDelta( $sql );
}
register_activation_hook ( __FILE__, "eskim_pl_post_count_activate" );
endif;
Kluczem głównym jest identyfikator posta. Informację o ilości wyświetleń trzymamy natomiast w kolumnie views
. Dodajmy teraz pobieranie i zwiększanie samego licznika.
if ( !function_exists('eskim_pl_post_count_set') ) :
function eskim_pl_post_count_set ($postId, $views=null) {
global $wpdb;
$table_name = $wpdb->prefix . 'eskim_pl_post_count';
if ($views == 0) {
$wpdb->insert( $table_name,
[
'postId' => $postId,
'views' => 1
]);
} else {
$wpdb->update( $table_name, ['views' => $views], ['postId' => $postId]);
}
}
endif;
if ( !function_exists ('eskim_pl_post_count_get') ) :
function eskim_pl_post_count_get ($postId) {
global $wpdb;
$table_name = $wpdb->prefix . 'eskim_pl_post_count';
$query = $wpdb->prepare ("
SELECT views
FROM $table_name
WHERE postId = %d",
$postId
);
$result = $wpdb->get_var ($query);
if ($result === null) return 0;
return $result;
}
endif;
if ( !function_exists('eskim_pl_post_count_inc') ) :
function eskim_pl_post_count_inc($postId) {
global $wpdb;
$views = eskim_pl_post_count_get ($postId);
eskim_pl_post_count_set ($postId, $views+1);
}
endif;
Powyżej stworzyliśmy 3 funkcje:
eskim_pl_post_count_set
– funkcja aktualizuje licznik dla danego postaeskim_pl_post_count_get
– funkcja pobiera licznik dla danego posta (zwraca zero jeżeli posta nie ma w bazie)eskim_pl_post_count_inc
– funkcja korzysta z dwóch poprzednich do zwiększania licznika odwiedzin
Ostatnią funkcję możemy teraz podpiąć pod utworzoną akcję. Wykorzystamy przy tym funkcję get_the_ID()
, która zwraca identyfikator aktualnego posta.
if ( !function_exists('eskim_pl_post_count_load') ) :
function eskim_pl_post_count_load()
{
eskim_pl_post_count_inc (get_the_ID());
}
add_action( 'wp', 'eskim_pl_post_count_load' );
endif;
Widżet
Widżety pozwalają na dodanie elementu do strony bez bezpośredniej edycji kodu. Aby utworzyć widżet w WordPressie korzystamy z klasy WP_Widget
. W konstruktorze podajemy nazwę widżetu, a w metodzie widget
zwracany kod. Całość podpinamy pod akcję widgets_init
.
if (!class_exists('eskim_pl_post_count_widget')):
class eskim_pl_post_count_widget extends WP_Widget {
public function __construct() {
$widget_ops = array(
'classname' => 'eskim_pl_post_count_widget',
'description' => 'Licznik wyświetleń',
);
parent::__construct( 'eskim_pl_post_count_widget', 'Licznik wyświetleń', $widget_ops );
}
public function widget( $args, $instance ) {
echo eskim_pl_post_count_get ( get_the_ID() );
}
}
add_action( 'widgets_init', function(){
register_widget( 'eskim_pl_post_count_widget' );
});
endif;
Tak utworzony widżet możemy dodać do strony za pomocą menu Wygląd -> Widżety
Czyszczenie
Utworzyliśmy bazę, która jednak powinna zostać usunięta w momencie odinstalowywania wtyczki przez użytkownika. Proces czyszczenia możemy umieścić w pliku uninstall.php
, albo dodać odpowiedni hook:
if ( !function_exists('eskim_pl_post_count_clear') ) :
function eskim_pl_post_count_clear() {
global $wpdb;
$table_name = $wpdb->prefix . 'eskim_pl_post_count';
$sql = "DELETE * FROM $table_name";
return $wpdb->query ($sql);
}
register_uninstall_hook(
__FILE__,
'eskim_pl_post_count_clear'
);
endif;
Tradycyjnie kod na GitHub.
Podsumowanie
- Licznik podpinamy pod akcję
wp_footer
pod warunkiem, że nie jesteśmy w panelu administratora. - Ilość wyświetleń zapisujemy w bazie danych.
- Aby dodać widżet rozszerzamy klasę
WP_Widget
. - Usuwamy tabelę z bazy w momencie odinstalowywania wtyczki.