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.

Beiträge im WordPress Backend
Beitragsansicht im WordPress Backend

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) {
    $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="https://horst-scheuer.de/wp-admin/edit.php?orderby=postviews&order=desc">Aufrufe</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.