Inhalte nur für angemeldete Nutzer


Frage: Ich möchte gerne Blogbeiträge exklusiv nur angemeldeten Besuchern zugänglich machen, die üblichen Mitglieder-Plugins sind mir jedoch zu komplex. Geht das auch über eine benutzerdefinierte Beitragsart?

Die benutzerdefinierte Beitragsart kannst du bequem mit dem Plugin Custom Post Type UI anlegen. Dabei solltest du die neue Beitragsart von der Suche ausschließen, damit die Vertraulichkeit gewährt bleibt.

Anschließend kannst du zur Ausgabe dieser Beitragsart eine neue Seite einrichten, die wir hier „Intern“ nennen.

Für diese Seite erstellen wir in einem Child Theme ein eigenes Template, dass auf Grund der in WordPress eingebauten Template Hierarchie automatisch verwendet wird, wenn wir im Template den richtigen Slug (titelbezogenen Teil der URL) verwenden: page-intern.php. Den Inhalt des Templates kopieren wie aus einem bestehenden Template page.php (bzw., wenn das nicht existiert, index.php).

Damit auf dieser Seite nur für angemeldete Besucher Inhalte ausgegeben werden, betten wir die Ausgabe (Loop) in das Conditional Tag is_user_logged_in():

<?php
/*
 * <page-intern.php>
 */
if ( is_user_logged_in()  ) {
  if ( have_posts() ) {
    while ( have_posts() ) {
      the_post(); 

echo '<h2>'; the_title(); echo '</h2>;
the_content();

    } // end while
  } // end if (Loop)

} else {
  echo 'Schade, Infos nur für angemeldete Benutzer.';
}

Damit die Template-Hierarchie greift, erfolgt der Abruf der Inhalte schon, bevor das Template geöffnet wird. Wird im Template eine weitere Abfrage hinzugefügt, um speziell die benutzerdefinierte Beitragsart abzurufen, werden die Ergebnisse ohne weitere Verwendung verworfen, was sich negativ auf die Performance auswirkt. Besser ist es, bereits die erste Abfrage anzupassen. Dies erfolgt über den Action Hook `pre_get_posts`, dem in der functions.php eine zusätzliche Anweisung zugewiesen wird:

<?php
/*
* <functions.php>
* Anzeige der benutzerdefinierten Beitragsart "vertraulich"
* auf der Webseite "Intern"
*/
add_action( 'pre_get_posts', 'get_my_post_type' );
function get_my_post_type( $query ) {
  // Check if on frontend and main query is modified
  if( is_page( 'intern' ) && $query->is_main_query() ) {
    $query->set( 'post_type', 'vertraulich' );
  }
  return $query;
}