Dieser Artikel ist wirklich nichts für Anfänger und es sollte möglichst lokal unter xampp oder webserver getestet werden, bevor man produktiv damit arbeiten will! Das ist und war mal ein sehr interessantes Projekt um mit einem Custom Theme ein Intranet zu erstellen.
Achtung! Das wird ein sehr sehr langer Artikel.
Dabei ist es nicht nur interessant einfach nur nicht angemeldeten den Zugang zu sperren, sondern auch den Benutzern den Zugang zu gewissen Bereichen zu verwehren.
Inhalt:
Einleitung
Ich nehme mal folgende Ausgangssituation:
- Anmeldung für alle.
- Ein Benutzer für alle.
- Ein Benutzer für eine bestimmte Gruppe.
- Ein getrennter Bereich für diese Gruppe, die auch alles andere sehen darf.
Insgesamt haben wir 8 Kategorien und 2 Seiten. Davon sind jeweils die Hälfte öffentlich und die andere Hälfte nur der Gruppe zugänglich.
Jetzt fragt man sich natürlich: "Wozu braucht man das denn bitte?" Naja, weil WordPress sowas kann. Ich versuche es mit minimalem Design und bestem Wissen zu erläutern.
Ich habe selbst tagelang Recherchiert und Foren durchstöbert, sodass ich wenn überhaupt nur einen kleinen Teil von Quellangaben liefern kann.
Also legen wir los:
In unserer Ausgangssituation haben wir einfach mal folgendes:
Das Design steht fest und wir sind dabei nun alles einzurichten.
Als erstes brauchen wir zwei Plugins, die leider unumgänglich für dieses vorhaben sind:
Allow Multiple Accounts und User GroupsErsteres wird dazu genutzt, dass mehrere Benutzer z.B. dieselbe E-Mail Adresse benutzen dürfen. Letzteres erstellt eine neue Taxonomie die als Gruppe definiert wird.
Insgesamt haben wir 5 Benutzer (Alle Daten sind frei erfunden) und 2 Gruppen:
Gruppen:
- marketing
- coworker
Benutzer -> Rolle -> Gruppe -> mailadresse
- Admin -> Administrator -> marketing -> marketing@wasauchimmer.com
- Marketing -> Autor -> marketing -> marketing@wasauchimmer.com
- Mitarbeiter -> Abonnent -> coworker -> mitarbeiter@wasauchimmer.com
- Max Mustermann ->Mitarbeiter -> marketing -> marketing@wasauchimmer.com
- Sven Müller -> Abonnent -> marketing -> sven.mueller@wasauchimmer.com
Daraus ergibt sich folgendes Schema:
- Admin darf alles ist ja logisch.
- Der User Marketing darf Artikel schreiben und diese auch bearbeiten. Er hat aber keine Berechtigung die Artikel anderer zu bearbeiten. Der Benutzer ist z.B. für mehrere Leute gedacht.
- Unser Mitarbeiter wird nur lesen können, was später für ihn sichtbar sein soll. Wenn das halbe Unternehmen z.B. sich damit einloggt.
- Der Max kann zwar Artikel erstellen, diese müssen aber vorher genehmigt werden. Wenn es sich z.B. um Azubis oder Praktikanten handelt.
- Der Sven hat keine besonderen Rechte, außer das er die Inhalte vom Marketing mitlesen kann, weil er in einer Führungsposition ist.
Es wird abartig viel in der functions.php gearbeitet und es wird auch abartig viel mit php gearbeitet. Aber irgendwann muss man mal anfangen.
Da wir hauptsächlich mit IDs arbeiten für die Kategorien ergibt sich folgendes Schema:
- Kategorien mit der ID 1,2,3,4 sind für alle sichtbar.
- Kategorien mit der ID 5,6,7,8 sind nur für Mitglieder der Gruppe Marketing sichtbar.
Da wir alles natürlich auch ordentlich machen wollen, müssen wir im klaren sein was wir alles anzeigen lassen wollen und was nicht: Wir wollen außer den Artikeln natürlich noch:
- Archive
- Kommentare
- Tags
- Suchfunktion
Auch hier sollen bei klick auf die Funktionen die gesperrten Artikel für Nichtmitglieder ausgeblendet werden.
Custom Login erstellen:
Zuerst legen wir uns eine neue Datei an: page-login.php. Im Backend erstellen wir eine neue Seite namens "login" und schauen auch, dass der Permalink auf /login endet.
in der page-login.php erstellen wir folgenden code:
<?php get_header(); ?> <?php get_sidebar(); ?> <!--Code--> <div class="entry"> <div class="login"> <h1><u>Anmelden:</u></h1> <?php $login = (isset($_GET['login']) ) ? $_GET['login'] : 0; $logout = (isset($_GET['loggedout']) ) ? $_GET['loggedout'] : 0; if ( $login === "failed" ) { echo '<p class="login-msg-error"><strong>FEHLER:</strong> Ungültiger Benutzername und/oder Passwort.</p>'; } elseif ( $login === "empty" ) { echo '<p class="login-msg"><strong>Bitte geben Sie Ihren Benutzernamen und Kennwort ein:</strong>'; } elseif ( $login === "false" ) { echo '<p class="login-msg-info"><strong>Sie wurden erfolgreich ausgeloggt.</strong></p>'; } else { echo '<p class="login-msg"><strong>Bitte geben Sie Ihren Benutzernamen und Kennwort ein:</strong>'; } // hübsche redirects if ( $logout === "true" || $login === "empty" || $login === "failed") { $request = home_url(); } else { $request = site_url( $_SERVER['REQUEST_URI'] ); // kann auch in home_url(); geändert werden } $args = array( 'redirect' => $request, 'label_username' => __( 'Username' ), 'id_username' => 'user', 'id_password' => 'pass', 'remember' => true, 'value_remember' => false, ); wp_login_form( $args ); ?> </div> </div> <!--Code--> <?php get_footer(); ?>
Weitere Informationen:
https://codex.wordpress.org/Function_Reference/wp_login_form
how to build custom login page
redirect users
Damit haben wir jetzt erst einmal unser eigenes Login Template erstellt.
Begeben wir uns in die functions.php wo wir nun sicherstellen, wo die Benutzer nach der Anmeldung weitergeleitet werden und was bei der Abmeldung etc. passiert.
<?php /* Main redirection of the default login page */ function redirect_login_page() { $login_page = home_url('/login/'); $page_viewed = basename($_SERVER['REQUEST_URI']); if($page_viewed == "wp-login.php" && $_SERVER['REQUEST_METHOD'] == 'GET') { wp_redirect($login_page); exit; } } add_action('init','redirect_login_page'); /* Where to go if a login failed */ function custom_login_failed() { $login_page = home_url('/login/'); wp_redirect($login_page . '?login=failed'); exit; } add_action('wp_login_failed', 'custom_login_failed'); /* Where to go if any of the fields were empty */ function verify_user_pass($user, $username, $password) { $login_page = home_url('/login/'); if($username == "" || $password == "") { wp_redirect($login_page . "?login=empty"); exit; } } add_filter('authenticate', 'verify_user_pass', 1, 3); /* What to do on logout */ function logout_redirect() { $login_page = home_url('/login/'); wp_redirect($login_page . "?loggedout=true"); exit; } add_action('wp_logout','logout_redirect'); ?>
Damit wäre unser Login Template fertig.
Änderungen für index.php und single.php
Machen wir weiter mit der index.php:
Der folgende Code muss oben stehen, damit wird man direkt auf das 404 template geleitet, sollte man unerlaubter Weise auf eine der Kategorien kommen.
Er ist quasi die erste Absicherung gegen unerlaubten Zugriff.
<?php $user = wp_get_current_user(); $cat_query = get_queried_object(); if ($cat_query == NULL) { $category_id = 0; // This is because an archive Page has a queried ID of NULL. // It would result in a 404 if we do not define it as 0. } else{ $cat = $cat_query->cat_ID; } $group = is_object_in_term( $user->ID, 'user-group', 'marketing' ); if(($cat == 5 || $cat == 6 || $cat == 7 || $cat == 8) && $user != $group) // double brackets because AND operator is higher than OR { global $wp_query; $wp_query->set_404(); status_header( 404 ); get_template_part( 404 ); exit(); } elseif(is_user_logged_in()) { ?> <?php get_header(); ?> [...] <?php get_footer(); ?> <?php } ?> <?php }else{ global $wp_query; $wp_query->set_login(); status_header( 'login' ); get_template_part( 'page', 'login' ); exit(); } ?>
Zur Erklärung: Wir prüfen nicht nur, ob der User berechtigt ist, dieses zu sehen, wir schützen auch noch den externen Zugriff in dem wir nicht eingeloggte User direkt auf unsere page-login.php verweisen. Im Prinzip habe ich den Code den ich mir von Stackoverflow für den 404 redirect geholt habe einfach nur abgeändert.
get_template_part();
404 redirect
Etwas ähnliches müssen wir vor den Header der single.php schreiben:
<?php $user = wp_get_current_user(); $categories = get_the_category(); foreach ($categories as $category){ $cat = $category->term_id; } $group = is_object_in_term( $user->ID, 'user-group', 'marketing' ); if(($cat == 5 || $cat == 6 || $cat == 7 || $cat == 8) && $user != $group) { global $wp_query; $wp_query->set_404(); status_header( 404 ); get_template_part( 404 ); exit(); } elseif(is_user_logged_in()) { ?> <?php get_header(); ?> [...] <?php get_footer(); ?> <?php } ?> <?php }else{ global $wp_query; $wp_query->set_login(); status_header( 'login' ); get_template_part( 'page', 'login' ); exit(); } ?>
Damit wären wir mit der single.php fertig.
Änderungen für tag.php, page.php, search.php und 404.php
Für alle drei Dateien sollte folgendes geändert werden:
<?php if(is_user_logged_in()) { ?> <?php get_header(); ?> [...] Template <?php get_footer(); ?> <?php }else{ global $wp_query; $wp_query->set_login(); status_header( 'login' ); get_template_part( 'page', 'login' ); exit(); } ?>
Custom Loop für die index.php
Die index.php ist erst einmal das einfachste, da sie hauptsächlich für die Kategorien und Archive zum Anzeigen zuständig ist. Also im Prinzip alles was keine Seite ist, kein Schlagwort usw.
Die Änderungen machen wir an der Stelle, wo der Loop einsetzt und setzen hier verschiedene if/else Abfragen, ob die Artikel die in diesen Kategorien für Benutzer sichtbar sein sollen, oder eben nicht.
<?php $current_user = wp_get_current_user(); if (is_user_logged_in() && is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { global $query_string; // required $posts = query_posts($query_string); } else{ global $query_string; // required $posts = query_posts($query_string.'&cat=-5,-6,-7,-8'); } if ( have_posts() ) :while(have_posts()) : the_post(); ?> <div class="entry"> <?php the_title();?> <?php the_content(); ?> </div> <?php endwhile; ?> <?php wp_reset_query(); ?> <?php endif; ?>
Das war es. Nicht verwirren lassen. Für die unterschiedlichen Abfragen muss man die Kategorie manchmal normal und manchmal mit minus angeben. Da es so viele unterschiedliche Abfragen sind, habe ich bisher keine Allgemeinmedizin dafür finden können. Aber solange es tut ist mir das auch ehrlich gesagt egal.
Änderungen für die page.php
Im Prinzip kann man den selben Code nehmen für die index.php.
In meinem Artikel WordPress Tipps und Tricks - Inhalte auf statischen Seiten habe ich ja schon kurz erklärt, wie ihr den Loop auf den Seiten ausgebt. Dort einfach dann den Loop anwenden. Wenn die Seite eh privat ist dann ist das sowieso Wurst.
Machen wir uns einfach mal einen Spaß, weil wir ja die letzten 5 Artikel anzeigen lassen wollen, aber eben nicht aus diesen Kategorien.
<?php $current_user = wp_get_current_user(); if (is_user_logged_in() && is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { $recent = new WP_Query("showposts=5" ); } else{ $args_priv = array( 'cat' => '-5,-6,-7,-8', 'post_status' => 'publish', 'showposts' => 5, ); $recent = new WP_Query( $args_priv ); } while($recent->have_posts()) : $recent->the_post(); ?> <div class="entry"> <?php the_title();?> <?php the_excerpt(); ?> </div> <?php endwhile; wp_reset_postdata(); ?>
Wir hätten natürlich die Möglichkeiten alle unsere Beiträge auf privat zu setzen, aber wer will das denn schon? Also dachte ich mir einfach ich machen es mal Idiotensicher.
Die tag.php
Natürlich müssen wir uns diese Datei erst einmal erstellen, in unserem Theme Ordner. Für den Inhalt kann man sich an der index.php orientieren.
Diese wäre auch für die Anzeige der Schlagworte zuständig, nur haben wir jetzt halt eine eigene.
Ich muss schon sagen, diese war eine harte Nuss.
- Das perfide ist hier nicht uns den Inhalt auszugeben, sondern die Anzahl der gefunden Beiträge, je nachdem wer angemeldet ist.
Ich kommentiere einfach mal zwischen den Zeilen, sollte reichen.
<h3 class="page-title"> <?php $tag = get_queried_object(); $current_user = wp_get_current_user(); if (is_user_logged_in() && is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { /* Eine komplett neue query in der wir anhand der tag_id die in den Kategorien sind oder den entsprechenden Status haben anzeigen. Oder eben nicht.*/ $args_priv = array( 'post_status' => array( 'private','publish' ), 'tag_id' => $tag->term_id, ); } else{ $args_priv = array( 'post_status' => 'publish', 'tag_id' => $tag->term_id, 'cat' => '-5,-6,-7,-8', ); } $the_query = new WP_Query( $args_priv ); $count = $the_query->found_posts; echo $count; // Das sollte sich von alleine erklären. if($count == 1) { echo " Beitrag für Schlagwort: " , single_tag_title(); } else{ echo " Beiträge für Schlagwort: " , single_tag_title(); } wp_reset_query(); ?> </h3>
Custom Loop für die tag.php
Der Loop hier entscheidet sich dieses Mal essentiel von dem Standard. ging einfach nicht besser. Aber was tut, das sei bewährt.
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <?php $user = wp_get_current_user(); ?> <?php if ( in_category(array(5,6,7,8)) && $current_user != is_object_in_term( $current_user->ID, 'user-group', 'marketing' )) : ?> <?php else : ?> <h1><?php the_title(); ?></h1> <div class="entry"> <?php the_excerpt(); ?> </div> <?php endif; ?> <?php endwhile; ?> <?php endif; ?>
Die search.php
Prinzipiell gehen wir nach dem selben Schema vor wie in der tag.php. Mit dem Unterschied, dass unser Array anderst ist und ja, der Loop.
<h3> <?php $current_user = wp_get_current_user(); if (is_user_logged_in() && is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { $args2 = array( 'post_status' => array('publish','private'), 'post_type' => array('page','post'), 's' => $s, 'paged' => $paged, ); } else{ $args2 = array( 'cat' => '-5,-6,-7,-8', 's' => $s, 'post_type' => array('page','post'), 'paged' => $paged, ); } $allsearch = new WP_Query( $args2 ); $count = $allsearch->found_posts; echo $count . ' '; wp_reset_query(); if($count == 1) { _e( 'Ergebnis gefunden für', 'locale' ); } else{ _e( 'Ergebnisse gefunden für', 'locale' ); } ?>: "<?php the_search_query(); ?>"</h3>
Für unseren Loop bedienen wir uns dieses Mal einfach an dem Array:
<?php $recent = new WP_Query( $args2 ); if ($recent->have_posts()) : while($recent->have_posts()) : $recent->the_post(); ?> <h2><?php the_title(); ?></h2> <div class="entry"> <?php the_excerpt(); ?> </div> <?php endwhile; ?> <?php wp_reset_query();?> <?php else : ?> <p>Nichts gefunden</p> <?php endif; ?>
Sidebar: Öffentliche Kategorien ausgeben
So hier gehen wir mal wieder ins Detail. Wir wollen uns nicht nur die Kategorien ausgeben lassen, sondern auch wieviele Artikel jeweils existieren.
Das ganze hauen wir vielleicht am besten in die sidebar.php hinein.
Aber bevor wir beginnen hier einmal die Struktur, ohne die natürlich mal wieder überhaupt nichts geht:
<?php if (is_user_logged_in()) { ?> /* Inhalt */ <?php } else { echo ""; } ?>
So damit hätten wir unseren Inhalt erstmal vor neugierigen Augen geschützt. Alles weitere sollte an die Stelle kommen wo "Inhalt" steht.
Im Prinzip ist es so: Im ersten Teil, wenn ein Benutzer der Gruppe eingeloggt ist, soll er alle Beiträge sehen können, die auch für andere sichtbar ist, bzw. die Aufzählung.
Irgendjemand hat jetzt aber einen Artikel dieser Kategorie privat gemacht, dann vergewissern wir uns einfach nur, dass auch dieser richtig mitgezählt wird.
Im zweiten Teil zeigen wir uns die Anzahl der Artikel der jeweiligen Kategorie an. Da es für unseren eingeloggten benutzer schwieriger ist es über show_count" zu machen, musste ich hier es mit einer foreach Schleife lösen. Das Ergebnis kann sich aber sehen lassen. In der else Abfrage ist es dann ganz simpel: Wer nicht eingeloggt ist sieht nichts aus der Kategorie und auch nichts was privat ist.
<div id="categories"> <h2>Kategorien:</h2> <?php $current_user = wp_get_current_user(); if (is_user_logged_in() && is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { $args_priv = array( 'cat' => '-5,-6,-7,-8', 'post_status' => array( 'private','publish' ), ); $the_query = new WP_Query( $args_priv ); $count = $the_query->found_posts; $numberofcats = wp_count_terms('category', array( 'exclude' => array( 5,6,7,8 ), ) ); echo "".$count." Artikel in ".$numberofcats. " Kategorien:
"; $args = array( 'exclude' => array( 5,6,7,8 ), //categories that contains the private articles 'title_li' => '', 'show_count' => 0, 'hide_empty' => 0, ); $categories = get_categories($args); foreach($categories as $category) { $args_priv = array( 'cat' => $category->term_id, 'post_status' => array( 'private','publish' ), ); $the_query = new WP_Query( $args_priv ); $count = '('. $the_query->found_posts.')'; echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name.'</a> '.$count.'
'; } } else{ $args_priv = array( 'cat' => '-5,-6,-7,-8', 'post_status' => 'publish', ); $the_query = new WP_Query( $args_priv ); $count = $the_query->found_posts; $numberofcats = wp_count_terms('category', array( 'exclude' => array( 5,6,7,8 ), ) ); echo "".$count." Artikel in ".$numberofcats. " Kategorien:
"; echo '
- ';
wp_list_categories( array(
'exclude' => array( 5,6,7,8 ),
'title_li' => '',
'show_count' => 1,
'hide_empty' => 0,
) );
echo '
Denkanstöße: count posts with custom post type
Sidebar: Interne Bereiche anzeigen
Hier hab ich ein ganz schönes schmankerl: Nachdem nun unsere Bereiche vor der Öffentlichkeit gesichert sind, wollen wir natürlich auch wissen was in unseren Kategorien so abgeht.
Zur Erklärung: Im Prinzip wurde hier auch nur das snippet von oben genommen und entsprechend angepasst. Aus einem exclude wurde include und der Bereich wird auch nur sichtbar, wenn jemand der Gruppe sich einloggt.
<?php if (is_user_logged_in()) { $current_user = wp_get_current_user(); if (is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { echo '<div id="intern">'; echo '<h2>Intern:</h2>'; //$count_posts = wp_count_posts(); $args_priv = array( 'cat' => '5,6,7,8', 'post_status' => array( 'private','publish' ), ); $the_query = new WP_Query( $args_priv ); $count = $the_query->found_posts; $numberofcats = wp_count_terms('category', array( 'include' => array( 5,6,7,8 ), ) ); echo "".$count." Artikel in ".$numberofcats. " Kategorien:
"; echo '<br />'; $args = array( 'include' => array( 5,6,7,8 ), //categories that contains the private articles 'title_li' => '', 'show_count' => 0, 'hide_empty' => 0, ); $categories = get_categories($args); foreach($categories as $category) { $args_priv = array( 'cat' => $category->term_id, 'post_status' => array( 'private','publish' ), ); $the_query = new WP_Query( $args_priv ); $count = '('. $the_query->found_posts.')'; echo '<a href="' . get_category_link( $category->term_id ) . '">' . $category->name.'</a> '.$count.'<br />'; } echo '</div>'; } else{ echo ""; } } ?>
Sidebar: Aktuelle Benutzerinfo ausgeben:
Wer sich anmeldet will sich ja auch irgendwann wieder abmelden?! Nun folgenden Code unterhalt einfügen:
<?php if (is_user_logged_in()) { $user = wp_get_current_user(); echo '<div>'; echo __('Willkommen') . ' <strong>' . $user->display_name . '!</strong> <br />'; wp_loginout(); echo '</div>'; } ?> <?php } else { echo ""; } ?>
Wer nun noch Informationen mit den letzten Kommentaren möchte und wie man die Kommentare der privaten Kategorien ausblendet, der möge sich melden oder auf premium upgraden 😛
Benutzerrechte vergeben
Wir sagten ja, dass die Benutzer Marketing, Max und Sven auch in unserer Gruppe sind und Zugriffe auf privates haben wollen.
Nehmen wir mal an Marketing hat laut dem Backend die User-ID "2", Max hat die "3" und Sven hat die "4"
In der functions.php müssen wir dann folgende Zeilen hinzufügen:
$rolemarketing = new WP_User( 2 ); $rolemarketing->add_cap( 'read_private_pages' ); $rolemarketing->add_cap( 'read_private_posts' ); $rolemarketing->add_cap( 'unfiltered_html' ); $roleMax = new WP_User( 3 ); $roleMax->add_cap( 'read_private_pages' ); $roleMax->add_cap( 'read_private_posts' ); $roleMax->add_cap( 'upload_files' ); $roleMax->add_cap( 'edit_published_posts' ); $roleSven = new WP_User( 4 ); $roleSven->add_cap( 'read_private_pages' );
Damit kann Sven zwar private Seiten lesen, aber keine privaten Artikel, falls die Abteilung doch Geheimnisse hat 😉
Nützliche Tipps und Nacharbeiten
Dashboard und Adminbar ausblenden für Mitarbeiter
In der functions.php:
function remove_dashboard_meta() { $user = wp_get_current_user(); if ($user != is_object_in_term( $user->ID, 'user-group', 'marketing' ) ) { remove_meta_box( 'dashboard_activity', 'dashboard', 'normal');//since 3.8 } } add_action( 'admin_init', 'remove_dashboard_meta' ); function hide_admin_bar() { $user = wp_get_current_user(); if ($user != is_object_in_term( $user->ID, 'user-group', 'marketing' )) { show_admin_bar(false); } } add_action('init', 'hide_admin_bar' ); function hide_admin_bar1() { $user = wp_get_current_user(); if ($user->ID == 4) { show_admin_bar(false); } } add_action('init', 'hide_admin_bar1' );
Shortlink für das Backend:
Wo ihr das halt haben wollt, zum Beispiel unter "Meta":
<?php $current_user = wp_get_current_user(); if (is_user_logged_in() && is_object_in_term( $current_user->ID, 'user-group', 'marketing' ) ) { echo '<a style="color:black; text-decoration:none;" href="',admin_url(),'">Administration</a>'; } elseif(is_user_logged_in() && $current_user != is_object_in_term( $current_user->ID, 'user-group', 'marketing' )) { echo ""; } else { echo ""; } ?>
Namen des Kommentators ändern
Das beste kommt wohl zum Schluss: Wenn man sich einloggt und einen Kommentar schreibt, kommentiert man immer als der aktuell eingeloggte Benutzer.
In diesem Fall haben wir das einfach mal deaktviert und eine Funktion erstellt, die genau das verhindert.
Unser Benutzer Mitarbeiter hat die User-ID 6 und nur wenn dieser Benutzer eingeloggt ist, wird exakt das ausgegeben, was man in das Name-Feld schreibt.
Dazu bitte einmal in die functions.php:
function change_author( $commentdata ) { if ( $commentdata['user_ID'] == 6 ) { $commentdata['user_ID'] = 0; $commentdata['comment_author'] = $_POST['author']; $commentdata['comment_author_email'] = ''; $commentdata['comment_author_url'] = ''; } return $commentdata; } add_filter( 'preprocess_comment' , 'change_author' );
Probierts aus, es tut 😉
So ich hoffe ich habe wirklich nichts vergessen. Falls doch tue ich es einfach hinzufügen. Sollte überhaupt jemals, jemand über diesen Artikel stolpern, dann wäre ein bisschen Feedback schon ganz geil.