Seiten¬≠vor¬≠lagen sind Templa¬≠te¬≠da¬≠teien, welche laut der Template Hierarchie die Ansicht der Standard index.php bzw. page.php usw. √ľbersteuern.

Der Name dieser Template Dateien kann dabei frei gewählt werden. Sinn ergibt dabei die page.php als Grundlage zu nehmen. Dort die jewei­ligen Anpas­sungen vorzu­nehmen und das ganze unter einem anderen Namen abzuspei­chern.

Wichtig ist die Angabe des Namens in der Template Datei

<?php
/*
* Template Name: Subpages
* Description: Listet Unterseiten auf.
*/
?>

Dieses Template kann dann im Backend in der Seiten­be­ar­beitung jeder Seite zugewiesen werden.

Zunächst einmal muss die Kommen­tar­funktion in der functions.php regis­triert werden.

<!-- Kommentare -->
<?php
function ms_comments( $comment, $args, $depth ) {$GLOBALS['comment'] = $comment; ?><!-- Name der Funktion kann frei gewählt werden-->
<li class="single-comment"><!-- Listenelement wird von WordPress geschlossen -->
    <?php echo get_avatar($comment, $size='90');?><!-- Holt Avatar -->
    <p><?php echo get_comment_author_link();?></p><!-- Lädt Author -->
    <p><?php echo get_comment_date("d.m.Y");?>, <?php echo get_comment_time();?> Uhr</p><!-- Gibt Datum und Zeit des Kommentars aus -->
    <p><?php comment_text();?></p><!-- Der Kommentar ansich -->

    <!--Antwort Button-->
    <div class="reply">
        <?php comment_reply_link(array_merge( $args, array(
            'depth' => $depth,
            'max_depth' => $args['max_depth']
        ))) ?>
    </div>
<?php }

Anschlie√üend wird in der comments.php der Aufbau des Formulars und die Ausgabe der Kommentare erzeugt.

<div class="comment-form"><!-- Start Formular -->
    <?php $fields = array(
        'author' => '<p><label for="author">' . __('Name <em>(Pflichtangabe)</em>') . '</label><br /><input id="author" name="author" type="text" value="' . esc_attr($commenter['comment_author']) . '"size="30" aria-required="true"/></p>',
        'email' => '<p><label for="email">' . __('E-Mail <em>(Pflichtangabe, wird nicht veröffentlicht)</em>') . '</label><br /><input id="email" name="email" type="text" value="' . esc_attr($commenter['comment_author_email']) . '"size="30" aria-required="true"/></p>',
        'url' => '<p><label for="url">' . __('Homepage') . '</label><br /><input id="url" name="url" type="text" value="' . esc_attr($commenter['comment_author_url']) . '"size="30"/></p>',
    );
    
    comment_form( array(
        'fields' => apply_filters('comment_form_default_fields', $fields ),
        'comment_notes_before' => '<p>Dein Kommentar</p>',
        'comment_notes_after' => '<p>Dein Kommentar muss nach der Erstellung freigeschaltet werden.</p>',
        'title_reply' => __('<h3>Beitrag kommentieren</h3>')
    ));
    ?>
</div><!-- Ende Formular -->


<div class="comment-list">
    <?php if (have_comments()) : ?><!-- Pr√ľft ob Kommentare vorhanden sind -->
    <?php if (get_comment_pages_count() > 1 && get_option('page_comments')) : ?><!-- Pr√ľft ob im Backend "Breche Kommentare in Seiten um" aktiviert ist -->
    
    <!-- Navigation f√ľr Kommentare falls aktiviert -->
    <div class="navigation">
        <div class="nav-previous"><?php previous_comments_link('Vorherige Kommentare');?></div>
        <div class="nav-next"><?php next_comments_link('Nächste Kommentare');?></div>
    </div>
    <?php endif; ?>
    
    <!-- Liste der Kommentare -->
    <ul>
        <?php wp_list_comments('type=all&callback=ms_comments');?><!-- Lädt Darstellung einzelner Kommentare aus der functions.php - Name muss dort registriert sein -->
    </ul>
    
    <!-- Pr√ľft ob Kommentare geschlossen sind-->
    <?php if ( ! comments_open()) : ?>
    <p>Dieser Beitrag erlaubt keine Kommentare.</p>
    <?php endif; ?>
    
    <?php endif; ?>
</div>

Zu guter letzt m√ľssen die Kommentare noch via Template tag "comments_template" in den entspre¬≠chenden Template Dateien integriert werden. Standard daf√ľr w√§re die single.php √ľblicher¬≠weise unterhalb des content.

<?php comments_template(); ?>

Antwort Funktion f√ľr Kommentare

Damit auf die Kommentare auch geant­wortet werden kann, muss das ganze noch etwas ergänzt werden.
Dazu benötigen wir folgendes Script, welches Teil von WordPress ist.

<?php wp_enqueue_script('comment-reply');?>

Den Antwort Button haben wir bereits oben in der functions.php eingef√ľgt.

 

Um die Sidebar zu integrieren und diese "Widget¬≠f√§hig" zu machen ben√∂tigen wir zun√§chst die Funktion register_sidebar. Dies wird √§hnlich wie bei den Naviga¬≠tionen in der functions.php gemacht.

<!-- Sidebars -->
<?php
add_action( 'widgets_init', 'mo_register_sidebar' ); //Name kann frei gewählt werden
function mo_register_sidebar() { //muss hier der Selbe sein
    register_sidebar( array(
        'name' => 'sidebar-1', //Name im Backend
        'id' => 'sidebar-1', //ID f√ľr Template tag
        'description' => 'Haupt-Seitenleiste', //Beschreibung f√ľr Seitenleiste im Backend
        'before_widget' => '<div id="%1$s" class="widget %2$s">', //Code der vor dem Widget ausgef√ľhrt wird
        'after_widget'  => '</div>', //Code der nach dem Widget ausgef√ľhrt wird
        'before_title'  => '<h5 class="widgettitle">', //Code der vor dem Titel ausgef√ľhrt wird
        'after_title'   => '</h5>', //Code der nach dem Titel ausgef√ľhrt wird
    ) );
}
//body class no-sidebar
 function mo_no_sidebar( $classes ) {
 if ( ! is_active_sidebar( 'sidebar-1' ) ) {
 $classes[] = 'no-sidebar';
 }
 return $classes;
 }
 add_filter( 'body_class', 'mo_no_sidebar' );
?>

Damit die Widgets welche wir im Backend hinzu¬≠f√ľgen auch angezeigt werden, muss die Sidebar im Markup noch wie Template tag eingef√ľgt werden. Dieser Template tag lautet dynamic_sidebar. √úblicher¬≠weise wird dieser im <aside> Element in der sidebar.php eingef√ľgt. Beispiels¬≠weise k√∂nnte dies dann so aussehen.

<?php if ( is_active_sidebar( 'sidebar-1' ) ) : ?><!--Pr√ľft ob die Sidebar Widgets enth√§lt. ID muss in der functions.php registriert sein.-->
<aside class="site-sidebar">
 <?php dynamic_sidebar( 'sidebar-1' ); ?><!--ID muss in der functions.php registriert sein.-->
</aside>
<?php endif; ?>

Achtung! Keine HTML Kommentare vor dem öffnenden PHP tag!

Um Erwei­te­rungen an den Funktionen von WordPress Themes vorzu­nehmen, gibt es verschiedene Möglich­keiten.

functions.php

Die functions.php wird im Haupt­ver­zeichnis des Themes abgelegt und ist somit die einfachste Möglichkeit dem Theme zusätz­liche Funktionen zu verschaffen. Diese Funktio­na­li­täten gehen beim Wechsel des Themes verloren.

Plugins

Plugins werden im Verzeichnis plugins unter wp-content abgelegt. Diese sind unabhängig von Themes und können vom Anwender mit Zugriff auf das Backend aktiviert/deaktiviert werden.

Plugins erwarten ebenso wie die style.css ein paar Kommentare um diese im Backend anzuzeigen.

/* 
Plugin Name: Tolles Plugin
Author: Wolf
*/

Mu-Plugins

Plugins werden im Verzeichnis mu-plugins unter wp-content abgelegt. Diese sind unabhängig von Themes und können nicht vom Anwender aktiviert/deaktiviert werden.

Mu Plugins erwarten ebenso wie die style.css ein paar Kommentare um diese im Backend anzuzeigen.

/* 
Plugin Name: Tolles Plugin
Author: Wolf
*/

Die Suchfunktion wird in WordPress anhand des Include Tags get_search_form() geladen. Da sich die Standard Ausgabe von WordPress nicht gut indivi¬≠dua¬≠li¬≠sieren l√§sst, empfiehlt es sich eine searchform.php anzulegen. Diese ist ein Sekun¬≠d√§res Template. Ein einfacher Aufbau dieser k√∂nnte wie folgt aussehen.

<form method="get" action="<?php bloginfo('url');?>/" class="site-search">
    <input type="search" name="s"/>
    <input type="submit" value="Suchen"/>
</form>

Um die Ergeb¬≠nis¬≠seite anzupassen, k√∂nnte folgender Zusatz oberhalb des Loops eingef√ľgt werden.

<h1>Suchergebnisse f√ľr: <?php echo $s ?></h1>

 

Manchmal ist es gew√ľnscht, au√üerhalb des Standard Loops weitere Loops einzu¬≠bauen, der unter bestimmten Bedin¬≠gungen greift. Diese Bedin¬≠gungen k√∂nnen beispiels¬≠weise mit Condi¬≠tional tags oder ganz einfach aus der derzei¬≠tigen Position im Theme heraus entstehen.

Die Start¬≠seite wird laut Template Hierarchie in der Template Datei front-page.php reali¬≠siert. Diese k√∂nnte z.B. eine Kopie der page.php sein, wo ein weiteres terti√§res Template geladen wird, welches in der page.php nicht geladen wird. Dieses Beispiel w√ľrde sich auch anhand des Condi¬≠tional tags is_front_page() reali¬≠sieren lassen.

Der Alter­native Loop wird mit einem sogenannten WP_Query reali­siert. Das ganze funktio­niert eigentlich genauso wie der Standard Loop. Außer das vorher noch ein Array erzeugt wird, wo die Daten des alter­na­tiven Loops gespei­chert werden. Dann muss an allen Stellen wo etwas ausge­geben werden soll, noch der Bezeichner des alter­na­tiven Loops voran­ge­stellt werden.

Im folgendem Beispiel sollen z.B. die letzten 5 Beitr√§ge auf einer stati¬≠schen Start¬≠seite angezeigt werden.

<?php //Start des alternativen Loops
            
            $number_of_posts = get_option('posts_per_page',10); //Ermittelt den eingestellten Wert Beiträge pro Seite. 10 Fallback-Lösung
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; //Liest die aktuelle Seite innerhalb der Pagination aus
            $offset = ($paged - 1) * $number_of_posts; //Berechnet aus posts_per_page um wie viel Beiträge der Loop verschoben werden muss
            
            $args = array(             //Erstellt ein Array mit dem Bezeichner $args                                                  
                'post_type' => 'post', //Definiert das Beiträge gelooped werden
                'posts_per_page' => 3, //Anzahl der anzuzeigenden Beiträge
                'offset' => $offset,   //verschiebt den Wert des Loops um den in der Variable ermittelten Betrag
                'paged' => $paged      //aktiviert die Pagination f√ľr diesen Loop
            );                         //Ende des Array
            
            $loop2 = new WP_Query($args); //Es wird ein WP_Query mit dem Bezeichner $loop2 und dem Inhalt des Arrays $args erstellt
            
            
            if ( $loop2->have_posts() ) : while ( $loop2->have_posts() ) : $loop2->the_post(); ?> <!--Start des alternativen Loops-->
                <?php get_template_part('template_parts/content');?><!--Lädt die content.php-->
            <?php endwhile; else : ?> <!--Ende While-Schleife des Loops-->
                <?php get_template_part('template_parts/content','error');?><!--Lädt die content-error.php-->
            <?php endif;?> <!--Ende der if-Anweisung des Loops-->
	            
                <?php previous_posts_link('Vorherige Seite',$loop2->max_num_pages);?> <!--Link zum vorigen Beitrag-->
                <?php next_posts_link('Nächste Seite',$loop2->max_num_pages);?> <!--Link zum nächsten Beitrag-->
            
<?php wp_reset_postdata();?> <!--Reset des Loops-->

Achtung! Wird der alter­native Loop mit benut­zer­de­fi­nierten Beitrags­typen benutzt, muss dieser leicht angepasst werden, da die Query Funktion posts_per_page nur den Standard Beitragstyp erfasst.

<?php //Start des alternativen Loops
            
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; //Liest die aktuelle Seite innerhalb der Pagination aus
            
            $args = array(             //Erstellt ein Array mit dem Bezeichner $args                                                  
                'post_type' => 'post', //Definiert das Beiträge gelooped werden
                'posts_per_page' => 3, //Anzahl der anzuzeigenden Beiträge
                'paged' => $paged      //aktiviert die Pagination f√ľr diesen Loop
            );                         //Ende des Array
            
            $loop2 = new WP_Query($args); //Es wird ein WP_Query mit dem Bezeichner $loop2 und dem Inhalt des Arrays $args erstellt
            
            
            if ( $loop2->have_posts() ) : while ( $loop2->have_posts() ) : $loop2->the_post(); ?> <!--Start des alternativen Loops-->
                <?php get_template_part('template_parts/content');?><!--Lädt die content.php-->
            <?php endwhile; else : ?> <!--Ende While-Schleife des Loops-->
                <?php get_template_part('template_parts/content','error');?><!--Lädt die content-error.php-->
            <?php endif;?> <!--Ende der if-Anweisung des Loops-->
	            
                <?php previous_posts_link('Vorherige Seite',$loop2->max_num_pages);?> <!--Link zum vorigen Beitrag-->
                <?php next_posts_link('Nächste Seite',$loop2->max_num_pages);?> <!--Link zum nächsten Beitrag-->
            
<?php wp_reset_postdata();?> <!--Reset des Loops-->

Der im Backend ausge¬≠lesene Wert Beitr√§ge pro Seite funktio¬≠niert mit benut¬≠zer¬≠de¬≠fi¬≠nierten Beitrags¬≠typen nicht, somit m√ľssen die Variable $number_of_posts und die Variable $offset die mit diesem Werte rechnet, entfernt werden.

Mit Condi¬≠tional tags ist es m√∂glich Bedin¬≠gungen innerhalb des Themes abzufragen. Diese werden als gew√∂hn¬≠liche If-Abfragen in PHP geschrieben. In folgendem Beispiel wird anhand des condi¬≠tional tags "is_page" abgefragt, ob es sich um eine Seite handelt. Auf Blog√ľber¬≠sichten oder in Beitr√§gen w√ľrde die Seiten¬≠leiste somit nicht angezeigt.

<?php if(is_page()) {?><!--Start der if Abfrage-->
<aside>
    <h4>Haben Sie Fragen?</h4>
    <p>Zögern Sie nicht uns zu kontaktieren!</p>
</aside>
<?php } ?><!--Ende der if Abfrage-->

Anders¬≠herum ist es nat√ľrlich auch m√∂glich abzufragen ob es sich nicht um einen gewissen Zustand handelt. In folgendem Beispiel wird die Sidebar nicht auf der Seite mit der ID 50 gezeigt. Das Ausru¬≠fe¬≠zeichen vor dem condi¬≠tional tag kehrt dessen Wirkung um.

<?php if(!is_page(50)) {?><!--Start der if Abfrage-->
<aside>
    <h4>Haben Sie Fragen?</h4>
    <p>Zögern Sie nicht uns zu kontaktieren!</p>
</aside>
<?php } ?><!--Ende der if Abfrage-->

Beispiel unter­schied­liche Überschrifts­ebenen je nach Seite

Auf einigen Seiten wird bereits eine <h1> √úberschrift ausge¬≠geben. Diese soll dann innerhalb des Loop nicht ebenfalls nochmal als <h1> ausge¬≠geben werden. Dieses Beispiel k√∂nnte z.B. in der content.php einge¬≠setzt werden.

<?php if(is_page(1066) || is_front_page()) { ?>
        <h2><a href="<?php the_permalink();?>"><?php the_title();?></a></h2>
<?php } else { ?>
        <h1><a href="<?php the_permalink();?>"><?php the_title();?></a></h1>  
<?php } ?>

Beispiel indivi­duelle Fehler­meldung

Ein 404 k√∂nnte eine andere Ausgabe erzeugen als das Ergebnis einer nicht erfolg¬≠reichen Suche. Dies w√§re ein Beispiel f√ľr die content-error.php

<?php if (is_search()) { ?>
    <section <?php post_class();?>>
        <p>Leider nichts gefunden</p>
    </section>
<?php } else { ?>
    <section <?php post_class();?>>
        <h1>Fehler 404</h1>
        <p>Diese Seite existiert nicht</p>
    </section>
<?php } ?>

 

 

Der Loop ist eine Schlei­fen­kon­struktion in WordPress, welche die Inhalte von WordPress lädt. Der Loop muss in jede Template-Datei einge­tragen werden, die den Loop auch abbilden soll.

Wie oft diese Schleife durch­läuft, hängt davon ab, welche Einstel­lungen unter "Einstel­lungen >> Lesen" getroffen wurden. Welche Inhalte Der Loop anzeigt, hängt ebenso davon ab, wo man sich befindet.

  • Bei einge¬≠stellter stati¬≠scher Start¬≠seite zeigt der Loop nur den Inhalt dieser Seite.
  • Bei der Einstellung "deine letzten Beitr√§ge" zeigt der Loop entspre¬≠chend der Einstellung "Blogseiten zeigen maximal" die dort einge¬≠stellte Anzahl an Beitr√§ge.
  • Bei der Auflistung von Suchergeb¬≠nissen l√§uft der Loop so oft, wie es Ergeb¬≠nisse f√ľr die Suche gibt, welche aufge¬≠listet werden k√∂nnen.
  • In einer Katego¬≠rie¬≠seite zeigt der Loop alle Beitr√§ge dieser Kategorie
  • usw.

Der Start

Beispiels­weise solch ein Aufbau wäre denkbar.

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
      <?php get_template_part('template_parts/content', get_post_format());?>
      <?php comments_template(); ?> 
<?php endwhile; else : ?>
      <?php get_template_part('template_parts/content'.'error');?>
<?php endif; ?>

Das Ende

Das Ende der Loop besteht eigentlich aus zwei Elementen. Einmal die Beendung der eigent­lichen Schleife. Zum anderen dem Ende der If-Anweisung.

<?php endwhile; else : ?>

Dieser Code beendet die While-Schleife des Loops und l√§utet die Else-Anweisung ein. Also den Teil der ausge¬≠f√ľhrt wird, wenn die nichts ausge¬≠geben werden kann. Sprich die If-Anweisung nicht erfolg¬≠reich war.

Nachdem die Ausgabe dessen erfolgt ist, wird noch die If-Anweisung des Loops beendet.

<?php endif; ?>

Innerhalb der Loop

innerhalb der Loop k√∂nnen Template Tags einge¬≠setzt werden um dynami¬≠schen Inhalt aus der Datenbank auszu¬≠lesen. F√ľr die Ausgabe der Inhalte der Loop sind die Template Tags der Kategorie "post tags" vorge¬≠sehen.

Post Class

verh√§lt sich √§hnlich wie body class, nur das hier Klassen auf Beitrags¬≠ebene erzeugt werden. Diese wird √ľblicher¬≠weise im Start <article> Tag innerhalb der Loop eingef√ľgt.

<?php post_class(); ?>

The Title

Der Beitrags¬≠titel. Dieser wir innerhalb des <article></article> bevorzugt an oberster Stelle eingef√ľgt. the_permalink ist der Template tag um das Linkziel in den Beitrag zu setzen und the_title gibt den Titel aus

<h2><a href="<?php the_permalink();?>"><?php the_title();?></a></h2>

Metadaten

Metadaten des Beitrages wären z.B. der Autor, das Veröf­fent­li­chungs­datum, die Kategorie etc. Diese Template tags finden sich allesamt im Codex. Anbei noch ein Beispiel:

<p>Veröffentlich von <?php the_author(); ?> am <?php the_time('d.m.y');?>.</p>

The Content

Der eigent­liche Beitrags­inhalt.

<?php the_content(); ?>

Mit editiertem "Read more" Link

<?php the_content('Weiterlesen'); ?>

 

Damit WordPress selbst und auch die Plugins, Code in das Theme einbringen k√∂nnen, m√ľssen daf√ľr Schnitt¬≠stellen geschaffen werden, die es dem Theme erlaubt mit den Anwen¬≠dungen zu kommu¬≠ni¬≠zieren.

Im Header f√ľgen wir kurz vor dem schlie¬≠√üenden </head> Tag folgendes ein.

<?php wp_head(); ?>

Damit werden Skripte, CSS Dateien geladen, die WordPress benötigt.

Im Footer f√ľgen wir direkt vor dem schlie¬≠√üenden </body> Tag dann noch dieses ein.

<?php wp_footer(); ?>

Damit wird der Footer-Code eingef√ľgt. Unter anderem ist dieser f√ľr die Admin-Bar n√∂tig.