CMS | t3n News News, Infos, Tipps und aktuelle Artikel zu CMS 2014-04-03T12:43:38Z t3n Redaktion http://t3n.de/tag/cms Social Locker: Mächtiges Plugin verspricht Webseiten mehr Reichweite in Sozialen Netzwerken http://t3n.de/news/social-locker-plugin-macht-deal-538021/ 2014-04-03T12:43:38Z
Social Locker ist ein WordPress-Plugin, das es auch als jQuery-Version gibt und mit dem ihr eure Nutzer per Social-Media-Aktion für bestimmte Inhalte bezahlen lassen könnt. Was damit genau möglich. ...

Social Locker ist ein WordPress-Plugin, das es auch als jQuery-Version gibt und mit dem ihr eure Nutzer per Social-Media-Aktion für bestimmte Inhalte bezahlen lassen könnt. Was damit genau möglich ist, stellen wir euch hier vor.

Gute Inhalte ja – aber nur gegen soziale Interaktion

Das Problem kennen bestimmt fast alle, die anderen Inhalte bereitstellen – sei es in einem Blog, Podcast oder mit kostenlosen Design-Ressourcen: Es wäre toll, wenn mehr Besucher und Nutzer die Beiträge und Ressourcen über die Social-Media-Buttons teilen würden. Social Locker bietet eine Möglichkeit, wie ihr das erreichen könnt.

Mit Social Locker könnt ihr bestimmte Inhalte nur zugänglich machen, wenn Besucher die Seite bei einem Sozialen Netzwerk verbreiten. Dabei geht es über das einfache „nach dem ersten Absatz ein Like für den weiteren Artikel“ hinaus. Ihr könnt ganz bequem auch nur einen Download-Link oder einen Link zu einer Demo sperren. Nach dem Download des Plugins könnt ihr es ganz normal über das WordPress-Backend installieren. Anschließend könnt ihr „Social Lockers“ anlegen.

So sieht Social Locker im Frontend aus. (Screenshot: eigene WordPress-Installation)
So sieht Social Locker im Frontend aus. (Screenshot: eigene WordPress-Installation)

Ihr könnt hierbei das Aussehen eures Lockers relativ individuell gestalten. Neben der Beschriftung des Lockers inklusive Beschriftung auf den Social-Media-Schaltflächen könnt ihr zwischen fünf Designs wählen. Wer etwas erfahrener ist, kann hier vermutlich auch relativ einfach noch weitere optische Anpassungen treffen. Anschließend müsst ihr natürlich festlegen, welche Social-Media-Kanäle ihr auf dem Locker angezeigt haben wollt: Ihr habt hier momentan die Wahl aus einem Tweet, einem +1 auf Google+, einem Like auf Facebook, einem Share auf Facebook, Google+ und LinkedIn sowie einem neuen Follower für Twitter. Hier könnt ihr unter anderem auch immer festlegen, ob eine andere URL als die der aktuellen Site gepostet werden soll.

Unter den weiteren Einstellungsmöglichkeiten ist unter anderem noch die Möglichkeit, ein Kreuz für das Lesen des weiteren Inhalts anzuzeigen, ohne dass der Nutzer einen Share oder Like abgeben muss. Den Inhalt, den ihr sperren möchtet, umschließt ihr dann einfach mit einem Shortcode. Bei dem „Default Locker“ ist das [sociallocker].

Ausreichend Möglichkeiten zur Individualisierung für Social Locker. (Screenshot: eigene WordPress-Installation)
Ausreichend Möglichkeiten zur Individualisierung für Social Locker. (Screenshot: eigene WordPress-Installation)

Social Locker: Nur mit Vorsicht zu genießen

An sich ist Social Locker eine tolle Möglichkeit, mehr Interaktion in den Sozialen Netzwerken zu erreichen. Allerdings solltet ihr bei der Lösung das Thema Datenschutz nicht aus dem Blick verlieren – denn die Einbindung der Social-Media-Schaltflächen ist so, wie sie standardmäßig von dem Plugin vorgenommen wird, in Deutschland nicht datenschutzkonform. Außerdem solltet ihr genau darauf achten, ob ihr wirklich einen Nutzen aus dem Plugin ziehen könnt – oder eher Nutzer abschreckt. Das Plugin einzusetzen, wenn ihr euch auf eurem Gebiet schon einen Namen gemacht habt und die Nutzer wissen, dass ihr qualitativ hochwertige Inhalte liefert, kann bestimmt funktionieren. Wenn ihr aber noch relativ wenig Leser habt, dann ist das vermutlich keine so gute Idee. Und ihr solltet mit so einer Lösung nie Inhalte verstecken, die nicht das halten, was ihr auf dem Social Locker ankündigt. Dann fühlt sich der Besucher ausgenutzt und kommt im schlimmsten Fall nie wieder vorbei.

Das WordPress-Plugin könnt ihr für sieben Tage kostenlos testen, anschließend kostet es 23 US-Dollar. Das jQuery-Plugin ist schon für 16 US-Dollar zu haben. Die Links zum Download findet ihr auf der offiziellen Website von Social Locker.

Was haltet ihr von dem Weg, so für eure Inhalte „bezahlen“ zu lassen? Kennt ihr vielleicht eine solche Lösung, die auch noch unbedenklich vom Datenschutz ist, weil sie die Social-Media-Schaltflächen vielleicht statisch einbindet?

]]>
Florian Brinkmann
Die 10 beliebtesten Artikel der Woche: Neues Facebook-Impressum, clevere Lego-Flatrate und TYPO3 CMS 6.2 http://t3n.de/news/facebook-lego-typo3-536943/ 2014-03-29T10:02:22Z
Eine Reihe spannender Themen hat uns durch diese Woche begleitet. Kurz vor deren Ende präsentieren wir euch deshalb die belietebsten t3n-Artikel der letzten Tage, darunter: das neue...

Eine Reihe spannender Themen hat uns durch diese Woche begleitet. Kurz vor deren Ende präsentieren wir euch deshalb die belietebsten t3n-Artikel der letzten Tage, darunter: das neue Facebook-Impressum, eine clevere Lego-Flatrate und TYPO3 CMS 6.2.

1. E-Commerce kreativ: Stein auf Stein mit der Lego-Flatrate von Bauduu

(Screenshot: Bauduu.de)
(Screenshot: Bauduu.de)

Lego-Sets sind teuer und für Kinder manchmal nach kurzer Zeit schon nicht mehr interessant. Das Startup Bauduu bietet Lego-Sets deshalb zum Ausleihen an – gegen eine monatliche Gebühr auch als Flatrate. Wir haben uns das kreative Projekt angesehen.

Unser Artikel: E-Commerce kreativ: Stein auf Stein mit der Lego-Flatrate von Bauduu

2. SEO: So textet ihr den perfekten Title für das neue Google-Layout

(Screenshot: t3n.de)
(Screenshot: t3n.de)

Seit rund einer Woche nutzt Google ein neues Design. Mit diesen Tipps könnt ihr den Title eurer Webseiten nach den Neuerungen auf ihre Klickrate optimieren.

Unser Artikel: SEO: So textet ihr den perfekten Title für das neue Google-Layout

3. Researchgate: „Die Gier nach schnellem Erfolg macht Berlin krank!“

researchgate_madischijadSechs Jahre nach der Gründung gehört Researchgate zu den erfolgreichsten Startups in Berlin. Im Gespräch mit t3n erklärt Gründer Ijad Madisch das Erfolgsrezept, den millionenschweren Coup mit Bill Gates und das Puzzleteil, das Berlin für das nächste große Ding wirklich fehlt.

Unser Artikel: Researchgate: „Die Gier nach schnellem Erfolg macht Berlin krank!“

4. ScrollMagic: Ein Animationsframework, das hält was der Name verspricht

scrollmagicKennt ihr eigentlich Superscrollorama von John Polacek? Dann werdet ihr ScrollMagic lieben. Das Framework kann alles was Superscrollorama auch kann, nur höher, schneller, weiter!

Unser Artikel: ScrollMagic: Ein Animationsframework, das hält was der Name verspricht

5. TYPO3 CMS 6.2: Alle Features der neuen Version im Überblick

TYPO3. (Screenshot: typo3.org)
TYPO3. (Screenshot: typo3.org)

Am gestrigen Dienstag wurde die neue Version 6.2 des beliebten Content-Management-Systems (CMS) veröffentlicht. Welche Änderungen und Verbesserungen es gibt, haben wir hier für euch zusammengetragen.

Unser Artikel: TYPO3 CMS 6.2: Alle Features der neuen Version im Überblick

6. BatteryBox: Dieser externe Akku versorgt dein MacBook Air für 12 Stunden mit Saft

batterybox_akku_teaserBatteryBox ist ein externer Akku, der beispielsweise acht iPhones vollständig aufladen kann. Dank des BatteryOS genannten Batterie-Mangement-Systems soll der Akku auch nach fünf Jahren kaum an Kapazität verlieren.

Unser Artikel: BatteryBox: Dieser externe Akku versorgt dein MacBook Air für 12 Stunden mit Saft

7. Richtig schöne E-Mails: Diese Website zeigt inspirierende Beispiele

e-mail_design_newsletter„Really Good Emails“ sammelt Beispiele für großartige E-Mails aus verschiedenen Bereichen. Neben einem Screenshot der eigentlichen Nachricht gehen die Macher auch auf die jeweiligen Stärken und Schwächen der Mails ein.

Unser Artikel: Richtig schöne E-Mails: Diese Website zeigt inspirierende Beispiele

8. Prestashop Release 1.6: Das Open-Source-Shopsystem in der Übersicht

(Screenshot: timefy.com)
(Screenshot: timefy.com)

Das Open-Source-System Prestashop steht jetzt in der neuesten Version 1.6 zum Download zur Verfügung. Wir stellen euch das Shopsystem und seine Neuerungen vor.

Unser Artikel: Prestashop Release 1.6: Das Open-Source-Shopsystem in der Übersicht

9. Schluss mit Abmahnungen? Facebook bringt Impressumsfunktion für Fanseiten

Facebook bringt eine Impressumsfunktion für Seiten.
Facebook bringt eine Impressumsfunktion für Seiten.

Auf Facebook-Fanseiten gab es bisher keine Möglichkeit, direkt ein Impressum einzubinden. Jetzt hat die Funktion nachgerüstet und ermöglicht das einfache Anlegen eines Impressums für eure Facebook-Seite.

Unser Artikel: Schluss mit Abmahnungen? Facebook bringt Impressumsfunktion für Fanseiten

10. CSS-Diner: Nerd-Spiel mit CSS-Selektoren für zwischendurch

css-dinerCSS Diner ist ein kleines Spiel, bei dem ihr mit CSS-Selektoren verschiedene Elemente aus einer interaktiven Grafik auswählen müsst. In diesem Artikel zeigen wir euch, warum dieses Spiel nicht unbedingt für Anfänger geeignet ist.

Unser Artikel: CSS-Diner: Nerd-Spiel mit CSS-Selektoren für zwischendurch

]]>
Lars Budde
TYPO3 CMS 6.2: Alle Features der neuen Version im Überblick http://t3n.de/news/typo3-cms-62-alle-features-536077/ 2014-03-26T08:47:43Z
Am gestrigen Dienstag wurde die neue Version 6.2 des beliebten Content-Management-Systems (CMS) TYPO3 veröffentlicht. Welche Änderungen und Verbesserungen es gibt, haben wir hier für euch...

Am gestrigen Dienstag wurde die neue Version 6.2 des beliebten Content-Management-Systems (CMS) TYPO3 veröffentlicht. Welche Änderungen und Verbesserungen es gibt, haben wir hier für euch zusammengetragen.

Update vom 26. März 2014: Gestern wurde jetzt offiziell das in Version 6.2 veröffentlicht. Die Release-Notes und den offiziellen Download der neuen Version findet ihr auf typo3.org.

In der neuen Version von TYPO3 CMS wurden einige Dinge verändert. Sehr detailliert beschäftigt sich damit die Präsentation von Patrick Lobacher, die wir am Ende des Beitrags auch integriert haben. Die wichtigsten Neuerungen stellen wir euch hier kurz vor.

TYPO3 CMS 6.2: Nur noch ein Paket

Die Änderungen sind schon beim Download der neuen Version vom TYPO3 CMS bemerkbar: Es gibt nur noch ein Paket – Also kein Dummy-Paket mehr. Während der Installation kann aus verschiedenen Distributionen („Responsive“, „Government“, „Introduction“ und „Hello World“) gewählt werden. Im Install-Tool werden nun Fehler in der Verzeichnisstruktur angezeigt, ein Update kann direkt von hier aus angestoßen werden und es wird im Install-Tool komplett auf Caching verzichtet. Das responsive Design einer Site kann aus dem Backend heraus mit einer Vorschau getestet werden. Voraussetzungen für den Einsatz von responsiven Bildern werden von Haus aus mitgebracht.

Das Backend hat eine kleine visuelle Überarbeitung erfahren, um die Usability zu erhöhen – unter anderem gibt es jetzt größere Freiräume. Beim Datei-Upload wird jetzt Drag & Drop unterstützt und die Suche wurde verbessert – es können auch Aliase durchsucht werden. Das neu angelegte Modul „Dokumentation“ ermöglicht es, Dokumentationen zu laden und anzusehen.

INCLUDE_TYPOSCRIPT ist nun auch für alle Dateien eines Verzeichnisses möglich, ebenso wie relative Pfadangaben. Mit Hilfe von escapeJsValue können Strings für den gefahrlosen JavaScript-Einsatz vorbereitet werden. Module können mit der neuen Version im Backend einzeln ausgeblendet werden und es kann eine Preview-Domain gesetzt werden, was besonders praktisch beim Einsatz von Multi-Domain-Installationen ist.

SpriteGenerator: Automatisch hochauflösende Sprites in TYPO3 CMS 6.2

Der Package-Manager wurde von TYPO3 Flow nach TYPO3 CMS portiert, wodurch unter anderem die Paket-Formate vereinheitlicht werden. Es wird automatisch die Normalize.css eingebunden, um eine browserübergreifende ähnliche Darstellung der Website zu erreichen und alle Handbücher liegen jetzt im reStructuredText (ReST) Format vor und nicht mehr im OpenOffice-Format. Erweiterungen können ab TYPO3 CMS 6.2 Abhängigkeiten angeben. Das Caching ist in zwei Gruppen aufgeteilt – „pages“ und „system“ –, beim Betätigen der Schaltfläche „Flush all caches“ wird nur der Cache der Gruppe „pages“ gelöscht. Der SpriteGenerator generiert jetzt auch eine Version für hochauflösende Displays – css_styled_content wird automatisch installiert und aktiviert.

Bei Fluid muss jetzt für die Erweiterung eines Themes dieses nicht mehr komplett kopiert werden – es gibt einen Template Fallback Support. Die folgende Präsentation geht neben den bereits erwähnten Features auch auf die API, entfernte und veraltete Funktionen sowie das Vorgehen bei einem Upgrade von älteren TYPO3-Versionen ein.

TYPO3 CMS 6.2 LTS - Die Neuerungen from Patrick Lobacher
]]>
Florian Brinkmann
WordPress auf dem Seziertisch: Welche Funktionen du kennen musst, um ein eigenes WordPress-Theme zu erstellen http://t3n.de/news/wordpress-theme-erstellen-twenty-fourteen-534579/ 2014-03-24T11:46:05Z
Für WordPress – das beliebteste CMS weltweit – gibt es tausende Themes. Wenn ihr aber etwas Individuelles haben und selbst ein WordPress-Theme erstellen wollt, müsst ihr euch mit den...

Für WordPress – das beliebteste CMS weltweit – gibt es tausende Themes. Wenn ihr aber etwas Individuelles haben und selbst ein WordPress-Theme erstellen wollt, müsst ihr euch mit den WordPress-Funktionen für Themes auseinandersetzen. Wir tun das in diesem Artikel für euch – am Beispiel von „Twenty Fourteen“.

Ein WordPress-Theme erstellen: HTML, CSS und ein bisschen PHP

Keine Frage: Es gibt für fast jeden Anwendungsfall ein passendes WordPress-Theme – meist sogar kostenlos. Aber wollen wir nicht alle etwas eigenes – etwas, was es so nur einmal im Web gibt? Deshalb kommen die meisten WordPress-Nutzer irgendwann an den Punkt, ein eigenes WordPress-Theme erstellen zu wollen. Und das ist gar nicht so schwer, wenn ihr HTML, CSS und ein bisschen PHP beherrscht.

Das einzige Hindernis sind dann noch die WordPress-Funktionen – und die schauen wir uns jetzt mal an.

Neu bei WordPress 3.8 dabei: Twenty Fourteen

Die Theme-Funktionen von ändern sich immer mal wieder geringfügig. Einige kommen hinzu, andere sollen nicht mehr genutzt werden. Überhaupt liegt es nahe, sich die Funktionen anhand eines aktuellen Themes anzuschauen. Die Wahl fällt auf Twenty Fourteen, das neueste Theme der WordPress-Entwickler. Auf die Funktionen, die Twenty-Fourteen-spezifisch sind, werde ich hier ebenfalls eingehen – ihr erkennt sie immer an dem Präfix twentyfourteen_. Wenn ihr noch weitere Informationen zu bestimmten Funktionen haben wollt, werdet ihr höchstwahrscheinlich in der Funktions-Referenz von WordPress.org fündig.

Schauen wir uns zuerst mal die Dateistruktur des Themes an. Auf den ersten Blick wirkt das jetzt sehr viel, aber einige Dateien sind sich vom Inhalt ziemlich ähnlich – andere wiederum haben kaum welchen. Wir werden die Dateien ungefähr so durchlaufen, wie sie im Blog genutzt oder angezeigt werden – wir beginnen also mit der header.php und enden mit der functions.php.

Die Ordnerstruktur des WordPress-Themes Twenty Fourteen. (Screenshot: eigene Installation)
Wer ein WordPress-Theme erstellen will, sollte die Ordnerstruktur von WordPress kennen. Hier am Beispiel von Twenty Fourteen. (Screenshot: eigene Installation)

Die header.php: Der Kopf des WordPress-Themes

Schauen wir uns also zuerst die header.php an.

<?php
/**
* The Header for our theme
*
* Displays all of the <head> section and everything up till <div id="main">
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
?><!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 7) | !(IE 8) ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width">
<title><?php wp_title( '|', true, 'right' ); ?></title>
<link rel="profile" href="http://gmpg.org/xfn/11">
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>">
<!--[if lt IE 9]>
<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js"></script>
<![endif]-->
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<div id="page" class="hfeed site">
<?php if ( get_header_image() ) : ?>
<div id="site-header">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home">
<img src="<?php header_image(); ?>" width="<?php echo get_custom_header()->width; ?>" height="<?php echo get_custom_header()->height; ?>" alt="">
</a>
</div>
<?php endif; ?>
<header id="masthead" class="site-header" role="banner">
<div class="header-main">
<h1 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
<div class="search-toggle">
<a href="#search-container" class="screen-reader-text"><?php _e( 'Search', 'twentyfourteen' ); ?></a>
</div>
<nav id="primary-navigation" class="site-navigation primary-navigation" role="navigation">
<h1 class="menu-toggle"><?php _e( 'Primary Menu', 'twentyfourteen' ); ?></h1>
<a class="screen-reader-text skip-link" href="#content"><?php _e( 'Skip to content', 'twentyfourteen' ); ?></a>
<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) ); ?>
</nav>
</div>
<div id="search-container" class="search-box-wrapper hide">
<div class="search-box">
<?php get_search_form(); ?>
</div>
</div>
</header><!-- #masthead -->
<div id="main" class="site-main">

Die WordPress-eigenen Funktionen sind hier:

bloginfo( 'charset' )
bloginfo( 'pingback_url' )
bloginfo( 'name' )
wp_title( '|', true, 'right' )
get_template_directory_uri()
wp_head()
body_class()
get_header_image()
header_image()
get_custom_header()->width
get_custom_header()->height
esc_url()
home_url( '/' )
wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' )
get_search_form()

Die Funktion bloginfo() liefert hier je nach übergebenem Parameter den Zeichensatz, die Pingback-URL oder den Namen des Blogs zurück. wp_title('|', true, 'right' ) gibt eigentlich zurück, was in der general-template.php steht. In diesem Fall ist aber in der functions.php eine Funktion twentyfourteen_wp_title() definiert, die die Funktion erweitert. Zurückgegeben wird der Name des Blogs, auf der Startseite zusätzlich die Beschreibung und auf anderen Seiten der Titel der jeweiligen Seite. Die Parameter sind (von links nach rechts) der Seperator, ob und wo der Titel angezeigt werden soll. Weitere Informationen zu dieser etwas komplexeren Funktion findet ihr im WordPress-Codex.

Die Funktion get_template_directory_uri() macht genau das, was sie sagt: Zurückgegeben wird der Pfad zum Theme. Mit wp_head() werden Plugin-Stylesheets, Javascript-Funktionen und anderes eingebunden, was für eure WordPress-Site wichtig ist. body_class() gibt – je nach aufgerufener Site – passende Klassen aus, mit denen ihr die verschiedenen Seitenarten stylen könnt. Auf der Startseite wird beispielsweise home ausgegeben, auf der Blog-Übersicht blog, im Single-View single und so fort. Praktischerweise wird auch – falls JavaScript aktiviert ist – die Klasse js ausgegeben.

get_header_image() gibt true oder false zurück, je nachdem, ob ein Header-Bild im Backend gewählt wurde oder nicht – mit header_imge wird dieses dann ausgegeben. Die Funktionen get_custom_header()->width und get_custom_header()->height sollten selbsterklärend sein. Mit esc_url() werden potenziell gefährliche Zeichen aus einer URL gefiltert, home_url() gibt den Link zur Homepage der Website zurück.

wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) ist mit all seinen Parametern nochmal eine etwas kompliziert wirkende Funktion. Grob gesagt wird – wie sich erahnen lässt – ein Menü ausgegeben. Um die Funktion genauer zu verstehen, werfen wir einen Blick in die functions.php. Hier stehen die folgenden Zeilen:

register_nav_menus( array(
'primary' => __( 'Top primary menu', 'twentyfourteen' ),
'secondary' => __( 'Secondary menu in left sidebar', 'twentyfourteen' ),
) );

Hier werden zwei Menüs angelegt, die dann im Backend unter „Design > Menüs“ zu erreichen sind. Vergeben wird mit primary beziehungsweise secondary die theme_location, die wir oben in dem Code-Schnipsel von wp_nav_menu() wiederfinden. Darüber hinaus wird der Name des Menüs vergeben, der im Backend angezeigt werden soll. Mit dem Parameter menu_class wird dem Menü eine Klasse zugewiesen. Weitere Informationen zu dieser Funktion und zu ihren weiteren Parametern gibt es hier.

Die Funktion get_search_form() gibt ein Suchformular zurück. Wenn keine search.php im Theme enthalten ist, wird das Standard-Formular zurückgegeben.

Ein WordPress-Theme erstellen: Die index.php

Widmen wir uns nun der index.php, die im Vergleich zur header.php etwas übersichtlicher ist:

<?php
/**
* The main template file
*
* This is the most generic template file in a WordPress theme and one
* of the two required files for a theme (the other being style.css).
* It is used to display a page when nothing more specific matches a query,
* e.g., it puts together the home page when no home.php file exists.
*
* @link http://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
get_header(); ?>
<div id="main-content" class="main-content">
<?php
if ( is_front_page() && twentyfourteen_has_featured_posts() ) {
// Include the featured content template.
get_template_part( 'featured-content' );
}
?>
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php
if ( have_posts() ) :
// Start the Loop.
while ( have_posts() ) : the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part( 'content', get_post_format() );
endwhile;
// Previous/next post navigation.
twentyfourteen_paging_nav();
else :
// If no content, include the "No posts found" template.
get_template_part( 'content', 'none' );
endif;
?>
</div><!-- #content -->
</div><!-- #primary -->
<?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->
<?php
get_sidebar();
get_footer();

Hier alle neuen Funktionen im Überblick:

get_header()
is_front_page()
twentyfourteen_has_featured_posts()
get_template_part( 'featured-content' )
get_template_part( 'content', get_post_format() )
get_template_part( 'content', 'none' )
have_posts()
while ( have_posts() ) : the_post()
twentyfourteen_paging_nav()
get_sidebar( 'content' )
get_sidebar()
get_footer()

Die index.php ist nur ein Gerüst für die Inhalte, die mit Funktionen je nach Situation geladen werden. Mit der Funktion get_header() wird die header.php eingebunden. is_front_page() prüft, ob man sich gerade auf der Übersichtsseite des Blogs befindet. Die Funktion twentyfourteen_has_featured_posts() ist wieder eine Funktion aus der functions.php (immer gut zu erkennen an dem Namen des Themes als Präfix). Geprüft wird, ob es Featured Posts gibt. Jetzt werden verschiedene Teile des Templates eingelesen. get_template_part( 'featured-content' ) gibt den Inhalt der Datei featured-content.php zurück. Mit der Funktion get_template_part( 'content', get_post_format() ) wird – je nach Typ des Beitrags, also beispielsweise bei einer Galerie „gallery“ – die entsprechende content-[...].php zurückgegeben. get_post_format() gibt dementsprechend das Format des Artikels zurück. get_template_part( 'content', 'none' ) gibt dann – ihr habt es sicher schon geahnt – den Inhalt von content-none.php zurück.

Mit der Funktion have_posts() wird einfach geprüft, ob Artikel zum Anzeigen vorhanden sind. while ( have_posts() ) : the_post(); startet die Schleife, die nacheinander alle Beiträge durchläuft. Was ihr innerhalb dieser Schleife ausführt, wird bei jedem Post neu durchgeführt. Durch twentyfourteen_paging_nav() wird eine Navigation für ältere/neuere Posts angezeigt, get_sidebar( 'content' ) funktioniert ganz ähnlich wie get_template_part() und gibt den Inhalt der sidebar-content.php zurück. Äquivalent dazu wird mit get_sidebar() die sidebar.php zurückgegeben, mit get_footer() die footer.php.

Die content-Dateien bei WordPress

Da wir jetzt schon mit den content-Dateien zu tun hatten, gehen wir diese als nächstes durch. Sie ähneln sich zum Teil stark, da sie ja immer den Inhalt eines Beitrags ausgeben, nur für unterschiedliche Beitragstypen. Die Funktionen sind also bei allen content-Dateien nahezu die selben. Wenn der Artikel keinem bestimmten Post-Format zugeordnet wurde, wird die content.php aufgerufen, um den Inhalt darzustellen:

<?php
/**
* The default template for displaying content
*
* Used for both single and index/archive/search.
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php twentyfourteen_post_thumbnail(); ?>
<header class="entry-header">
<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>
<div class="entry-meta">
<span class="cat-links"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>
</div>
<?php
endif;
if ( is_single() ) :
the_title( '<h1 class="entry-title">', '</h1>' );
else :
the_title( '<h1 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h1>' );
endif;
?>
<div class="entry-meta">
<?php
if ( 'post' == get_post_type() )
twentyfourteen_posted_on();
if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) :
?>
<span class="comments-link"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>
<?php
endif;
edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class="edit-link">', '</span>' );
?>
</div><!-- .entry-meta -->
</header><!-- .entry-header -->
<?php if ( is_search() ) : ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
<?php else : ?>
<div class="entry-content">
<?php
the_content( __( 'Continue reading <span class="meta-nav">→</span>', 'twentyfourteen' ) );
wp_link_pages( array(
'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',
'after' => '</div>',
'link_before' => '<span>',
'link_after' => '</span>',
) );
?>
</div><!-- .entry-content -->
<?php endif; ?>
<?php the_tags( '<footer class="entry-meta"><span class="tag-links">', '', '</span></footer>' ); ?>
</article><!-- #post-## -->

Neu sind die folgenden Funktionen:

the_ID()
post_class()
twentyfourteen_post_thumbnail()
get_object_taxonomies()
get_post_type()
twentyfourteen_categorized_blog()
get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) )
is_single()
the_title( '<h1 class="entry-title">', '</h1>' )
get_permalink()
twentyfourteen_posted_on()
post_password_required()
comments_open()
get_comments_number()
comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) )
edit_post_link( __( 'Edit', 'twentyfourteen' ), '', '' )
is_search()
the_excerpt()
the_content( __( 'Continue reading <span class="meta-nav">→</span>', 'twentyfourteen' ) )
wp_link_pages( array(
'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentyfourteen' ) . '',
'after' => '</div>',
'link_before' => '<span>',
'link_after' => '</span>',
) )
the_tags( '<footer class="entry-meta"><span class="tag-links">', '', '</span></footer>' )

Mit the_ID() wird die ID des Beitrags zurückgegeben. post_class() gibt Klassen zurück, die zu dem Beitrag passen, beispielsweise die Klasse post, wenn es eine Galerie ist format-gallery und so weiter. twentyfourteen_post_thumbnail() gibt das Featured-Image des Beitrags zurück, durch get_object_taxonomies() werden alle Taxonomien eines Posts zurückgegeben. get_post_type gibt den Typ des Posts zurück. Die Funktion twentyfourteen_categorized_blog() prüft, ob das Blog mehr als eine Kategorie hat. Die Funktion get_the_category_list() sieht wegen der Parameter auf den ersten Blick schlimmer aus als sie ist: Der erste Parameter ist das Trennzeichen zwischen den Kategorien. Anschließend kommen Hinweise für Übersetzer und am Ende der Name des Themes. Auch das ist für die Übersetzung relevant.

Mit is_single() wird geprüft, ob wir uns im Single-View befinden, the_title gibt den Titel des Beitrags aus, als Parameter kann angegeben werde, was direkt davor und dahinter ausgegeben werden soll. get_permalink() gibt den Link zu dem Beitrag zurück, mit twentyfourteen_posted_on() werden Meta-Informationen wie etwa der Autor zurückgegeben. Wenn der Beitrag mit einem Passwort geschützt ist, gibt post_password_required() true zurück. comments_open() prüft, ob Kommentare erlaubt sind und get_comments_number() gibt true zurück, falls Kommentare hinterlassen wurden. Mit comments_popup_link() wird der Link zu den Kommentaren zurückgegeben, drei Parameter sind möglich: Das erste ist der Text, der ausgegeben wird, wenn kein Kommentar vorhanden ist. Zweiterer wird bei einem Kommentar angezeigt, letzterer bei mehr als einem Kommentar. edit_post_link() gibt den Link zum Bearbeiten des Beitrags aus, mit is_search() wird geprüft, ob es sich um eine Suchergebnis-Seite handelt. the_excerpt() gibt eine bestimmte Anzahl Zeichen als Teaser aus, anschließend wird der Text abgeschnitten.

Die Funktion the_content() gibt den Inhalt des Beitrags zurück. Wenn es sich um eine Übersichtsseite handelt, wird der Inhalt bis zum more-Tag (falls gesetzt) angezeigt, gefolgt von einem Link mit dem Text in runden Klammern. Mit wp_link_pages() werden Seitenzahlen für Beiträge mit mehr als einer Seite ausgegeben. Die Parameter sollten selbst erklärend sein. Mit the_tags() wird eine Liste der Tags ausgegeben, die Parameter bestimmen den Teil vor der Ausgabe, den Seperator zwischen den Tags und die Ausgabe danach.

Damit hätten wir die meisten Funktionen aus den content-Dateien abgearbeitet. Die Dateien content-aside.php, content-audio.php, content-gallery.php, content-image.php, content-link.php, content-quote.php und content-video.php sind sehr ähnlich aufgebaut. Im Vergleich zur content.php kommen nur zwei Funktionen dazu, mit entsprechenden Parametern:

get_post_format_link('audio')
get_post_format_string('audio')

Diese beiden Funktionen machen genau das, wonach sie klingen: Einmal wird der Link zu einer Archiv-Seite des in Klammern stehenden Post-Formats zurückgegeben, mit get_post_format_string() wird der Slug/die Bezeichnung zurückgegeben. In der content-featured-post.php, der content-none.php und der featured-content.php gibt es noch ein paar weitere Funktionen:

/* content-featured-post.php */
has_post_thumbnail()
get_theme_mod( 'featured_content_layout' )
the_post_thumbnail( 'twentyfourteen-full-width' )
/* content-none.php */
current_user_can( 'publish_posts' )
admin_url( 'post-new.php' )
/* featured-content.php */
twentyfourteen_get_featured_posts()
setup_postdata()
wp_reset_postdata()

Mit has_post_thumbnail() wird geprüft, ob ein Artikelbild festgelegt ist. Mit get_theme_mod() wird geprüft, welches Layout im Theme-Customizer gewählt wurde. current_user_can() gibt zurück, was für Rechte der Besucher gerade hat, mit admin_url() wird eine URL für das Backend erzeugt, hier für einen neuen Beitrag. twentyfourteen_get_featured_posts() liefert die Featured-Posts zurück, mit Hilfe von setup_postdata() werden globale Variablen gefüllt – wp_reset_postdata()setzt diese Variablen wieder zurück.

Weitere Übersichtsseiten: archive.php und author.php

Mit den content-[...].php-Dateien sind wir mit den Übersichtsseiten jetzt fast fertig. Es fehlen noch die archive.php und author.php – schauen wir uns zuerst den interessanten Teil der archive.php an:

<?php
/**
* The template for displaying Archive pages
*
* Used to display archive-type pages if nothing more specific matches a query.
* For example, puts together date-based pages if no date.php file exists.
*
* If you'd like to further customize these archive views, you may create a
* new template file for each specific one. For example, Twenty Fourteen
* already has tag.php for Tag archives, category.php for Category archives,
* and author.php for Author archives.
*
* @link http://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
get_header(); ?>
<section id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( have_posts() ) : ?>
<header class="page-header">
<h1 class="page-title">
<?php
if ( is_day() ) :
printf( __( 'Daily Archives: %s', 'twentyfourteen' ), get_the_date() );
elseif ( is_month() ) :
printf( __( 'Monthly Archives: %s', 'twentyfourteen' ), get_the_date( _x( 'F Y', 'monthly archives date format', 'twentyfourteen' ) ) );
elseif ( is_year() ) :
printf( __( 'Yearly Archives: %s', 'twentyfourteen' ), get_the_date( _x( 'Y', 'yearly archives date format', 'twentyfourteen' ) ) );
else :
_e( 'Archives', 'twentyfourteen' );
endif;
?>
</h1>
</header><!-- .page-header -->

Besonders viele neue Funktionen gibt es nicht, aber doch ein paar:

is_day()
is_month()
is_year()
get_the_date()

Eigentlich sollten die alle selbsterklärend sein. Die ersten drei prüfen, ob gerade ein Tagesarchiv, ein Monats- oder ein Jahresarchiv angezeigt wird. get_the_date() gibt die jeweilige Zeitangabe zurück.

Auch bei der author.php können wir uns auf den Anfang beschränken:

<?php
/**
* The template for displaying Author archive pages
*
* @link http://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
get_header(); ?>
<section id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( have_posts() ) : ?>
<header class="archive-header">
<h1 class="archive-title">
<?php
/*
* Queue the first post, that way we know what author
* we're dealing with (if that is the case).
*
* We reset this later so we can run the loop properly
* with a call to rewind_posts().
*/
the_post();
printf( __( 'All posts by %s', 'twentyfourteen' ), get_the_author() );
?>
</h1>
<?php if ( get_the_author_meta( 'description' ) ) : ?>
<div class="author-description"><?php the_author_meta( 'description' ); ?></div>
<?php endif; ?>
</header><!-- .archive-header -->
<?php
/*
* Since we called the_post() above, we need to rewind
* the loop back to the beginning that way we can run
* the loop properly, in full.
*/
rewind_posts();

Neue Funktionen sind:

get_the_author()
get_the_author_meta( 'description' )
the_author_meta( 'description' )
rewind_posts()

get_the_author() gibt den Namen des Autors zurück. Mit get_the_author_meta() kann geprüft werden, ob ein Autorenfeld ausgefüllt ist – hier die Autoren-Beschreibung. Zurückgegeben wird sie mittels the_author_meta().Mit rewind_posts wird wieder an die erste Position der Schleife gesprungen.

Machen wir weiter mit dem für uns interessanten Abschnitt der single.php:

if ( comments_open() || get_comments_number() ) {
comments_template();
}

Neu ist hier nur die Funktion comments_template(), mit der die comments.php zurückgegeben wird. Und in eben dieser comments.php gibt es wieder ein paar mehr neue Funktionen:

<?php
/**
* The template for displaying Comments
*
* The area of the page that contains comments and the comment form.
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
/*
* If the current post is protected by a password and the visitor has not yet
* entered the password we will return early without loading the comments.
*/
if ( post_password_required() ) {
return;
}
?>
<div id="comments" class="comments-area">
<?php if ( have_comments() ) : ?>
<h2 class="comments-title">
<?php
printf( _n( 'One thought on “%2$s”', '%1$s thoughts on “%2$s”', get_comments_number(), 'twentyfourteen' ),
number_format_i18n( get_comments_number() ), get_the_title() );
?>
</h2>
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>
<nav id="comment-nav-above" class="navigation comment-navigation" role="navigation">
<h1 class="screen-reader-text"><?php _e( 'Comment navigation', 'twentyfourteen' ); ?></h1>
<div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'twentyfourteen' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'twentyfourteen' ) ); ?></div>
</nav><!-- #comment-nav-above -->
<?php endif; // Check for comment navigation. ?>
<ol class="comment-list">
<?php
wp_list_comments( array(
'style' => 'ol',
'short_ping' => true,
'avatar_size'=> 34,
) );
?>
</ol><!-- .comment-list -->
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>
<nav id="comment-nav-below" class="navigation comment-navigation" role="navigation">
<h1 class="screen-reader-text"><?php _e( 'Comment navigation', 'twentyfourteen' ); ?></h1>
<div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'twentyfourteen' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'twentyfourteen' ) ); ?></div>
</nav><!-- #comment-nav-below -->
<?php endif; // Check for comment navigation. ?>
<?php if ( ! comments_open() ) : ?>
<p class="no-comments"><?php _e( 'Comments are closed.', 'twentyfourteen' ); ?></p>
<?php endif; ?>
<?php endif; // have_comments() ?>
<?php comment_form(); ?>
</div><!-- #comments -->

Hier sind die neuen Funktionen auf einen Blick:

have_comments()
get_comments_number()
get_comment_pages_count()
get_option( 'page_comments' )
previous_comments_link( __( '← Older Comments', 'twentyfourteen' ) )
next_comments_link( __( 'Newer Comments →', 'twentyfourteen' ) )
wp_list_comments( array(
'style' => 'ol',
'short_ping' => true,
'avatar_size'=> 34,) )
comment_form()

Mit have_comments() wird zurückgegeben, ob Kommentare vorhanden sind oder nicht. get_comments_number() liefert die Anzahl der Kommentare zurück, get_comment_pages_count() die Anzahl der Kommentar-Seiten. get_option( 'page_comments' ) prüft, ob im Backend die Option aktiviert ist, dass Kommentare ab einer bestimmten Anzahl auf mehrere Seiten aufgeteilt werden sollen. previous_comments_link() und next_comments_links() ist wieder selbsterklärend. Mit wp_list_comments() gebt ihr die Kommentare aus. Der Parameter style kan ol, ul oder div sein – short_ping gibt die Möglichkeit zu entscheiden, ob Ping- und Trackbacks kurz dargestellt werden sollen. Genauere Informationen und mehr Parameter findet ihr wieder im Codex.

WordPress-Funktionen: Die category.php

Wenden wir uns nun der category.php zu, von der wieder nur der erste Teil spannend ist:

<?php
/**
* The template for displaying Category pages
*
* @link http://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
get_header(); ?>
<section id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( have_posts() ) : ?>
<header class="archive-header">
<h1 class="archive-title"><?php printf( __( 'Category Archives: %s', 'twentyfourteen' ), single_cat_title( '', false ) ); ?></h1>
<?php
// Show an optional term description.
$term_description = term_description();
if ( ! empty( $term_description ) ) :
printf( '<div class="taxonomy-description">%s</div>', $term_description );
endif;
?>
</header><!-- .archive-header -->

Noch nicht behandelt haben wir die folgenden Funktionen:

single_cat_title( '', false )
term_description()

single_cat_title() liefert den Titel der Kategorie, term_description() die optionale Beschreibung. Für die tag-Seite gibt es äquivalent die Funktion single_tag_title(). Jetzt schauen wir uns die image.php an:

<?php
/**
* The template for displaying image attachments
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
// Retrieve attachment metadata.
$metadata = wp_get_attachment_metadata();
get_header();
?>
<section id="primary" class="content-area image-attachment">
<div id="content" class="site-content" role="main">
<?php
// Start the Loop.
while ( have_posts() ) : the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
<div class="entry-meta">
<span class="entry-date"><time class="entry-date" datetime="<?php echo esc_attr( get_the_date( 'c' ) ); ?>"><?php echo esc_html( get_the_date() ); ?></time></span>
<span class="full-size-link"><a href="<?php echo wp_get_attachment_url(); ?>"><?php echo $metadata['width']; ?> × <?php echo $metadata['height']; ?></a></span>
<span class="parent-post-link"><a href="<?php echo get_permalink( $post->post_parent ); ?>" rel="gallery"><?php echo get_the_title( $post->post_parent ); ?></a></span>
<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class="edit-link">', '</span>' ); ?>
</div><!-- .entry-meta -->
</header><!-- .entry-header -->
<div class="entry-content">
<div class="entry-attachment">
<div class="attachment">
<?php twentyfourteen_the_attached_image(); ?>
</div><!-- .attachment -->

Neu ist hier folgendes:

wp_get_attachment_metadata()
wp_get_attachment_url()
$metadata['width']
$metadata['height']
twentyfourteen_the_attached_image()

Mit wp_get_attachment_metadata() werden die Metadaten der Datei zurückgegeben. $metadata['width'] und $metadata['height'] sind selbsterklärend, twentyfourteen_the_attached_image() gibt das Bild zurück.

In der search.php ist nur eine Funktion vorhanden, die wir noch nicht hatten:

get_search_query()

Diese Funktion gibt einfach die Such-Anfrage zurück. In der sidebar.php gibt es noch weitere neue Funktionen:

<?php
/**
* The Sidebar containing the main widget area
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
?>
<div id="secondary">
<?php
$description = get_bloginfo( 'description', 'display' );
if ( ! empty ( $description ) ) :
?>
<h2 class="site-description"><?php echo esc_html( $description ); ?></h2>
<?php endif; ?>
<?php if ( has_nav_menu( 'secondary' ) ) : ?>
<nav role="navigation" class="navigation site-navigation secondary-navigation">
<?php wp_nav_menu( array( 'theme_location' => 'secondary' ) ); ?>
</nav>
<?php endif; ?>
<?php if ( is_active_sidebar( 'sidebar-1' ) ) : ?>
<div id="primary-sidebar" class="primary-sidebar widget-area" role="complementary">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</div><!-- #primary-sidebar -->
<?php endif; ?>
</div><!-- #secondary -->

Neu ist:

has_nav_menu( 'secondary' )
is_active_sidebar( 'sidebar-1' )
dynamic_sidebar( 'sidebar-1' )

has_nav_menu() prüft, ob das Menü einen Eintrag hat, oder nicht. is_active_sidebar() macht ähnliches für Sidebars, dynamic_sidebar() gibt eine Sidebar, oder besser einen Widget-Bereich, aus. Die verschiedenen Widget-Bereiche werden wieder in der functions.php definiert, das sieht für die primäre Sidebar so aus:

register_sidebar( array(
'name' => __( 'Primary Sidebar', 'twentyfourteen' ),
'id' => 'sidebar-1',
'description' => __( 'Main sidebar that appears on the left.', 'twentyfourteen' ),
'before_widget' => '

', 'after_widget' => '', 'before_title' => '

', 'after_title' => '

', ) );

Hier wird eine Sidebar mit dem Namen „Primary Sidebar“ angelegt, bekommt die id „sidebar-1“, eine Beschreibung, wird von einem aside-Tag umschlossen und der Titel wird als h1-Überschrift ausgezeichnet. In der taxonomy-post_format.php gibt es nur eine neue Funktion: is_tax. Widmen wir uns nun vor der funcions.php noch kurz der footer.php:

<?php
/**
* The template for displaying the footer
*
* Contains footer content and the closing of the #main and #page div elements.
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
?>
</div><!-- #main -->
<footer id="colophon" class="site-footer" role="contentinfo">
<?php get_sidebar( 'footer' ); ?>
<div class="site-info">
<?php do_action( 'twentyfourteen_credits' ); ?>
<a href="<?php echo esc_url( __( 'http://wordpress.org/', 'twentyfourteen' ) ); ?>"><?php printf( __( 'Proudly powered by %s', 'twentyfourteen' ), 'WordPress' ); ?></a>
</div><!-- .site-info -->
</footer><!-- #colophon -->
</div><!-- #page -->
<?php wp_footer(); ?>
</body>
</html>

Neu ist hier nur die Funktion wp_footer(), die ähnlich wie wp_header() arbeitet und Dinge einbindet, die für das Funktionieren einer Seite wichtig sind. Jetzt wird es noch mal spannend: Die functions.php – sie werde ich abschnittweise, also Funktion für Funktion, durchlaufen, aber auch die Inhalte der Funktionen erläutern. Funktionen, die nur eine Relevanz für Twenty Fourteen haben, werde ich gegebenenfalls auslassen.

<?php
/**
* Twenty Fourteen functions and definitions
*
* Set up the theme and provides some helper functions, which are used in the
* theme as custom template tags. Others are attached to action and filter
* hooks in WordPress to change core functionality.
*
* When using a child theme you can override certain functions (those wrapped
* in a function_exists() call) by defining them first in your child theme's
* functions.php file. The child theme's functions.php file is included before
* the parent theme's file, so the child theme functions would be used.
*
* @link http://codex.wordpress.org/Theme_Development
* @link http://codex.wordpress.org/Child_Themes
*
* Functions that are not pluggable (not wrapped in function_exists()) are
* instead attached to a filter or action hook.
*
* For more information on hooks, actions, and filters,
* @link http://codex.wordpress.org/Plugin_API
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
/**
* Set up the content width value based on the theme's design.
*
* @see twentyfourteen_content_width()
*
* @since Twenty Fourteen 1.0
*/
if ( ! isset( $content_width ) ) {
$content_width = 474;
}
/**
* Twenty Fourteen only works in WordPress 3.6 or later.
*/
if ( version_compare( $GLOBALS['wp_version'], '3.6', '<' ) ) {
require get_template_directory() . '/inc/back-compat.php';
}
if ( ! function_exists( 'twentyfourteen_setup' ) ) :
/**
* Twenty Fourteen setup.
*
* Set up theme defaults and registers support for various WordPress features.
*
* Note that this function is hooked into the after_setup_theme hook, which
* runs before the init hook. The init hook is too late for some features, such
* as indicating support post thumbnails.
*
* @since Twenty Fourteen 1.0
*/
function twentyfourteen_setup() {
/*
* Make Twenty Fourteen available for translation.
*
* Translations can be added to the /languages/ directory.
* If you're building a theme based on Twenty Fourteen, use a find and
* replace to change 'twentyfourteen' to the name of your theme in all
* template files.
*/
load_theme_textdomain( 'twentyfourteen', get_template_directory() . '/languages' );
// This theme styles the visual editor to resemble the theme style.
add_editor_style( array( 'css/editor-style.css', twentyfourteen_font_url() ) );
// Add RSS feed links to <head> for posts and comments.
add_theme_support( 'automatic-feed-links' );
// Enable support for Post Thumbnails, and declare two sizes.
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 672, 372, true );
add_image_size( 'twentyfourteen-full-width', 1038, 576, true );
// This theme uses wp_nav_menu() in two locations.
register_nav_menus( array(
'primary' => __( 'Top primary menu', 'twentyfourteen' ),
'secondary' => __( 'Secondary menu in left sidebar', 'twentyfourteen' ),
) );
/*
* Switch default core markup for search form, comment form, and comments
* to output valid HTML5.
*/
add_theme_support( 'html5', array(
'search-form', 'comment-form', 'comment-list',
) );
/*
* Enable support for Post Formats.
* See http://codex.wordpress.org/Post_Formats
*/
add_theme_support( 'post-formats', array(
'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery',
) );
// This theme allows users to set a custom background.
add_theme_support( 'custom-background', apply_filters( 'twentyfourteen_custom_background_args', array(
'default-color' => 'f5f5f5',
) ) );
// Add support for featured content.
add_theme_support( 'featured-content', array(
'featured_content_filter' => 'twentyfourteen_get_featured_posts',
'max_posts' => 6,
) );
// This theme uses its own gallery styles.
add_filter( 'use_default_gallery_style', '__return_false' );
}
endif; // twentyfourteen_setup
add_action( 'after_setup_theme', 'twentyfourteen_setup' );
/**
* Adjust content_width value for image attachment template.
*
* @since Twenty Fourteen 1.0
*
* @return void
*/
function twentyfourteen_content_width() {
if ( is_attachment() && wp_attachment_is_image() ) {
$GLOBALS['content_width'] = 810;
}
}
add_action( 'template_redirect', 'twentyfourteen_content_width' );
/**
* Getter function for Featured Content Plugin.
*
* @since Twenty Fourteen 1.0
*
* @return array An array of WP_Post objects.
*/
function twentyfourteen_get_featured_posts() {
/**
* Filter the featured posts to return in Twenty Fourteen.
*
* @since Twenty Fourteen 1.0
*
* @param array|bool $posts Array of featured posts, otherwise false.
*/
return apply_filters( 'twentyfourteen_get_featured_posts', array() );
}
/**
* A helper conditional function that returns a boolean value.
*
* @since Twenty Fourteen 1.0
*
* @return bool Whether there are featured posts.
*/
function twentyfourteen_has_featured_posts() {
return ! is_paged() && (bool) twentyfourteen_get_featured_posts();
}
/**
* Register three Twenty Fourteen widget areas.
*
* @since Twenty Fourteen 1.0
*
* @return void
*/
function twentyfourteen_widgets_init() {
require get_template_directory() . '/inc/widgets.php';
register_widget( 'Twenty_Fourteen_Ephemera_Widget' );
register_sidebar( array(
'name' => __( 'Primary Sidebar', 'twentyfourteen' ),
'id' => 'sidebar-1',
'description' => __( 'Main sidebar that appears on the left.', 'twentyfourteen' ),
'before_widget' => '<aside id="%1$s" class="widget %2$s">',
'after_widget' => '</aside>',
'before_title' => '<h1 class="widget-title">',
'after_title' => '</h1>',
) );
register_sidebar( array(
'name' => __( 'Content Sidebar', 'twentyfourteen' ),
'id' => 'sidebar-2',
'description' => __( 'Additional sidebar that appears on the right.', 'twentyfourteen' ),
'before_widget' => '<aside id="%1$s" class="widget %2$s">',
'after_widget' => '</aside>',
'before_title' => '<h1 class="widget-title">',
'after_title' => '</h1>',
) );
register_sidebar( array(
'name' => __( 'Footer Widget Area', 'twentyfourteen' ),
'id' => 'sidebar-3',
'description' => __( 'Appears in the footer section of the site.', 'twentyfourteen' ),
'before_widget' => '<aside id="%1$s" class="widget %2$s">',
'after_widget' => '</aside>',
'before_title' => '<h1 class="widget-title">',
'after_title' => '</h1>',
) );
}
add_action( 'widgets_init', 'twentyfourteen_widgets_init' );
/**
* Register Lato Google font for Twenty Fourteen.
*
* @since Twenty Fourteen 1.0
*
* @return string
*/
function twentyfourteen_font_url() {
$font_url = '';
/*
* Translators: If there are characters in your language that are not supported
* by Lato, translate this to 'off'. Do not translate into your own language.
*/
if ( 'off' !== _x( 'on', 'Lato font: on or off', 'twentyfourteen' ) ) {
$font_url = add_query_arg( 'family', urlencode( 'Lato:300,400,700,900,300italic,400italic,700italic' ), "//fonts.googleapis.com/css" );
}
return $font_url;
}
/**
* Enqueue scripts and styles for the front end.
*
* @since Twenty Fourteen 1.0
*
* @return void
*/
function twentyfourteen_scripts() {
// Add Lato font, used in the main stylesheet.
wp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null );
// Add Genericons font, used in the main stylesheet.
wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.0.2' );
// Load our main stylesheet.
wp_enqueue_style( 'twentyfourteen-style', get_stylesheet_uri(), array( 'genericons' ) );
// Load the Internet Explorer specific stylesheet.
wp_enqueue_style( 'twentyfourteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfourteen-style', 'genericons' ), '20131205' );
wp_style_add_data( 'twentyfourteen-ie', 'conditional', 'lt IE 9' );
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
if ( is_singular() && wp_attachment_is_image() ) {
wp_enqueue_script( 'twentyfourteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20130402' );
}
if ( is_active_sidebar( 'sidebar-3' ) ) {
wp_enqueue_script( 'jquery-masonry' );
}
if ( is_front_page() && 'slider' == get_theme_mod( 'featured_content_layout' ) ) {
wp_enqueue_script( 'twentyfourteen-slider', get_template_directory_uri() . '/js/slider.js', array( 'jquery' ), '20131205', true );
wp_localize_script( 'twentyfourteen-slider', 'featuredSliderDefaults', array(
'prevText' => __( 'Previous', 'twentyfourteen' ),
'nextText' => __( 'Next', 'twentyfourteen' )
) );
}
wp_enqueue_script( 'twentyfourteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20131209', true );
}
add_action( 'wp_enqueue_scripts', 'twentyfourteen_scripts' );
/**
* Enqueue Google fonts style to admin screen for custom header display.
*
* @since Twenty Fourteen 1.0
*
* @return void
*/
function twentyfourteen_admin_fonts() {
wp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null );
}
add_action( 'admin_print_scripts-appearance_page_custom-header', 'twentyfourteen_admin_fonts' );
if ( ! function_exists( 'twentyfourteen_the_attached_image' ) ) :
/**
* Print the attached image with a link to the next attached image.
*
* @since Twenty Fourteen 1.0
*
* @return void
*/
function twentyfourteen_the_attached_image() {
$post = get_post();
/**
* Filter the default Twenty Fourteen attachment size.
*
* @since Twenty Fourteen 1.0
*
* @param array $dimensions {
* An array of height and width dimensions.
*
* @type int $height Height of the image in pixels. Default 810.
* @type int $width Width of the image in pixels. Default 810.
* }
*/
$attachment_size = apply_filters( 'twentyfourteen_attachment_size', array( 810, 810 ) );
$next_attachment_url = wp_get_attachment_url();
/*
* Grab the IDs of all the image attachments in a gallery so we can get the URL
* of the next adjacent image in a gallery, or the first image (if we're
* looking at the last image in a gallery), or, in a gallery of one, just the
* link to that image file.
*/
$attachment_ids = get_posts( array(
'post_parent' => $post->post_parent,
'fields' => 'ids',
'numberposts' => -1,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'ASC',
'orderby' => 'menu_order ID',
) );
// If there is more than 1 attachment in a gallery...
if ( count( $attachment_ids ) > 1 ) {
foreach ( $attachment_ids as $attachment_id ) {
if ( $attachment_id == $post->ID ) {
$next_id = current( $attachment_ids );
break;
}
}
// get the URL of the next image attachment...
if ( $next_id ) {
$next_attachment_url = get_attachment_link( $next_id );
}
// or get the URL of the first image attachment.
else {
$next_attachment_url = get_attachment_link( array_shift( $attachment_ids ) );
}
}
printf( '<a href="%1$s" rel="attachment">%2$s</a>',
esc_url( $next_attachment_url ),
wp_get_attachment_image( $post->ID, $attachment_size )
);
}
endif;
if ( ! function_exists( 'twentyfourteen_list_authors' ) ) :
/**
* Print a list of all site contributors who published at least one post.
*
* @since Twenty Fourteen 1.0
*
* @return void
*/
function twentyfourteen_list_authors() {
$contributor_ids = get_users( array(
'fields' => 'ID',
'orderby' => 'post_count',
'order' => 'DESC',
'who' => 'authors',
) );
foreach ( $contributor_ids as $contributor_id ) :
$post_count = count_user_posts( $contributor_id );
// Move on if user has not published a post (yet).
if ( ! $post_count ) {
continue;
}
?>
<div class="contributor">
<div class="contributor-info">
<div class="contributor-avatar"><?php echo get_avatar( $contributor_id, 132 ); ?></div>
<div class="contributor-summary">
<h2 class="contributor-name"><?php echo get_the_author_meta( 'display_name', $contributor_id ); ?></h2>
<p class="contributor-bio">
<?php echo get_the_author_meta( 'description', $contributor_id ); ?>
</p>
<a class="contributor-posts-link" href="<?php echo esc_url( get_author_posts_url( $contributor_id ) ); ?>">
<?php printf( _n( '%d Article', '%d Articles', $post_count, 'twentyfourteen' ), $post_count ); ?>
</a>
</div><!-- .contributor-summary -->
</div><!-- .contributor-info -->
</div><!-- .contributor -->
<?php
endforeach;
}
endif;
/**
* Extend the default WordPress body classes.
*
* Adds body classes to denote:
* 1. Single or multiple authors.
* 2. Presence of header image.
* 3. Index views.
* 4. Full-width content layout.
* 5. Presence of footer widgets.
* 6. Single views.
* 7. Featured content layout.
*
* @since Twenty Fourteen 1.0
*
* @param array $classes A list of existing body class values.
* @return array The filtered body class list.
*/
function twentyfourteen_body_classes( $classes ) {
if ( is_multi_author() ) {
$classes[] = 'group-blog';
}
if ( get_header_image() ) {
$classes[] = 'header-image';
} else {
$classes[] = 'masthead-fixed';
}
if ( is_archive() || is_search() || is_home() ) {
$classes[] = 'list-view';
}
if ( ( ! is_active_sidebar( 'sidebar-2' ) )
|| is_page_template( 'page-templates/full-width.php' )
|| is_page_template( 'page-templates/contributors.php' )
|| is_attachment() ) {
$classes[] = 'full-width';
}
if ( is_active_sidebar( 'sidebar-3' ) ) {
$classes[] = 'footer-widgets';
}
if ( is_singular() && ! is_front_page() ) {
$classes[] = 'singular';
}
if ( is_front_page() && 'slider' == get_theme_mod( 'featured_content_layout' ) ) {
$classes[] = 'slider';
} elseif ( is_front_page() ) {
$classes[] = 'grid';
}
return $classes;
}
add_filter( 'body_class', 'twentyfourteen_body_classes' );
/**
* Extend the default WordPress post classes.
*
* Adds a post class to denote:
* Non-password protected page with a post thumbnail.
*
* @since Twenty Fourteen 1.0
*
* @param array $classes A list of existing post class values.
* @return array The filtered post class list.
*/
function twentyfourteen_post_classes( $classes ) {
if ( ! post_password_required() && has_post_thumbnail() ) {
$classes[] = 'has-post-thumbnail';
}
return $classes;
}
add_filter( 'post_class', 'twentyfourteen_post_classes' );
/**
* Create a nicely formatted and more specific title element text for output
* in head of document, based on current view.
*
* @since Twenty Fourteen 1.0
*
* @param string $title Default title text for current view.
* @param string $sep Optional separator.
* @return string The filtered title.
*/
function twentyfourteen_wp_title( $title, $sep ) {
global $paged, $page;
if ( is_feed() ) {
return $title;
}
// Add the site name.
$title .= get_bloginfo( 'name' );
// Add the site description for the home/front page.
$site_description = get_bloginfo( 'description', 'display' );
if ( $site_description && ( is_home() || is_front_page() ) ) {
$title = "$title $sep $site_description";
}
// Add a page number if necessary.
if ( $paged >= 2 || $page >= 2 ) {
$title = "$title $sep " . sprintf( __( 'Page %s', 'twentyfourteen' ), max( $paged, $page ) );
}
return $title;
}
add_filter( 'wp_title', 'twentyfourteen_wp_title', 10, 2 );
// Implement Custom Header features.
require get_template_directory() . '/inc/custom-header.php';
// Custom template tags for this theme.
require get_template_directory() . '/inc/template-tags.php';
// Add Theme Customizer functionality.
require get_template_directory() . '/inc/customizer.php';
/*
* Add Featured Content functionality.
*
* To overwrite in a plugin, define your own Featured_Content class on or
* before the 'setup_theme' hook.
*/
if ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) {
require get_template_directory() . '/inc/featured-content.php';
}

Die erste Funktion beschäftigt sich mit Setzen der maximalen Inhaltsbreite:

if ( ! isset( $content_width ) ) {
$content_width = 474;
}

Das bedeutet: Falls $content_width nicht gesetzt ist, wird es hier auf 474 Pixel gesetzt. Bilder, Videos und andere Inhalte dürfen dann maximal diese Breite haben, wenn sie in einem Beitrag eingebunden sind. Als nächstes wird festgelegt, dass Twenty Fourteen erst ab WordPress 3.6 funktioniert. Nun kommen wir zu einer ausführlicheren Funktion, dem _setup():

function twentyfourteen_setup() {
/*
* Make Twenty Fourteen available for translation.
*
* Translations can be added to the /languages/ directory.
* If you're building a theme based on Twenty Fourteen, use a find and
* replace to change 'twentyfourteen' to the name of your theme in all
* template files.
*/
load_theme_textdomain( 'twentyfourteen', get_template_directory() . '/languages' );
// This theme styles the visual editor to resemble the theme style.
add_editor_style( array( 'css/editor-style.css', twentyfourteen_font_url() ) );
// Add RSS feed links tofor posts and comments. add_theme_support( 'automatic-feed-links' ); // Enable support for Post Thumbnails, and declare two sizes. add_theme_support( 'post-thumbnails' ); set_post_thumbnail_size( 672, 372, true ); add_image_size( 'twentyfourteen-full-width', 1038, 576, true ); // This theme uses wp_nav_menu() in two locations. register_nav_menus( array( 'primary' => __( 'Top primary menu', 'twentyfourteen' ), 'secondary' => __( 'Secondary menu in left sidebar', 'twentyfourteen' ), ) ); /* * Switch default core markup for search form, comment form, and comments * to output valid HTML5. */ add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', ) ); /* * Enable support for Post Formats. * See http://codex.wordpress.org/Post_Formats */ add_theme_support( 'post-formats', array( 'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery', ) ); // This theme allows users to set a custom background. add_theme_support( 'custom-background', apply_filters( 'twentyfourteen_custom_background_args', array( 'default-color' => 'f5f5f5', ) ) ); // Add support for featured content. add_theme_support( 'featured-content', array( 'featured_content_filter' => 'twentyfourteen_get_featured_posts', 'max_posts' => 6, ) ); // This theme uses its own gallery styles. add_filter( 'use_default_gallery_style', '__return_false' ); } endif; // twentyfourteen_setup add_action( 'after_setup_theme', 'twentyfourteen_setup' );

In diesem Bereich wird unter anderem festgelegt, welche Funktionen das Theme unterstützen soll. Mit load_theme_textdomain() wird die Übersetzbarkeit des Themes ermöglicht. In den vorherigen Code-Abschnitten sind euch vielleicht schon die Strings aufgefallen, hinter denen dann noch twentyfourteen steht. Mit add_editor_style() könnt ihr das Design des Backend-Editors verändern – als Parameter übergebt ihr einfach den Pfad zur entsprechenden CSS-Datei.

Mit add_theme_support() wird hier die Unterstützung des Themes für RSS-Links und Post-Thumbnails eingerichtet. Des weiteren unterstützt das Theme beim Suchformular, Kommentarformular und der Kommentarliste HTML5, die verschiedenen Post-Formats, es gibt die Möglichkeit einen eigenen Hintergrund zu definieren und – Theme-spezifisch – wird Featured-Content unterstützt. Weitere Möglichkeiten findet ihr in der Funktionsreferenz. Außerdem werden hier die Menüs definiert, die Größe der Post-Thumbnails wird festgelegt (Breite und Höhe, der dritte Parameter bestimmt, ob die Bilder beschnitten werden sollen – bei false wird proportional skaliert, bei true wird auf die eingestellte Größe zugeschnitten) – zusätzlich wird eine spezielle Bildgröße festgelegt, die twentyfourteen-full-width, bei der die Parameter gleich sind, wie bei den Post-Thumbnails. Diese Angabe kann dann einfach ausgewählt werden, wenn die Größe des auszugebenden Bildes angegeben wird, beispielsweise so:

the_post_thumbnail( 'twentyfourteen-full-width' );

Diese Funktion twentyfourteen_setup wird nun an den Hook after_setup_theme mittels add_action() angehängt. Mit der Funktion twentyfourteen_content_width() wird die oben schon besprochene Content-Breite für die Anhang-Seiten von Bildern verändert. Die nächsten Funktionen sind erstmal nur Theme-spezifisch, deshalb werde ich sie hier kurz überspringen. Der nächste große und wichtige Block ist twentyfourteen_widgets_init(), in dem die Widgets und Sidebars registriert werden – wie oben anhand der primären Sidebar schon besprochen.

Schriftarten, besondere Stylesheets und Skripte

Nun werden Schriftarten und besondere Stylesheets und Skripte eingebunden. Das wäre natürlich auch einfach direkt in der header.php möglich, ist so aber schöner. In der Funktion twentyfourteen_font_url() wird einfach die URL zu einer Google-Font festgelegt. In der Funtion twentyfourteen_scripts() werden nun die verschiedenen Ressourcen eingebunden:

function twentyfourteen_scripts() {
// Add Lato font, used in the main stylesheet.
wp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null );
// Add Genericons font, used in the main stylesheet.
wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.0.2' );
// Load our main stylesheet.
wp_enqueue_style( 'twentyfourteen-style', get_stylesheet_uri(), array( 'genericons' ) );
// Load the Internet Explorer specific stylesheet.
wp_enqueue_style( 'twentyfourteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfourteen-style', 'genericons' ), '20131205' );
wp_style_add_data( 'twentyfourteen-ie', 'conditional', 'lt IE 9' );
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
if ( is_singular() && wp_attachment_is_image() ) {
wp_enqueue_script( 'twentyfourteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20130402' );
}
if ( is_active_sidebar( 'sidebar-3' ) ) {
wp_enqueue_script( 'jquery-masonry' );
}
if ( is_front_page() && 'slider' == get_theme_mod( 'featured_content_layout' ) ) {
wp_enqueue_script( 'twentyfourteen-slider', get_template_directory_uri() . '/js/slider.js', array( 'jquery' ), '20131205', true );
wp_localize_script( 'twentyfourteen-slider', 'featuredSliderDefaults', array(
'prevText' => __( 'Previous', 'twentyfourteen' ),
'nextText' => __( 'Next', 'twentyfourteen' )
) );
}
wp_enqueue_script( 'twentyfourteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20131209', true );
}
add_action( 'wp_enqueue_scripts', 'twentyfourteen_scripts' );

Mit der Funktion wp_enqueue_style() können Stylesheets eingebunden werden – oder auch Schriften. Die Parameter sind folgende: Zuerst ein Bezeichner, dann der Pfad zur Datei (im Fall der Schriftart ist das der Aufruf der Funktion twentyfourteen_font_url()), als drittes kann ein Stylesheet eingetragen werde, von dem das aktuelle abhängig ist – also nach dem es erst geladen werden soll. Die letzten zwei möglichen Parameter sind optional: Die Versionsnummer und eine CSS-Media-Angabe, also zum Beispiel screen. Mehr Informationen zu dieser Funktion gibt es in der Referenz.

Mit wp_style_add_data() könnt ihr ein Stylesheet von einem Conditional-Tag umschließen lassen. wp_enqueue_script() funktioniert – wer hätte das gedacht – ganz ähnlich wie wp_enqueue_style() und ist für das Einbinden von JavaScrips zuständig. Mit wp_localize_script() könnt ihr ein Skript lokalisieren. Anschließend wird die Funktion wieder mittels add_action() eingebunden, und zwar nach den Skripts und Stylesheets die WordPress einbindet.

Die nächste Funktion, die ihr vielleicht auch für euer eigenes Theme nutzen könntet, ist die twentyfourteen_the_attached_image(). Hiermit wird bei der Anhang-Seite eines Bildes dieses ausgebenen und – falls es aus einer Galerie ist – der Link zum nächsten Bild. Die Funktion twentyfourteen_list_authors() macht, was erwartet wird, und gibt eine Liste der Autoren mit mindestens einem Beitrag aus.

Mit der Funktion twentyfourteen_body_classes() werden die WordPress-Klassen des body-Tags erweitert – je nachdem, welche Eigenschaften auf die aktuelle Ansicht zutreffen. Die Funktion twentyfourteen_wp_title( $title, $sep ) hatten wir am Anfang schon kurz angerissen: Hier wird definiert, wie der Inhalt des

title
-Tags aussehen soll. Zum Schluss werden noch ein paar Dateien eingebunden, die ebenfalls Funktionen für das Theme bereitstellen.

Euer WordPress-Theme: Die style.css

Am Schluss noch ein kleiner Hinweis: Angaben zu eurem Theme, wie Version, Name und so weiter, müsst ihr in der style.css machen, das sieht dann beispielhaft so aus:

/*
Theme Name: Twenty Fourteen
Theme URI: http://wordpress.org/themes/twentyfourteen
Author: the WordPress team
Author URI: http://wordpress.org/
Description: In 2014, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier.
Version: 1.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: black, green, white, light, dark, two-columns, three-columns, left-sidebar, right-sidebar, fixed-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready
Text Domain: twentyfourteen
This theme, like WordPress, is licensed under the GPL.
Use it to make something cool, have fun, and share what you've learned with others.
*/

Falls ihr euer Theme anderen zur Verfügung stellen wollt, schaut euch mal den Beitrag über das WordPress-Theme-Directory an.

Ein kompletter Neustart muss nicht sein: Bedient euch bei anderen Themes

Es ist keine gute Idee, immer wieder bei Null anzufangen. Oft ist es hilfreich, wenn man sich in anderen Themes Schnipsel zusammensucht und sie einfach übernimmt – oder das ganze Theme auf einem anderen aufsetzt und bei dem Basis-Theme nur weitere Funktionen hinzufügt oder überflüssige entfernt. Bei der style.css kann man ja bequem von vorne anfangen. Ebenfalls eine gute Idee ist es, sich ein Blank-Theme zu erstellen, wo wirklich nur die wichtigsten Funktionen implementiert sind. Auf dem könnt ihr dann eure zukünftigen Themes aufbauen.

Wenn ihr noch Fragen zu WordPress-Theme-Funktionen oder generell zu habt, schreibt einfach einen Kommentar unter diesen Artikel!

]]>
Florian Brinkmann
WordPress: Statistik-Feature in Version 4.0 für iOS veröffentlicht http://t3n.de/news/wordpress-statistik-feature-535678/ 2014-03-21T06:20:49Z
WordPress hat eine neue iOS-Version der beliebten Blog-Software veröffentlicht. Hauptfeature des Updates ist die bessere Darstellung der Statistiken.

WordPress hat eine neue iOS-Version der beliebten Blog-Software veröffentlicht. Hauptfeature des Updates ist die bessere Darstellung der Statistiken. Damit Webworker die eigene WordPress-Installation auch auf mobilen Geräten verwalten können, bieten die Macher der Blog-Software eigene Applikationen für verschiedene Anbieter an: zum Beispiel für BlackBerry, Android und auch für .

wordpress
WordPress: Die Statistik zeigt euch die Auswertung eures Blogs. (Screenshot: WordPress)

Gestern ist die iOS-Version in der vierten Version veröffentlicht worden, die hauptsächlich die Darstellung der Statistiken verbessert. Dabei wurde das Statistik-Feature von einer klassischen Web-Ansicht in eine native Komponente überführt, was eine Erhöhung der Performance und der Stabilität der App zur Folge haben soll. Darüber hinaus hat WordPress auch eine generelle Erweiterung des Funktionsumfangs für die Statistik angekündigt. Ganz im Sinne von „Perpetual Beta“ sieht WordPress die Entwicklung als „Work in progress“ und stellt die alte Statistik als Web-Ansicht weiterhin zur Verfügung.

WordPress für iOS: Ein Ausblick

Das Team hinter der iOS-App-Entwicklung arbeitet schon an Version 4.0.1, die sich in Perpetual-Beta-Manier um Bugfixes und Verbesserungen drehen wird. Danach haben die Entwickler die Entwicklung von Version 4.1 geplant. Bei Version 4.1 wird der Fokus hauptsächlich auf einer Überarbeitung des Media-Managements der iOS-App liegen.

Wenn ihr euch selbst an der Entwicklung neuer iOS-Versionen für beteiligen wollt, könnt ihr das hier tun. Ihr könnt euch den Quellcode der iOS-App auch bei GitHub runterladen.

WordPress WordPress @ App Store
Preis: Kostenlos

Benutzt ihr WordPress auf eurem iPhone oder iPad?

]]>
Mario Janschitz
Wagtail: Flexibles Django-Open-Source-CMS mit Fokus auf Usability http://t3n.de/news/wagtail-flexibles-django-cms-534836/ 2014-03-17T14:46:14Z
Wagtail ist ein CMS, das auf dem Python-Framework Django basiert und den Fokus auf große und komplexe Webprojekte legt. Der Vorteil: ein CMS für den Inhalteersteller, das aber auch für Entwickler.. ...

Wagtail ist ein CMS, das auf dem Python-Framework Django basiert und den Fokus auf große und komplexe Webprojekte legt. Der Vorteil: ein CMS für den Inhalteersteller, das aber auch für Entwickler erweiterbar bleibt. Wir stellen es euch kurz vor. Es wird auch als das Python-Gegenstück zu Ruby on gehandelt: Django. Das mit geschriebene MVC-Framework wird unter anderem von Pinterest, Mozilla, der Washington Times und Instagram eingesetzt. Nicht zuletzt wegen der guten Eignung, komplexe Webprojekte umsetzen zu können. Genau auf diesen Zug springt ein neues auf, das neben bekannten Django-Größen wie Mezzanine oder Fein erstrahlen will: Wagtail.

Das Open-Source-CMS-Wagtail zeichnet sich durch gutes UI-Design und damit verbunden eine einfache Bedienung aus. Es ist voll responsive und somit auch geeignet, um Inhalte unterwegs zu kreieren. Möglich macht das ein ziemlich guter Inline-Editor, der euch das Erstellen und Editieren von Texten erleichtert – und genau da sieht Wagtail seine größte Stärke.

Dabei versucht Wagtail, die Besonderheiten, die große und komplexe Webprojekte mit sich bringen, zu bedienen. Durch die Verwendung von Django sind das Hinzufügen und die Eigenentwicklung von weiteren Features kein großer Aufwand – vor allem, da Wagtail mit dem Hingergedanken auf Weiterentwicklung spezifiziert wurde – hat sich Django doch gerade die Wiederverwendbarkeit auf die Fahne geschrieben.

Hinter dem CMS steht Torchbox, eigentlich eine Drupal-Agentur mit Sitz in England. Sie bietet auch ein Video-Showcase zur Webseite des „Royal College of Art“ an – realisiert mit Wagtail.

Ihr findet Wagtail natürlich auch auf GitHub.

Wie steht ihr zu CM-Systemen, die auf Python setzen? Habt ihr schon mal ein Django-CMS eingesetzt?

]]>
Mario Janschitz
Inspiring Conference: Networking mit dem Who-Is-Who der TYPO3-Szene [Ticketverlosung] http://t3n.de/news/inspiring-conference-networking-533997/ 2014-03-12T13:50:32Z
Ende März trifft sich die TYPO3-Szene zur Inspiring Conference in Kolbermoor. Besucher können sich auf Vorträge von bekannten TYPO3-Köpfen freuen.

Ende März trifft sich die TYPO3-Szene zur Inspiring Conference in Kolbermoor. Besucher können sich auf Vorträge von bekannten TYPO3-Köpfen freuen.

Vom 28. bis zum 29. März 2014 findet in Kolbermoor die Inspiring Conference statt. Bereits zum dritten Mal trifft sich auf dem Event das Who-is-Who der TYPO3-Szene, um sich beim umfangreichen Konferenz-Programm über Flow und TYPO3 Neos zu informieren und auszutauschen.

Inspiring Conference: Bekannte TYPO3-Köpfe als Speaker

Auf dem ehemals als Inspiring Flow Conference bekannten Event können sich Besucher auf mehr als 15 Speaker freuen, viele davon sehr bekannt in der TYPO3-Szene. Die Keynote beispielsweise hält Robert Lemke, Karsten Dambekalns spricht über die Migration von TYPO3 CMS zu TYPO3 Neos und mit dem Titel „The Driven Developer” verspricht auch Sebstian Bergmann einen spannenden Vortrag.

Auch im letzten Jahr konnten 200 Besucher interessanten Vorträge besuchen. (Foto: Veranstalter)
Auch im letzten Jahr konnten 200 Besucher interessante Vorträge besuchen. (Foto: Veranstalter)

Drei Tickets für t3n-Leser

Mit etwas Glück haben drei t3n-Leser die Möglichkeit, ein Ticket für die Konferenztage der Inspiring Conference im Wert von jeweils 320 Euro zu gewinnen. Unter allen Lesern, die unseren Newsletter abonnieren, verlosen wir jeweils ein Ticket. Natürlich könnt ihr auch teilnehmen, wenn ihr unseren Newsletter bereits erhaltet, dazu müsst ihr einfach die E-Mail-Adresse eintragen, mit der ihr angemeldet seid. Das Gewinnspiel läuft bis Freitag, 14. März 2014, 15:00 Uhr.

Jetzt für den t3n-Newsletter anmelden

Die Inspiring Conference im Überblick

Datum und Ort:

  • 28. bis 29. März 2014
  • Kolbermoor

Themen:

  • TYPO3 Flow
  • TYPO3 Neos

Tickets

Mit einem Klick auf den unten stehenden Screenshot gelangst du zur offiziellen Seite der Inspiring Conference und der Anmeldung.

inspiring-conference-tickets

]]>
t3n Redaktion
WordPress Theme Directory: Die Plattform für dein WordPress-Theme http://t3n.de/news/wordpress-theme-directory-533904/ 2014-03-12T10:28:33Z
Wenn ihr ein WordPress-Theme entwickelt, das ihr anderen kostenlos zur Verfügung stellen möchtet, ist die naheliegendste Plattform dafür das WordPress Theme Directory. Was es vor dem Upload zu...

Wenn ihr ein WordPress-Theme entwickelt, das ihr anderen kostenlos zur Verfügung stellen möchtet, ist die naheliegendste Plattform dafür das WordPress Theme Directory. Was es vor dem Upload zu beachten gibt, beschreiben wir in diesem Artikel.

Wenn ihr euch die Mühe gemacht habt ein WordPress-Theme zu entwickeln, das auch andere nutzen dürfen und sollen, dann möchtet ihr vermutlich auch, dass es von möglichst vielen genutzt wird. Das Theme Directory ist hierfür ein gut geeigneter Platz. Doch bevor ein Theme dort angenommen wird, müssen einige Richtlinien eingehalten werden. Diese sind im Wiki – dem WordPress Codex – gut dokumentiert, aber nicht immer leicht zu finden. Wir werden euch deshalb einen Überblick über die verschiedenen Richtlinien und weiterführende Links an die Hand geben, damit ihr euer WordPress-Theme gut auf das Theme Directory vorbereiten könnt.

Über 2.300 kostenlose WordPress Themes an einen Ort: Das WordPress Theme Directory. (Screenshot: WordPress.org)
Über 2.300 kostenlose WordPress Themes an einen Ort: Das WordPress Theme Directory. (Screenshot: WordPress.org)

WordPress Theme Directory: Die Vorbereitung

Die Testdaten, mit denen auch die Tester bei WordPress.org euer Theme prüfen, könnt ihr über den Punkt „Werkzeuge>Daten importieren“ in euer Test-Blog importieren. Dann könnt ihr euch das Plugin „Developer“ – eine Sammlung von nützlichen Tools – installieren, das euch Anhaltspunkte liefert, was mit eurem Code eventuell nicht stimmt. In der wp-config.php stellt ihr dann WP_DEBUG auf true.

Was muss ein Theme für das WordPress Theme Directory können? Antwort gibt WordPress.org

Auf der Seite „Guidlines: Theme Check“ findet ihr die WordPress-Funktionen, die in eurem Theme integriert sein müssen. Die Funktionen werden hier allerdings nur kurz aufgelistet, ohne eine detailliertere Erklärung. Die Seite „Theme Development“ ist eine gute Anlaufstelle für diese detaillierteren Informationen. Hier findet ihr beispielsweise die Angaben, die in dem Stylesheet-Header gemacht werden können, aus welchen Dateien ein WordPress-Theme mindestens zu bestehen hat oder dass das Design komplett übersetzungsfähig sein muss.

Ein Theme muss neben den ganzen PHP-Dateien auch eine readme-Datei enthalten. Hier ist ein Changelog anzulegen, sowie ein Lizenzhinweis für das Theme und alle genutzten Bibliotheken/Schriftarten/Icon-Sets et cetera. Da das komplette Theme 100% GPL – oder mit einer kompatiblen Lizenz – lizensiert sein muss ist es wichtig, dass diese Ressourcen unter einer der hier angegebenen Lizenzen veröffentlicht sind. Allgemeinere Informationen zur Lizensierung und wie euer Theme heißen darf, findet ihr auf der Site „Guidelines: License, Theme Name, Credit Links, Up-Sell Themes“.

Es gibt auch einige Vorgaben zum Punkt Zugänglichkeit, die für das WordPress Theme Directory erfüllt sein müssen. Unter anderem müssen alle dekorativen Bilder per CSS eingebunden werden, andere Bilder müssen ein alt-Attribut erhalten. Video- und Audio-Dateien dürfen nicht automatisch starten und das Theme muss auch per Tastatur bedienbar sein. Das Theme darf keine Analytics-Skripte oder andere Funktionen enthalten, die sonst Plugins übernehmen.

Die Feuerprobe: Die Prüfung des Themes

Ein gutes Zeichen: Der Theme-Check liefert keine Fehler oder Warnungen mehr. (Screenshot: eigene Installation)
Ein gutes Zeichen: Der Theme-Check liefert keine Fehler oder Warnungen mehr. (Screenshot: eigene Installation)

Wenn ihr glaubt alles standardkonform umgesetzt zu haben, und der Test mit dem Plugin „Theme-Check“ (wird automatisch mit dem Plugin „Developer“ installiert) auch keine Fehler oder Warnungen mehr auswirft, könnt ihr euer Theme beim WordPress Theme Directory hochladen (hierzu wird ein Account bei WordPress.org benötigt).

Anschließend wird euer Theme geprüft. Ihr bekommt einen Link zu einem Ticket, wo dann nach der Prüfung entweder nur vermerkt wird, dass das Theme live ist. Oder es wird, was beim ersten Mal wahrscheinlicher ist, erwähnt, welche Fehler gefunden wurden. Diese Fehler gilt es nun zu beheben, um dann eine neue Version des Themes hochzuladen. Wenn ihr Fragen an den Prüfer habt, gibt es unter dem Ticket die Möglichkeit, Kommentare zu posten.

Fehlt euch noch ein wichtiger Punkt, den ihr gerne genauer erklärt haben wollt, weil ihr dazu in der Dokumentation nichts gefunden habt? Schreibt einfach einen Kommentar mit eurer Frage unter den Beitrag.

]]>
Florian Brinkmann
WordPress 3: SEO für WordPress [t3n-Video-Workshop] http://t3n.de/news/wordpress-3-seo-532876/ 2014-03-07T09:54:43Z
Heute führen wir auf t3n.de die Video-Serie weiter, in der wir euch in Zusammenarbeit mit Galileo Press Video-Workshops zu verschiedenen Themen für Webentwickler und Digitalarbeiter präsentieren... ...

Heute führen wir auf t3n.de die Video-Serie weiter, in der wir euch in Zusammenarbeit mit Galileo Press Video-Workshops zu verschiedenen Themen für Webentwickler und Digitalarbeiter präsentieren. Das heutige Thema: „WordPress 3: Suchmaschinenoptimierung für WordPress”.

In Bereich der Suchmaschinenoptimierung lässt sich grob zwischen Onpage- und Offpage-Optimierung unterscheiden. Im neuen t3n-Video-Workshop zeigt euch Trainer Jonas Hellwig, wie ihr bei eurer WordPress-3-Installation die Onpage-Optimierung verbessert. Angefangen bei den richtigen Einstellungen über das Anpassen der Seitentitel und der Meta-Description bis hin zur Anlegung einer XML-Sitemap.

Noch mehr Video-Workshops

Noch nicht genug zum Thema Webentwicklung? Hier gelangst du zum letzten Teil unserer Serie. Darin bekommst du eine Einführung in die CSS3-Box-Modell-Alternative Flexbox.

galileo-press-wordpress-3 In den nächsten Video-Workshops wird es um Themen aus den Bereichen HTML5 & CSS3, und Facebook-Marketing gehen. Wer mehr zum Thema erfahren will, der kann sich kostenfrei zum Beispiel knapp eine Stunde Videos aus dem Training (Affiliate-Link) von Jonas Hellwig anschauen.

]]>
Johannes Schuba
Das erste Blog erstellen: Der t3n-Guide mit Tipps für Wordpress, Ghost und Co. http://t3n.de/news/blog-erstellen-bloggen-lernen-guide-tipps-528888/ 2014-02-23T12:07:03Z
Wer ein Blog erstellen will, sollte einige Dinge beachten. Das beginnt bei dem System, auf dem das Blog laufen soll und endet beim Verteilen der Inhalte. Die t3n-Checkliste mit Blog-Tipps für...

Wer ein Blog erstellen will, sollte einige Dinge beachten. Das beginnt bei dem System, auf dem das Blog laufen soll und endet beim Verteilen der Inhalte. Die t3n-Checkliste mit Blog-Tipps für Einsteiger.

Bloggen: Die Qual der Wahl

Möglichkeiten, ein zu führen, gibt es viele – und ständig kommen neue dazu. Es gibt Plattformen, auf denen ihr nur einen Account erstellen müsst und sofort bloggen könnt. Und es gibt unzählige Anbieter für Blog-Software, die ihr auf dem eigenen Webspace installieren könnt. Wir stellen euch die bekanntesten und geeignetsten Lösungen vor.

Mit diesen Lösungen steht dem eigenen Blog nichts mehr im Weg – womit ihr in guter Gesellschaft seid. 173 Millionen Blogs gab es Ende 2011, heute dürften es vermutlich also weit über 200 Millionen sein. Solltet ihr übrigens anfangs nicht wissen, worüber ihr schreiben sollt: 10 Quellen für erstklassigen Content hat der Kollege Andreas Weck für euch zusammengestellt.

Das meistgenutzte Blog-System der Welt: WordPress

WordPress ist das meist eingesetzte CMS und Blogsystem. (Grafik: WordPress)
WordPress ist das meist eingesetzte CMS und Blogsystem. (Grafik: WordPress)

WordPress ist das bekannteste und meistgenutzte Content-Management-System (CMS) weltweit. Ursprünglich als reine Blog-Software gestartet, kann es auch problemlos dazu genutzt werden, „richtige” Websites zu betreiben. Bei gibt es zwei Möglichkeiten: Entweder ihr nutzt die Plattform WordPress.com oder eine selbst gehostete Version. Wenn ihr einfach nur loslegen oder erstmal ausprobieren wollt, könnte WordPress.com das richtige sein. Bei der Registrierung könnt ihr aus drei Paketen wählen: „WordPress.com Anfänger” (kostenlos), „WordPress.com Premium” (aktuell 80 Euro pro Jahr) und „WordPress.com Business” (240 Euro pro Jahr) stehen hier zur Auswahl.

In dem Anfänger-Paket mit drei Gigabyte Speicherplatz kann keine benutzerdefinierte Domain gewählt werden. Außerdem wird in diesem Paket Werbung eingebunden und das Design eines gewählten Themes (Schriftarten et cetera) kann nicht individuell angepasst werden. Premium-Themes sind nicht möglich, ebenso wenig das Hochladen und Abspielen von HD-Videos direkt auf der eigenen Seite. Support kommt hier von der Community.

In der Premium-Version mit 13 Gigabyte sind dann die meisten Einschränkungen der Anfänger-Version aufgehoben. Nur Premium-Themes sind weiterhin nicht möglich. Support gibt es neben der Community per E-Mail. Das Business-Paket lässt dann kaum Wünsche offen: Neben unbegrenztem Speicherplatz und ebenso uneingeschränkter Anzahl von Premium-Themes bekommt man Support komfortabel per Live-Chat.

WordPress.com bietet verschiedene Blog-Pakete an. (Screenshot: WordPress.com)
WordPress.com bietet verschiedene Blog-Pakete an. (Screenshot: WordPress.com)

Nach erfolgreicher Registrierung mit Bestätigung der eigenen E-Mail-Adresse kann es losgehen. Nach der ersten Anmeldung bekommt ihr Empfehlungen für Blogs, denen ihr folgen könntet. Wechselt ihr dann zum gerade eingerichteten Blog könnt ihr direkt starten. Für euer WordPress.com Blog könnt ihr Themes von der offiziellen Seite beziehen. Aktuell gibt es 142 kostenlose und 93 Premium Themes. Selbst erstellte Themes können nicht hochgeladen werden.

Von der Registrierung bis zum ersten Artikel sind es mit WordPress.com kaum fünf Minuten. Umfangreiche Anpassungen im Design sind aber beispielsweise erst ab der Premium-Version möglich. Hinzu kommt, dass es nur relativ wenige Themes zur Auswahl gibt und keine Plugins hochgeladen werden können. Trotz dieser Einschränkungen laufen viele populäre Seiten mit WordPress.com – zum Beispiel TechCrunch.

Blog-Tipps: Die eigene WordPress-Installation

Die zweite Möglichkeit bei WordPress ist eine eigene Installation. Hier habt ihr dann alle Freiheiten, die WordPress zu bieten hat. Ergänzend zu dieser kurzen Anleitung könnt ihr euch nebenher die von Ilja Zaglov beschriebenen 10 Blog-Tipps zu vermeidbaren Anfängerfehler anschauen.

Eine aktuelle WordPress-Installation 3.8.1 benötigt eine MySQL-Datenbank mit mindestens MySQL 5.0 und PHP 5.2.4 oder höher. Bestenfalls habt ihr bei eurem Hoster neben einem FTP-Zugang einen SSH-Zugang, womit unter anderem eine verschlüsselte Übertragung möglich ist. Außerdem geht die Installation mit SSH schneller von der Hand. Ein eigener Server oder ein virtueller Server sind keine Voraussetzung, ein Webhosting-Paket tut es vollkommen. Drei Hosting-Anbieter werden auch auf der offiziellen Seite wordpress.org vorgestellt.

Bevor ihr WordPress installieren könnt, müsst ihr die Dateien erst mal auf dem Webspace bereitstellen. Die aktuelle Version in deutscher Sprache könnt ihr euch auf der Seite von WordPress Deutschland runterladen, die englische Version über WordPress.org. Wenn ihr einen SSH-Zugang zu eurem Webspace habt, könnt ihr euch den Download der zip-Datei sparen. Verbindet euch mit eurem Webspace (wie das geht, erfahrt ihr bei eurem Hostingprovider) und wechselt in der Kommandozeile in den Ordner, in dem ihr eure Installation haben wollt. Das geht mit dem Befehl:

cd hierDerPfad

Holt euch die Dateien auf euren Webspace und entpackt das Archiv. Je nachdem, ob ihr die deutsche oder englische Version nutzen woll, passt den Link und den Archivnamen an:

wget http://wordpress.org/latest.zip
unzip latest.zip

Nun liegt in dem Ordner eurer Wahl ein Ordner mit dem Namen wordpress. Die Dateien aus dem Ordner sollten eine Ebene höher in den Ordner kopiert werden, auf das eure Domain für das Blog verweist. Außerdem sollten anschließend der wordpress-Ordner und das Archiv gelöscht werden. Auch hier muss wieder der Code angepasst werden, je nachdem, wie das Archiv heißt.

mv wordpress/* ./
rmdir ./wordpress/
rm -f latest.zip

Weiter geht es mit der Installation: Wenn euch nur FTP zur Verfügung steht, dann müsst ihr das zip-Archiv zuerst runterladen. Anschließend entpackt ihr das Archiv und ladet den Inhalt des Ordners wordpress auf euren Webspace. Nachdem ihr jetzt alle Dateien auf dem Webspace habt, muss eine Datenbank angelegt werden (falls noch nicht vorhanden). Das geht im Administrationsbereich eures Hosters. Sucht euch in dem Bereich der Datenbanken anschließend die Informationen Benutzername, Datenbankname, Datenbankpasswort und Datenbankhost (eventuell einfach localhost, fragt im Zweifel euren Hoster).

Wenn ihr alle Daten beisammen habt, öffnet die Datei wp-config-sample.php in einem Editor (beispielsweise Notepad++). Die findet ihr in dem Ordner auf eurem Webspace, in dem ihr die WordPress-Dateien entpackt oder hochgeladen habt. Im oberen Bereich der Datei solltet ihr folgenden Abschnitt finden:

define('DB_NAME', 'database_name_here');
/** MySQL database username */
define('DB_USER', 'username_here');
/** MySQL database password */
define('DB_PASSWORD', 'password_here');
/** MySQL hostname */
define('DB_HOST', 'localhost');

Ersetzt hier die Platzhalter durch die Daten, die ihr euch im Konfigurationsbereich eures Anbieters herausgesucht habt. Weiter unten findet ihr folgenden Bereich, in dem ihr Authentifizierungscodes eintragen müsst:

define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');

Behilflich ist euch dabei ein Generator von WordPress.org. Ersetzt mit den generierten Zeilen einfach die aus dem obigen Ausschnitt. Noch weiter unten wird das Tabellenpräfix für die Datenbanktabellen festgelegt:

$table_prefix = 'wp_';

Hier ersetzt ihr zur besseren Sicherheit das wp durch eine längere und zufällige Zeichenfolge. Dazu könnt ihr einfach noch mal den Generator für die Sicherheitsschlüssel laden und einen Teil eines Schlüssels als neues Präfix nutzen. Jetzt speichert ihr die Datei unter dem Namen wp-config.php in dem gleichen Ordner ab und ladet sie auf den Webspace. Anschließend ruft ihr die Installationsseite auf (beispiel.de durch eure Domain ersetzen): http://beispiel.de/wp-admin/install.php. Wenn ihr die Dateien in einem Unterordner habt, passt einfach den Pfad an.

Konfigurationsseite der WordPress-Installation. (Screenshot: eigene WordPress-Installation)
Konfigurationsseite der WordPress-Installation. (Screenshot: WordPress)

Wenn bis hierhin alles funktioniert hat, sollte sich die oben abgebildete Seite öffnen. Hier gebt ihr jetzt die Informationen über euer Blog ein. Wenn WordPress erfolgreich installiert wurde, erhaltet ihr eine Erfolgsmeldung mit einem Link zur Login-Seite und habt eine voll funktionsfähige WordPress-Installation auf eurem Webspace. Wenn ihr jetzt ins Backend wollt, hängt an die Domain eures Blogs einfach ein /wp-admin an.

Jetzt solltet ihr unter „Einstellungen > Permalink“ noch die Struktur der Links eures Blogs suchmaschinen- und benutzerfreundlich anpassen.

Die Auswahl an Themes für WordPress ist groß. Eine gute Anlaufstelle ist das WordPress Themes directory. Hier gibt es aktuell 2.296 kostenlose Themes und eine Übersicht von kommerziellen Anbietern. Auch hier auf t3n.de wurden schon häufig WordPress Themes vorgestellt. Bei der eigenen WordPress-Installation ist die Einrichtung etwas aufwendiger als bei WordPress.com. Vorteil gegenüber WordPress.com ist jedoch, dass ihr Zugriff auf viele Plugins und Themes habt und alles anpassen könnt, wie es euch gefällt. Ein Nachteil ist, dass bei einer eigenen Installation mehr Eigeninitiative gefragt ist, was die technische Pflege des Blogs angeht. Hier geht es hauptsächlich um regelmäßige Updates, die aber leicht per Klick erledigt werden können.

Wenig Aufwand und sofort loslegen mit Blogger.com

Über die Schaltfläche links kann bei Blogger einfach ein neues Blog angelegt werden. (Screenshot: Blogger)
Über die Schaltfläche links kann bei Blogger einfach ein neues Blog angelegt werden. (Screenshot: Blogger)

Um ein Blog bei Blogger.com zu erstellen, benötigt ihr lediglich ein Google-Konto. Anschließend wählt ihr auf der Blogger-Site den Punkt „Neuer Blog” links in der Navigation. Nachdem ein Titel und eine Adresse festgelegt wurden, ist das Blog auch schon fertig eingerichtet. Themes sind bei Blogger sogenannte „Vorlagen”, die sich dann noch individuell über den Menüpunkt „Layout” anpassen lassen.

Blogger.com bietet eine schnelle und einfache Möglichkeit, ein Blog zu erstellen. Die individuellen Einstellungsmöglichkeiten beim Design sind ziemlich groß, gewählt werden muss aber aus relativ wenigen Vorlagen.

Eine Blog-Software für Experimentierfreudige: Ghost

Ghost ist eine junge Blog-Software, die unter der Leitung eines ehemaligen WordPress-Mitarbeiters entwickelt wurde. will sich auf das Wesentliche beschränken und eine reine Blog-Software sein. Ilja Zaglov hat das Blog-System für t3n getestet. Wie ihr das System installiert, hat Mario Janschitz in seinem Artikel beschrieben.

Es gibt die Möglichkeit, ein Ghost-Blog direkt bei ghost.org zu hosten. Die Preise beginnen hier bei fünf Dollar pro Monat für ein Blog mit maximal 10.000 Views pro Monat. Die andere Möglichkeit ist, sich einen eigenen Hoster zu suchen. Dieser muss aber Node.js unterstützen.

Es gibt natürlich noch weitere Blogging-Plattformen wie etwa Medium, das Kim Rixecker bereits hier auf t3n.de vorgestellt hat. Wenn ihr ein Foto-Blog plant, wäre auch Tumblr eine Möglichkeit.

Das Auge liest mit: Die Theme-Auswahl

viewport

Unabhängig von der Wahl der Blog-Software solltet ihr ein paar Dinge bei der Wahl des Themes beachten. Idealerweise ist das Theme responsive. Das bedeutet vereinfacht, dass sich das Design an die Breite des Viewports (Breite des Browsers) oder auf mobilen Geräten an die Gerätebreite anpasst. Damit sollten die Inhalte auf allen Geräten und in allen Situationen bestmöglich lesbar und zugänglich sein.

Wichtig ist außerdem eine gute Lesbarkeit. Wer auf einer Seite von einer Bleiwüste empfangen wird, die vielleicht auch noch schwarz auf Dunkelgrau dargestellt ist, wird schnell wieder verschwunden. Wenn es nicht zufällig zum Thema des Blogs passt, sollten darüber hinaus nicht zu viele verschiedene Farben genutzt werden. Außerdem sollte die Wirkung von Farben berücksichtigt und zueinander passende Farben verwendet werden.

Am Ende steht aber über allem der persönliche Geschmack. Wenn das Design von allen gelobt wird, ihr damit aber nicht warm werdet, solltet ihr das Theme wechseln oder anpassen, bis auch ihr zufrieden seid.

Nicht leichtfertig eine Abmahnung riskieren: Blog-Tipps für rechtliche Grundlagen

Es gibt ein paar rechtliche Aspekte, die berücksichtigt werden sollten, wenn ihr ein Blog betreibt. Allerdings können wir euch hier nur einige kurze Hinweise geben, die natürlich keine Rechtsberatung ersetzen. Dennoch: Ein korrektes und vollständiges Impressum ist wichtig. Wenn ihr nicht sicher seid, ob ihr ein Impressum braucht oder nicht, legt lieber eins an. Behilflich ist da beispielsweise der Impressums-Generator von eRecht24.

Grundsätzlich gilt: Bevor ihr ein fremdes Bild für einen Beitrag oder ähnliches verwendet, informiert euch darüber, ob und wenn ja für welchen Zweck das Bild unter welchen Bedingungen genutzt werden darf. Doch auch ein selbst aufgenommenes Bild sollte nicht ohne Nachdenken eingesetzt werden. Personen beispielsweise haben ein Recht an ihrem eigenen Bild. Bei anderen Inhalten sollte ähnlich vorgegangen werden.

Tuning für WordPress: Plugins

Gute Anlaufstelle für WordPress-Plugins: Das Plugin Directory von WordPress.org. (Screenshot: WordPress)
Gute Anlaufstelle für WordPress-Plugins: Das Plugin Directory von WordPress.org. (Screenshot: WordPress)

In diesem Abschnitt gehe ich nur auf Plugins für eine eigene WordPress-Installation ein. Bei WordPress.com gibt es keine Möglichkeit, Plugins zu installieren – an Plugins kann nur genutzt werden, was schon vorinstalliert ist. Auch bei Blogger und Ghost scheint es diese Möglichkeit nicht zu geben. Im anschließenden Backup-Teil beschäftige ich mich auch wieder mit den anderen Plattformen.

Viele kostenlose Plugins findet ihr auf der offiziellen Plugin-Seite bei WordPress.org. Ihr solltet es bei der Fülle von Plugins aber nicht übertreiben, sonst wird euer Blog schnell ausgebremst. Beschränkt euch also auf die für euch Wichtigsten und prüft immer wieder, ob ihr alle installierten Plugins noch braucht. Ein Plugin, das bei der Suchmaschinenoptimierung behilflich ist, sollte selbstverständlich für ein Blog sein. Lars Budde hat in seinem Artikel SEO-Plugins für WordPress vorgestellt. Dieser Liste hinzufügen möchte ich noch das kostenpflichtige wpSEO.

Auch ein gutes Cache-Plugin ist wichtig und kann helfen, die Inhalte schneller auszuliefern. Das muss aber nicht in allen Fällen so sein, darum heißt es testen, testen, testen! Fünf Caching-Plugins für WordPress wurden hier auf t3n.de schon vorgestellt, ebenfalls beliebt ist Cachify.

Antispam-Plugins ersparen darüber hinaus viel Ärger und Aufwand. Selbst wenn ein Blog nur wenige Besucher hat, kommen doch erstaunlich viele Spam-Kommentare zusammen. Zu empfehlen ist hier Antispam Bee. Akismet ist bei jeder WordPress-Installation vorinstalliert, datenschutzrechtlich aber nicht unumstritten, wie ihr bei WordPress Deutschland News nachlesen könnt.

Wenig geliebt und doch so wichtig: Das Backup

Ich weiß aus eigener Erfahrung, dass man sich als frisch gebackener Blogger nicht unbedingt Gedanken über Backups macht. Viel ist ja noch nicht geschrieben, was soll da groß passieren? Außerdem ist ein Server-Ausfall mit Datenverlust doch so unwahrscheinlich, es wird einen schon nicht treffen. Wenn dann aber plötzlich alle Daten weg sind, ist es in jedem Fall ärgerlich. Egal, ob erst fünf Artikel geschrieben wurden oder 100. Vielleicht war nur der Webspace betroffen und die Datenbank ist noch da. Dann sind aber trotzdem alle Bilder weg, das angepasste Theme existiert nicht mehr et cetera. Gedanken über ein regelmäßiges Backup solltet ihr euch also unabhängig von der Plattform machen.

Bei der eigenen WordPress-Installation gibt es zwei Möglichkeiten des Backups: einmal das manuelle Backup, bei dem alle Dateien händisch per FTP vom Webspace geladen werden und die Datenbank exportiert wird. Die andere Möglichkeit – per Plugin – ist weitaus komfortabler. Das Plugin BackWPup ermöglicht es, verschiedene Backup-Pläne zu erstellen. Beispielsweise könnt ihr einmal wöchentlich die Dateien plus die Datenbank sichern. Für einen Plan kann man auch mehrere Sicherungs-Methoden einstellen: Das Backup kann zum Beispiel in eine zip-Datei gesichert werden, die dann nur noch runtergeladen werden muss. Zusätzlich könnte das Backup auf einen S3-Service übertragen werden – wie Amazons S3 oder den Cloud-Storage von HostEurope.

Das Backup eines WordPress.com-Blogs wird laut Support-Site vom Anbieter übernommen – manuelle Backups sind zudem über die Export-Funktion möglichg. Ein Blog bei Blogger wird nicht automatisch gesichert. Ein Backup kann über die „Export-Blog”-Funktion allerdings erstellt werden. Bei Ghost müsst ihr euch ebenfalls selbst um Backups kümmern. Laut Ghost-Guide müsst ihr dazu, eingeloggt in die Ghost-Installation, den Pfad /ghost/debug/ aufrufen, wo ihr einen Export-Button findet.

Social Media für Blogger: Inhalte verbreiten

Wenn ein Beitrag veröffentlicht wurde, sollte dieser am Besten auch über andere Kanäle verbreitet werden, damit die Reichweite erhöht wird. Der offensichtlichste Weg ist natürlich die Verbreitung über die gängigen Sozialen Netzwerke wie Facebook, Twitter und Google+. Es bietet sich an, die Inhalte gezielt zu verteilen, bei Google+ beispielsweise in einer Community, die sich mit dem Thema befasst. Andere soziale Kanäle wie Tumblr können sinnvoll sein, wenn Bilder oder Videos Bestandteil des Beitrags sind. Ein paar Tools, die beim Crossposting behilflich sind, hat Timo Stoppacher in seinem Artikel vorgestellt.

Die Leser, die ihr schon gewonnen habt, könnt ihr per RSS-Feed und/oder Newsletter auf dem Laufenden halten. Ein Newsletter sollte nicht zu häufig verschickt werden, damit die Abonnenten nicht genervt sind.

Bloggen oder nicht? Ein Fazit

Es gibt viele Blog-Plattformen und -Software. Wenn ihr möglichst schnell bloggen wollt und geringen Aufwand schätzt, sind Plattformen wie Blogger und WordPress.com eine gute Anlaufstelle. Wer lieber mehr Kontrolle und Möglichkeiten zum Probieren und Basteln hat, dem sei WordPress ans Herz gelegt. Für die Experimentierfreudigen können neue und noch etwas instabile Systeme wie Ghost das richtige sein.

]]>
Florian Brinkmann