W świecie cyfrowym, gdzie treść jest królem, ważne jest, aby móc mierzyć zaangażowanie odbiorców. Licznik wyświetleń posta to prosty, ale efektywny sposób na śledzenie, jak często użytkownicy odwiedzają Twoje strony. Dzięki WordPressowi, platformie, która zasilana jest przez ogromną społeczność twórców i programistów, możesz łatwo dodać taką funkcjonalność do swojego bloga czy strony internetowej. W tym artykule przedstawiamy, jak krok po kroku stworzyć prosty plugin do liczenia wyświetleń, korzystając z natywnych funkcji WordPressa i trochę jQuery. Oto co znajdziesz w naszym przewodniku:

Struktura

/plugins/19s-view-counter/view-counter.php
/plugins/19s-view-counter/js/ajax-view-counter.js

Plik: ajax-view-counter.js

jQuery(document).ready(function($) {
    var postId = post_data.post_id;
    console.log(postId);
    $.ajax({
        url: post_data.ajax_url,
        type: 'POST',
        data: {
            action: 'count_views',
            post_id: postId,
            security: post_data.nonce
        },
        success: function(response) {
            console.log('Licznik wyświetleń zaktualizowany: ' + response);
        },
        error: function(error) {
            console.log('Błąd aktualizacji licznika wyświetleń', error);
        }
 });
});

Plik: view-counter.php

<?php
/*
Plugin Name: 19s: View Counter
Plugin URI: https://19stopni.pl
Description: Wtyczka zlicza wyświetlenia danej podstrony i wyświetla liczbę za pomocą shortcode.
Version: 1.0
Author: N04H
Author URI: https://19stopni.pl
*/

// Funkcja do rejestrowania skryptu JavaScript i lokalizacji danych z PHP do JS
function enqueue_ajax_script() {
    // Dodanie skryptu JS, zależny od jQuery, do footer'a
    wp_enqueue_script('ajax-view-counter', plugin_dir_url(__FILE__) . 'js/ajax-view-counter.js', array('jquery'), null, true);
    // Przekazanie danych z PHP do JavaScript (np. URL do AJAX, nonce dla bezpieczeństwa)
    wp_localize_script('ajax-view-counter', 'post_data', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('ajax-nonce'),
        'post_id' => get_the_ID()
    ));
}
// Rejestracja funkcji do działania na hook'u wp_enqueue_scripts
add_action('wp_enqueue_scripts', 'enqueue_ajax_script');

// Funkcja obsługująca zliczanie wyświetleń za pomocą AJAX
function ajax_count_page_views() {
    // Sprawdzenie poprawności nonce
    check_ajax_referer('ajax-nonce', 'security');
    // Pobranie ID postu z POST
    $post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;

    // Inkrementacja i zapis liczby wyświetleń jeśli post_id jest większe niż 0
    if($post_id > 0) {
        $current_views = get_post_meta($post_id, 'views', true);
        $current_views = (!empty($current_views)) ? $current_views : 0;
        $current_views++;
        update_post_meta($post_id, 'views', $current_views);
        
        echo $current_views;
    }
    // Zakończenie skryptu
    wp_die();
}
// Rejestracja funkcji AJAX dla zalogowanych i niezalogowanych użytkowników
add_action('wp_ajax_nopriv_count_views', 'ajax_count_page_views');
add_action('wp_ajax_count_views', 'ajax_count_page_views');

// Funkcja do wyświetlania liczby wyświetleń w formie tekstowej
function show_views() {
    global $post;
    $views = get_post_meta($post->ID, 'views', true);
    // Ustawienie liczby wyświetleń na 0, jeśli nie jest ustawiona
    if(!isset($views) OR empty($views)) {
        return "0 wyświetleń";
    }
    // Dopasowanie odpowiedniej formy liczby mnogiej
    $last_digit = $views % 10;
    $last_two_digits = $views % 100;
    if($views == 1) {
        $text = 'wyświetlenie';
    } elseif(($last_digit >= 2 && $last_digit <= 4) && !($last_two_digits >= 12 && $last_two_digits <= 14)) {
        $text = 'wyświetlenia';
    } else {
        $text = 'wyświetleń';
    }
    return $views.' '.$text;
}
// Rejestracja shortcode, który wyświetla liczbę wyświetleń
add_shortcode('show_views', 'show_views');

// Dodawanie meta boxa w panelu administracyjnym
function add_views_meta_box() {
    add_meta_box('post_views', 'Liczba wyświetleń', 'views_meta_box_callback', 'post', 'side', 'high');
}
add_action('add_meta_boxes', 'add_views_meta_box');

// Callback dla meta boxa, wyświetla aktualną liczbę wyświetleń
function views_meta_box_callback($post) {
    wp_nonce_field('save_views_meta', 'views_meta_box_nonce');
    $views = get_post_meta($post->ID, 'views', true);
    echo '<label for="post_views_field">Liczba wyświetleń:</label>';
    echo '<input type="number" id="post_views_field" name="post_views_field" value="' . esc_attr($views) . '" />';
}

// Funkcja do zapisywania danych z meta boxa
function save_views_meta_box_data($post_id) {
    if (!isset($_POST['views_meta_box_nonce']) || !wp_verify_nonce($_POST['views_meta_box_nonce'], 'save_views_meta')) {
        return;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    if (isset($_POST['post_views_field']) && is_numeric($_POST['post_views_field'])) {
        update_post_meta($post_id, 'views', $_POST['post_views_field']);
    }
}
// Rejestracja funkcji zapisującej dane do zdarzenia save_post

add_action('save_post', 'save_views_meta_box_data');

Wyświetlenie w treści posta:

Użyj wbudowanej funkcji „/shortcode”, a następnie dodaj:

[show_views]

Wyświetlenie w plikach szablonu:

echo do_shortcode('[show_views]');

Pliki do pobrania:

Leave a Reply

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *