WordPress Pages and Posts Counter Snippets

Paste the code below at Code Snippets

/**
 * Simple Page & Post View Counter
 *
 * - Counts views on individual Pages and Posts
 * - Does not count logged-in administrators
 * - Adds a "Views" column to Pages and Posts admin screens
 * - Makes the Views column sortable
 */


/* =========================================================
 * 1. COUNT PAGE / POST VIEWS
 * ========================================================= */

add_action('wp', function () {

    // Only count normal front-end single Pages and Posts
    if (!is_singular(array('post', 'page'))) {
        return;
    }

    // Don't count previews
    if (is_preview()) {
        return;
    }

    // Don't count administrators
    if (
        is_user_logged_in() &&
        current_user_can('manage_options')
    ) {
        return;
    }

    $post_id = get_queried_object_id();

    if (!$post_id) {
        return;
    }

    $meta_key = '_simple_page_views';

    $views = (int) get_post_meta(
        $post_id,
        $meta_key,
        true
    );

    update_post_meta(
        $post_id,
        $meta_key,
        $views + 1
    );

});


/* =========================================================
 * 2. ADD "VIEWS" COLUMN TO PAGES
 * ========================================================= */

add_filter('manage_pages_columns', function ($columns) {

    $new_columns = array();

    foreach ($columns as $key => $label) {

        $new_columns[$key] = $label;

        // Put Views immediately after Title
        if ($key === 'title') {
            $new_columns['simple_views'] = 'Views';
        }
    }

    return $new_columns;

});


/* =========================================================
 * 3. ADD "VIEWS" COLUMN TO POSTS
 * ========================================================= */

add_filter('manage_posts_columns', function ($columns) {

    $new_columns = array();

    foreach ($columns as $key => $label) {

        $new_columns[$key] = $label;

        // Put Views immediately after Title
        if ($key === 'title') {
            $new_columns['simple_views'] = 'Views';
        }
    }

    return $new_columns;

});


/* =========================================================
 * 4. DISPLAY VIEW COUNT
 * ========================================================= */

add_action(
    'manage_pages_custom_column',
    'simple_show_view_count',
    10,
    2
);

add_action(
    'manage_posts_custom_column',
    'simple_show_view_count',
    10,
    2
);

function simple_show_view_count($column, $post_id) {

    if ($column !== 'simple_views') {
        return;
    }

    $views = (int) get_post_meta(
        $post_id,
        '_simple_page_views',
        true
    );

    echo '<strong>' .
        esc_html(number_format_i18n($views)) .
        '</strong>';
}


/* =========================================================
 * 5. MAKE VIEWS COLUMN SORTABLE
 * ========================================================= */

add_filter('manage_edit-page_sortable_columns', function ($columns) {

    $columns['simple_views'] = 'simple_views';

    return $columns;

});


add_filter('manage_edit-post_sortable_columns', function ($columns) {

    $columns['simple_views'] = 'simple_views';

    return $columns;

});


/* =========================================================
 * 6. HANDLE SORTING BY VIEWS
 * ========================================================= */

add_action('pre_get_posts', function ($query) {

    if (!is_admin() || !$query->is_main_query()) {
        return;
    }

    if ($query->get('orderby') === 'simple_views') {

        $query->set(
            'meta_key',
            '_simple_page_views'
        );

        $query->set(
            'orderby',
            'meta_value_num'
        );
    }

});
Copyright © 2026 Siam Naulak.
magnifiercrossmenu