Nach Jahr sortierte Artikelliste einer Kategorie ausgeben

page.php bzw. custompage.php

$archive_query = new WP_Query('category_name=KATEGORIENAME&posts_per_page=-1');
 ?>
 <?php if ($archive_query->have_posts()) : ?>
 <?php $oldyear = $postyear = get_the_time('Y', $post->ID); ?>
 <h4><?php echo $postyear; ?></h4>
 <ul class="archive-posts"><?php
 while ($archive_query->have_posts()) {
 $archive_query->the_post();
 $postyear = get_the_time('Y', $post->ID);
 if ($oldyear != $postyear) {
 $oldyear = $postyear; ?>
 </ul><h4><?php echo $postyear; ?></h4><ul>
 <?php
 } ?>
 <li><?php the_time('d. F'); ?>: <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li><?php
 }
 echo '</ul>';
 else :
 endif;
 wp_reset_query(); ?>
  • KATEGORIENAME durch Kategorie-Slug ersetzen
  • Ohne Beschränkung auf eine Kategorie mittels category_name= werden alle Beiträge ausgegeben

Ergebnis ist eine Liste in folgender Form

2013

  • 10. Oktober: Beitragstitel
  • 1. März: Beitragstitel

2012

  • 3. Juli: Beitragstitel
  • 20. Februar: Beitragstitel

Mögliche Zeichenanzahl der Überschrift im Editor begrenzen

Plugin

// Zeichenzahl Überschrift begrenzen
 add_action('publish_post', 'title_max_char');
 function title_max_char() {
 global $post;
 $title = $post->post_title;
 $num_char = count(count_chars($title));
 $id = $post->ID;
 $url = $bloginfo->url;
 if (strlen($title) >= 80 )
 wp_die( "Bitte finde einen aussagekr&auml;ftigen Titel, der aus maximal 80 Zeichen besteht. Derzeit besteht er aus $num_char Zeichen.<br /><br />
 <a href="$url/wp-admin/post.php?post=$id&action=edit">Zur Bearbeitung zur&uuml;ck</a>." );
 }
  • Unter strlen($title) >= 80 kann die maximale Zeichenzahl angepasst werden.
  • Referenz

Open Graph Informationen für Facebook

header.php

<meta property="og:title" content="<?php if ( is_home() ) {  } else {  if ( is_archive() ) { echo(''); } if (  is_search() ) { echo('Suchergebnisse f&uuml;r &quot;'); echo($s); echo('&quot; – '); } else { wp_title(' - ',true,'right'); } } ?><?php bloginfo('name'); ?>" />
<meta property="og:url" content="<?php echo get_permalink(); ?>" />
<meta property="og:description" content="<?php bloginfo('description');  ?>" />
<meta property="og:image" content="http://url/image.jpg" />

Framebreaker über functions.php und wp_head

Verhindert die Anzeige des Inhalts in Frames (sog. Framebreaker).

Plugin

// Framebreaker
 function framebreaker() {
 if (!is_preview()) {
 echo "n<script type="text/javascript">";
 echo "n<!--";
 echo "nif (parent.frames.length > 0) { parent.location.href = location.href; }";
 echo "n-->";
 echo "n</script>nn";
 }
 }
 add_action('wp_head', 'framebreaker');

Referenz

Sammlung: Sicherheit für das WordPress-System

Grundsätzliches

  • WordPress, die verwendeten Themes und Plugins aktuell halten (Updates einspielen).
  • Ungenutzte Themes und Plugins löschen.
  • Sichere Passwörter verwenden. In Installationen in denen viele Benutzer registriert sind, kann das Plugin Force Strong Passwords helfen.
  • Nutzern nur die Rechte zuweisen, die sie auch benötigen. Ggf. einen zusätzlichen Zugang mit eingeschränkten Rechten für redaktionelle Arbeit außerhalb des Heimnetzes nutzen.
  • Ungenutzte Nutzer-Accounts löschen oder Rolle in Abonnent ändern.

Plugin mit diversen Sicherheitsmaßnahmen

 /*
 Plugin Name: Sicherheitsmaßnahmen
 Description: Login-Fehlermeldungen verändern, Dateibearbeitungen unterbinden, WordPress-Version komplett und Aktualisierungshinweise für Nicht-Admins verbergen.
 Version: 1.0
 */
 // Login-Fehlermeldung ohne Hinweis auf falsches Passwort bzw. falschen Nutzernamen ausgeben
 function failed_login () {
 return 'Die eingegebenen Anmeldungs-Daten sind nicht korrekt.’ }
 add_filter ( 'login_errors', 'failed_login' );
// Bearbeitung von Dateien via Administrationsbereich unterbinden
 define ( 'DISALLOW_FILE_EDIT', true );
 function remove_wp_version () { return ''; }
 add_filter ( 'the_generator', 'remove_wp_version' );
// Aktualisierungshinweis nur für Admins in Singlesite-Umgebung bzw. nur für Superadmins in Multisite-Umgebung
 add_action(
 'plugins_loaded',
 function () {
 if (( is_multisite() &amp;&amp; !current_user_can('manage_network') ) || ( !is_multisite() &amp;&amp; !current_user_can('create_users')))  {
 add_action( 'init', create_function( '$a', &quot;remove_action( 'init', 'wp_version_check' );&quot; ), 2 );
 add_filter( 'pre_option_update_core', create_function( '$a', &quot;return null;&quot; ) );
 add_filter( 'pre_site_transient_update_core', create_function( '$a', &quot;return null;&quot; ) );
 }
 }
 );
// Falls SSL verfügbar: Anmeldung über sicherere Verbindung erzwingen
// define('FORCE_SSL_ADMIN', true);

Einstellungen im Administrationsbereich

  • Unter Einstellungen > Allgemein „Jeder kann sich registrieren“ deaktivieren (WordPress MU: Unter Seite editieren „User Can Register“ Wert „0“ zuweisen)
  • Unter Einstellungen > Allgemein Standardrolle eines neuen Benutzers „Registrierter Leser“ (WordPress MU: Unter Seite editieren „Default User Role“ Wert „Subscriber“ zuweisen)

Zugriffsbeschränkungen über die .htaccess-Datei

Der Zugriff auf die Dateien .htaccess, ggf. htpasswd, wp-config.php sollte generell von außerhalb des Servers nicht nötig sein, und deswegen unterbunden werden. Die readme.html bzw. liesmich.html verrät potenziellen Angreifern die – ggf. bei noch ausstehender Aktualisierung veraltete – WordPress-Version. Das Deaktivieren der xmlrpc.php kann zusätzliche Sicherheit bringen, verhindert aber Track- und Pingpacks und den Zugriff über Drittdienste.

<FilesMatch "(.htaccess|.htpasswd|wp-config.php|readme.html|liesmich.html|xmlrpc.php)">
 order deny,allow
 deny from all
</FilesMatch>

IPs, von denen BruteForce-Attacken bekannt sind, sollten mindestens von der wp-login.php ausgesperrt werden.

<Files wp-login.php>
 Order deny,allow
 deny from 00.00.00.00
</Files>

Eine regelmäßig aktualisierte Liste „gefährlicher“ IP-Adressen gibts es im Blog von mkln.org. Die Funktion der IP-Sperre kann ggf. mit der eigenen IP überprüft werden. Alternativ bzw. erweiternd gibt es die 6G-Blacklist oder das Plugin BBQ: Block Bad Queries.

Sicherheitsrelevante Plugins

  • Die Anzahl der möglichen fehlgeschlagenen Login-Versuche kann z. B. mit Limit Login Attempts beschränkt werden.
  • Die Einbindung von Google-Fonts im Backend kann z. B. durch Disable Google Fonts verhindert werden. Das verbessert übrigens auch die Performance des Administrationsbereichs.
  • Mit dem Wordfence Security Plugin lassen sich umfangreiche Vorkehrungen treffen und etwa missglückte Logins überwachen. Auf das Limit Login Attempts-Plugin kann bei entsprechender Konfiguration dann verzichtet werden.

wp-config.php

Der Dateieditor im Administrationsbereich sollte deaktiviert werden. Gelangt ein Angreifer in den Administrationsbereich (z.B. durch ein schwaches Passwort einer Person mit Administrator-Rechten), kann er nicht über den Editor Plugins und Themes bearbeiten.

define( 'DISALLOW_FILE_EDIT', true );

Insofern SSL verfügbar ist, sollte der Login in den Administrationsbereich über SSL erzwungen werden.

define( 'FORCE_SSL_ADMIN', true );

Referenzen & Weiterführendes

Shortcode erstellen

Erstellen einer Funktion in der functions.php des benutzten Themes. Wichtig: Die Funktion muss eine Zeichenkette wiedergeben (also kein echo). Die Funktion kann Argumente $args mit einem Wert $key aufnehmen.

function new_shortcode($args) {
 // $args = array('key1' => 'value1', 'key2' => 'value2')
 $return = '';
 // Die Zeichenkette, die ausgeführt werden soll.
 return $return;
 }// Den Shortcode aktivieren
 add_shortcode('shortcode_name', 'new_routine');

Und so kann der Shortcode dann in Beiträge eingefügt und befüllt werden:

[shortcode_name key1="value1" key2="value2"]

Referenz Referenz