Anzahl Seitenaufrufe als Beitragsspalte im WordPress Admin

Schon lange hatte ich die Idee die Tabelle „Beiträge“ im Backend von WordPress, um die Spalte „Aufrufe“ zu erweitern um dort die Seitenaufrufe der einzelnen Artikel zu zählen. Das Ganze sollte mein bisher genutztes Plugin Statify ersetzen. Quasi „Statify light“. Ich habe es verwirklicht. Seit ein paar Tagen werkelt das Code-Snippet.

Dieser Artikel wurde überarbeitet. Das Original ist vom August 2020. Die Funktion wurde seither überarbeitet. Die aktuelle Version zählt Seitenaufrufe des Blogbetreibers nicht mehr mit. Ich nutze dafür die Funktion current_user_can(). Ebenfalls neu ist admin_url(). Er ersetzt den Link https://horstscheuer.de/wp-admin/.

Der Dreh- und Angelpunkt dieses Snippets sind Codezeilen der Seite MEDUO. Dort bietet man eine PHP-Klasse an, die die Seitenaufrufe zählt und das Ganze als Custom Field in der Datenbank-Tabelle wp_postmeta speichert. Für jeden Artikel wird dort der Meta_Key post_views_count angelegt, der die Anzahl Seitenaufrufe speichert. Die Seite baut Ausgabe dieser Seitenaufrufe im Artikel selbst ein. Dafür ist es nötig die Zeile Post_Views::increment_post_views( get_the_ID() ); in den WordPress-Loop einzubauen.

class Post_Views {
  const KEY = 'post_views_count';
  
  private static function get_post_views_count($post_id) {
    return get_post_meta($post_id, self::KEY, true);
  }

  public static function get_post_views($post_id) {
    $count = self::get_post_views_count($post_id);
    $count = $count === '' ? 0 : $count;
    return $count;
  }

  public static function increment_post_views($post_id) {
    if ( current_user_can( 'edit_post', $post_id ) ) {
     return false;
    }

    $count = self::get_post_views_count($post_id);
    if($count === '') {
      delete_post_meta($post_id, self::KEY);
      add_post_meta($post_id, self::KEY, '1');
    } else { 
      $count++;
      update_post_meta($post_id, self::KEY, $count);
    }
  }
}

Ich selbst erweitere die Tabelle „Beiträge“ um die Spalte „Aufrufe“. Wobei sich das hier einfach anhört. Ist es aber nicht. Im Web sind dafür nur ganz wenige Code-Snippets zu finden. Nachfolgende Zeilen sind das Ergebnis tagelanger Recherche.

function add_postviews_column( $columns ) {
  $new_columns = array( 'postviews' =>  __( '<a href="' . admin_url ('edit.php?orderby=postviews&order=desc', 'https')  . '"><span class="postviews-bubble" title="Aufrufe"> <span class="screen-reader-text">Aufrufe</span></span></a>' ),  );
  return array_merge( $columns, $new_columns );
}
add_filter( 'manage_posts_columns', 'add_postviews_column', 5 );

function display_postviews_column( $column_name ) {
  switch( $column_name ) {
    case 'postviews':
    echo Post_Views::get_post_views( get_the_ID() ); 
  }
}
add_action( 'manage_posts_custom_column', 'display_postviews_column', 5, 2 );

function sort_postviews_column( $columns ) {
  $columns['postviews'] = 'post_views_count';
  return $columns;
}
add_filter( 'manage_edit-posts_sortable_columns', 'sort_postviews_column' );

function orderby_postviews_column( $query ) {
  if ( ! is_admin() )
  return;
  
  $orderby = $query->get( 'orderby');
  
  if ( 'postviews' == $orderby ) {
    $query->set( 'meta_key', 'post_views_count' );
    $query->set( 'orderby', 'meta_value_num' );
  }
}
add_action( 'pre_get_posts', 'orderby_postviews_column' );

Wobei die ersten beiden Funktionen für die Darstellung sorgen und die letzten drei dafür sorgen, dass man die Tabelle sortieren kann. Einziger Nachteil: Meine Lösung sortiert nur in eine Richtung.

Was jetzt noch fehlt ist etwas CSS um die Spalte „Aufrufe“ der Beitragstabelle zu formatieren. Der nachfolgende CSS-Code begrenzt die neue Spalte auf 3.5em und richtet die Inhalte im normalen Modus rechts aus. Anstatt das Wort „Aufrufe“ in der Spaltenüberschrift nutze ich ein Dashicon.

.fixed .column-postviews {
  width: 3.5em;
  padding: 8px 8px;
  text-align: right;
}

th .postviews-bubble:before {
  content: "\f184";
  font: normal 20px/.5 dashicons;
  speak: never;
  display: inline-block;
  padding: 0;
  top: 4px;
  left: 4px;
  position: relative;
  vertical-align: top;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-decoration: none!important;
  color: #3c434a;
}

@media screen and (max-width: 782px) {
  .fixed .column-postviews {
    text-align: left;
  }  
}

Wichtig: Ich habe dieses Snippets, hier in diesem Blog, getestet. Bei mir läuft es fehlerfrei. Ihr solltet, falls ihr meinen Code nutzt, trotzdem vorsichtig sein. Ich empfehle eine Sicherung der Datei, die ihr ändert und auch der gesamten Installation, bevor ihr den Code-Schnipsel bei euch einbaut.