Basis-Domain einer Multisite-Umgebung ändern

altedomain.tld soll in neuedomain.tld geändert werden. Zunächst die wp-config.php im WordPress-Stammverzeichnis anpassen.

define('DOMAIN_CURRENT_SITE', 'neuedomain.tld');

Dann Veränderungen in der MySQL-Datenbank vornehmen.

  1. In der Tabelle prefix_options ist die altedomain.tld in neuedomain.tld zu ändern in den Zeilen siteurl und home.
  2. In der Tabelle prefix_blogs sind ggf. die Subdomains von subdomain.altedomain.de in subdomain.neuedomain.de, sowie die altedomain.de in neuedomain.tld anzupassen.
  3. In der Tabelle prefix_site ist die Spalte site anzupassen und in der Tabelle prefix_sitemeta der Wert für siteurl.

Anschließend in den Inhalten (Seiten, Beiträge) entweder via Hand in der MySQL-Datenbank oder mit einem Plugin zum Suchen und Ersetzen von Text die URIs (auch zu eingebundenen Medien) verändern.

Dashicons: Native WordPress-Icons im Theme nutzen

Die Icons im Administrationsbereich von WordPress entstammen seit Version 3.8 einer eigenen Schriftart, die unter GPL lizenziert ist. Die Dashicons lassen sich nicht nur bei der Pluginentwicklung für das Backend, sondern auch im Frontend einsetzen.

functions.php

add_action( 'wp_enqueue_scripts', 'load_dashicons_front_end' );
function load_dashicons_front_end() {
wp_enqueue_style( 'dashicons' );
}

Alternativ kann wp_enqueue_style( 'dashicons' ); in den bereits bestehenden Hook des Themes eingebunden werden.

style.css

Einbinden des WordPress-Logos vor allen Überschriften erster Ebene <h1>.

h1:before {
    content: "\f120";
    display: inline-block;
    -webkit-font-smoothing: antialiased;
    font: normal 1em 'dashicons';
    vertical-align: top;
}

wp-config: SSL, Dateibearbeitung, Autosave, Revisionen, Papierkorb

Die Datei wp-config.php ist zentral für weitgehende Einstellungen. Sofern SSL verfügbar ist, kann aus Sicherheitsgründen der Login über eine SSL-Verbindung erzwungen werden. Gleiches kann für die gesamte Nutzung des Administrationsbereichs festgelegt werden. Das Intervall zur automatischen Speicherung, dass normalerweise bei 60 Sekunden liegt und die Tage die vergehen, bis ein Beitrag endgültig aus dem Papierkorb gelöscht wird, können angepasst werden. WordPress speichert außerdem automatisch jede Version eines Beitrags, die abgespeichert wird. Dies kann die Datenbank unnötig anwachsen lassen und ebenfalls konfiguriert werden.

// Login via SSL erzwingen (Standard: false)
define('FORCE_SSL_LOGIN', true);

// Adminbereich nur über SSL nutzen (Standard: false)
define('FORCE_SSL_ADMIN', true);

// Bearbeiten von Theme- und Plugindateien im Administrationsbereich verbieten (Standard: false)
define('DISALLOW_FILE_EDIT', true);

// Installation und Aktualisierung von Themes und Plugins verbieten (Standard: false)
define('DISALLOW_FILE_MODS', true);

// Intervall für automatisches Speichern in Sekunden (Standard: 60).
define('AUTOSAVE_INTERVAL', 120 );

// Intervall für endgültiges Löschen von Beiträgen in Tagen (Standard: 30).
define('EMPTY_TRASH_DAYS', 14);

/**
  * Revisionen
  * Die automatische Speicherung jeder Version eines Beitrags kann mit
  * define('WP_POST_REVISIONS', false ); deaktiviert werden. Alternativ kann
  * eine maximale Anzahl festgelegt werden.             
*/
define('WP_POST_REVISIONS', 5 );

Referenz & Generator

Codestyling mit Prism ohne Plugin umsetzen

Das Plugin SyntaxHighlighter Evolved ist eine der Standardlösungen, wenn es um das Formatieren von Quellcode geht. Dieser Weg kann allerdings gehörig auf die Performance drücken. Eine Alternative ist das Codestyling mit dem jeweiligen Theme zu verknüpfen und eine kleinere JavaScript-Bibliothek wie Prism oder highlight.js zu nutzen.

Das Beispiel geht unter Verwendung der Bibliothek Prism davon aus, dass die Dateien prism.js und prism.css im Themeordner abgelegt werden. Außerdem soll der visuelle Editor zum komfortablen Formatieren angepasst werden.

functions.php

// Prism JS und CSS einbinden
function codestyling_scripts_styles() {
 wp_register_script( 'prism', get_template_directory_uri() . '/prism.js', '', '0.1', true );
 wp_enqueue_script( 'prism' );
 wp_register_style( 'prism', get_template_directory_uri() . '/prism.css', false, '0.1', 'screen' );
 wp_enqueue_style( 'prism' );
 }
add_action( 'wp_enqueue_scripts', 'codestyling_scripts_styles' );

// TinyMCE-Editor anpassen
function mce_mod( $init ) {
$init['block_formats'] = 'Paragraph=p;Pre=pre;Code=code;Heading 2=h2;Heading 3=h3;Heading 4=h4;Blockquote=blockquote';
$style_formats = array(
array( 'title' => 'CSS', 'block' => 'code', 'classes' => 'language-css'),
array( 'title' => 'HTML/XHTML', 'block' => 'code', 'classes' => 'language-markup' ),
array( 'title' => 'PHP', 'block' => 'code', 'classes' => 'language-php' ),
array( 'title' => 'JavaScript', 'block' => 'code', 'classes' => 'language-javascript' ),
array( 'title' => 'HTTP', 'block' => 'code', 'classes' => 'language-http' ));
$init['style_formats'] = json_encode( $style_formats );
return $init;
}
add_filter('tiny_mce_before_init', 'mce_mod');
function mce_add_buttons( $buttons ){
array_splice( $buttons, 1, 0, 'styleselect' );
return $buttons;
}
add_filter( 'mce_buttons_2', 'mce_add_buttons' );

Referenz

WordPress.org vs. WordPress.com oder Selbstbestimmung vs. Zurücklehnen

Immer wieder taucht, insbesondere bei Neulingen im Feld, die Frage auf, was denn der Unterschied zwischen WordPress.org und WordPress.com sei oder der Begriff WordPress wird mit einem der beiden Angebote gleichgesetzt.

Zur Begriffsdifferenzierung: WordPress ist eine Software. Sie kann auf WordPress.org heruntergeladen und auf einem eigenen Speicherplatz oder Server installiert werden. Gleichermaßen ist WordPress Grundlage für den Service WordPress.com, der niedrigschwellige bereits voreingerichtete Installationen bietet, die von der Betreiberfirma gewartet wird.

WordPress.orgWordPress.com AnfängerWordPress.com PremiumWordPress.com Business
KostenDomain + Speicherplatz ab 20 Euro/JahrKostenlos80 Euro/Jahr240 Euro/Jahr
Domainnameab 5 Euro/Jahr (z.B. netcup)name.wordpress.cominbegriffeninbegriffen
Speicherplatz (Webhosting)10GB ab ca. 20 Euro/Jahr (z.B. netcup oder uberspace) / Mindestvorraussetzungen3GB13GBUnbegrenzt
Plugins (erweiternde Funktionen)frei installierbar (z.B. ~ 32.000 aus dem WordPress.org Plugin-Verzeichnis)rund 20 vorinstallierte Pluginsrund 20 vorinstallierte Pluginsrund 20 vorinstallierte Plugins
Themesfrei installierbar (z.B. ~ 3.000 aus dem WordPress.org Theme-Verzeichnis)Auswahl aus rund 300 Themes, keine Anpassung möglichAuswahl aus rund 300 Themes, Anpassung möglichAuswahl aus rund 300 Themes, Anpassung möglich
individuelles Themeinstallierbarnicht installierbarnicht installierbarnicht installierbar
Theme-Konfiguration über functions.phpmöglichnicht möglichnicht möglichnicht möglich
Zugriff auf alle Dateien (WordPress, Plugins, Themes, Medien) via SFTP oder SSHjaneinneinnein
Hilfestellungen (Support)über einschlägige Foren und in der Regel auch über den Webhosting-Anbieterüber einschlägige ForenE-Mail-SupportChat
WerbeanzeigenNeinJaNeinNein
Wartungsarbeitenautomatische Aktualisierung möglich; eigene Verantwortung für Sicherheit und Funktiondurch die Betreiber von WordPress.comdurch die Betreiber von WordPress.comdurch die Betreiber von WordPress.com
WordPress.orgWordPress.com AnfängerWordPress.com PremiumWordPress.com Business

Es gibt neben WordPress.com weitere Anbieter, die vorinstallierte Installationen mit begrenztem Gestaltungsspielraum anbieten. Das Prinzip unterscheidet sich dann unwesentlich, bei der Preisgestaltung und den Funktionen kann es Unterschiede geben. Der für die Variante der selbstinstallierten Software angegebene Preis kann erheblich abweichen, je nachdem ob die Website zum Beispiel sehr hohe Zugriffszahlen verzeichnet oder nicht.

Referenz & Weiterführendes

Lösungen für mehrsprachige Websites in Single- oder Multisite-Umgebungen

Lösung über eine Singlesite-Umgebung

Grundsätzliche Vorteile bei einer Lösung in einer Singlesite-Umgebung:

  • in der Regel funktioniert das Wechseln zwischen verschiedenen Sprachversionen über Tabs mit einem Klick, dadurch schnelleres Arbeiten im Administrationsbereich
  • die Mediendateien der Website müssen nicht über eine weitere Lösung im ganzen Multisite-Netzwerk verfügbar gemacht werden
  • nur eine Website muss z. B. hinsichtlich anderer Plugins verwaltet und konfiguriert werden

Plugin-Lösungen für Singlesite-Umgebung:

  • Polylang, kostenlos; Besonderheit: jede Sprachversion wird in eigenen Beitrag / einer Seite gespeichert (Deinstallation leichter möglich)
  • qtranslate x, kostenlos; Besonderheit: Nachfolger von qtranslate, lange Zeit Platzhirsch im kostenfreien Bereich, aber nicht immer mit der aktuellsten WordPress-Version nutzbar
  • stella, einmalig $15; Besonderheit: Oberfläche und Dokumentation nicht in deutscher Sprache verfügbar
  • WPML, ab $29 mit eingeschränkten Funktionen, $195 für unbegrenzte Nutzung/Updates; Besonderheit: Schnittstelle für professionelle Übersetzungsdienstleistung integriert

Lösung über eine Multisite-Umgebung

Grundsätzliche Vorteile bei einer Multisite-Umgebung:

  • in der Regel bessere Performance der Website für den Nutzer, da klare Trennung der Sprachversionen
  • keine größeren Eingriffe in die Datenbank, die eine Deinstallation zu einem anstrengenden Unterfangen machen
  • bei Deinstallation des Plugins existieren die Sprachversionen weiter und können weiter genutzt werden (ggf. nur weniger komfortabel)

Plugin-Lösungen für Multisite-Umgebung

Javascript und CSS über wp_enqueue_scripts einbinden

WordPress bietet eine Möglichkeit um CSS und Javascript über die Funktion wp_enqueue_scripts einzubinden. Der Codex empfiehlt diese Vorgehensweise gegenüber etwa dem hardcoden in den Theme-Dateien wie der header.php oder der footer.php. Zur Verbesserung der Website-Performance können dann gleich noch Script-Aufrufe nach wp_footer (also gegen Ende des Quelltexts) verschoben werden.

In der header.php finden sich beispielsweise solche oder ähnliche Anweisungen, die durch die Funktionen ersetzt werden sollen:

<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/print.css" type="text/css" media="print" />
<script type="text/javascript" src="<?php echo get_stylesheet_directory_uri(); ?>/js/themename.js">
<script type='text/javascript' src='/js/jquery.js'></script>
<script type='text/javascript' src='/js/jquery-migrate.min.js'></script>

In folgendem Beispiel sollen nun die themename.js, die die jquery-Bibliothek benötigt, sowie die style.css und print.css des Themes eingebunden werden. Im wp_footer soll außerdem die WordPress-eigene jquery-Bibliothek eingebunden werden. Ein angenehmer Nebeneffekt ist, dass die eigene jquery-Kopie nicht mehr von Hand aktualisiert werden muss.

functions.php

// Theme Scripts & Styles registrieren
function themename_scripts_styles() {
  // Scripts: Name, URI, Abhängigkeiten, Version, in wp_footer platzieren?
  wp_register_script( 'themename-js', get_template_directory_uri() . '/js/themename.js', array( 'jquery' ), '2.05', true );
  wp_enqueue_script( 'themename-js' );
  // Andere Scripts in den Footer verschieben
  remove_action('wp_head', 'wp_print_scripts');
  remove_action('wp_head', 'wp_print_head_scripts', 9);
  remove_action('wp_head', 'wp_enqueue_scripts', 1);
  // CSS: Name, URI, Abhängigkeiten, Version, CSS Media Type
  wp_register_style( 'themename-screen', get_template_directory_uri() . '/style.css', false, '20140925', 'screen' );
  wp_enqueue_style( 'themename-screen' );
  wp_register_style( 'themename-print', get_template_directory_uri() . '/print.css', false, '20140925', 'print' );
  wp_enqueue_style( 'themename-print' );
}
add_action( 'wp_enqueue_scripts', 'themename_scripts_styles' );

Beim Erstellen eigener Funktionen können Generatoren zu Hilfe genommen werden. Bei der Verwendung von Child-Themes mit alternierenden CSS-Klassen sollte get_template_directory_uri() mit get_stylesheet_directory_uri() ersetzt werden.

Referenz

Kommentar-Formular mit comment_form anpassen

comments.php

comment_form();

ersetzen durch

$comments_fields =  array(
  'author' =>
    '<p class="comment-form-author"><label for="author">' . __( 'Name', 'domainreference' ) . '</label> ' .
    ( $req ? '<span class="required">*</span>' : '' ) .
    '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) .
    '" size="25"' . $aria_req . ' /></p>',
  'url' =>
    '<p class="comment-form-url"><label for="url">' . __( 'Website', 'domainreference' ) . '</label>' .
    '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) .
    '" size="25" /></p>',
);
$comments_args = array(         
    // Titel des Formulars
    'title_reply'=>'Anmerkung oder Frage schreiben',
    // Titel bei Antwort auf einen anderen Kommentar
    'title_reply_to'=>'%s antworten',
    // Text vor dem Formular
    'comment_notes_before' => '',
    // Kommentarfelder Autor, URI
    'fields' => apply_filters( 'comment_form_default_fields', $comments_fields ),
    //Kommentarfeld
    'comment_field'=>'<p class="comment-form-comment"><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
    // Text hinter dem Formular
    'comment_notes_after' => '<p class="comment-notes">Jeder Beitrag wird von Hand freigeschaltet.
    Mit dem Absenden Ihres Kommentars willigen Sie ein, dass der angegebene Name im Zusammenhang mit Ihrem Kommentar und ggf. Ihrer Website gespeichert wird.</p>',
    // Senden-Schaltfläche
    'label_submit'=>'Absenden'
  );
comment_form($comments_args);

Das E-Mail-Feld wurde in diesem Beispiel entfernt.

functions.php

Alternativ zur Defintion der Felder Autor, URI usw. über das Array $comments_fields lassen sich diese über eine Funktion in der functions.php deaktivieren.

function remove_comment_fields($fields) {
unset($fields['email']);
unset($fields['url']);
return $fields;
}
add_filter('comment_form_default_fields','remove_comment_fields');

Wer die Kommentarfunktion dann noch datensparsamer machen möchte, kann die Kommentare ohne IP-Adresse speichern lassen. Ein angepasstes Kommentarformular soll sich außerdem positiv auf das SPAM-Aufkommen auswirken, da die SPAM-Bots nach bestimmten Schlüsselbegriffen wie z. B. den erlaubten HTML-Tags suchen.

Referenz

Datenbank-Präfix von WordPress nachträglich ändern

Zunächst sollte ein Backup der Datenbank und der Datei wp-config.php erstellt werden.

Mit SQL-Befehlen werden nun die einzelnen Tabellen umbenannt. Soll der neue Präfix tp461o2_ sein, dann sieht das so aus:

RENAME TABLE `wp_commentmeta` TO `tp461o2_commentmeta`;
RENAME TABLE `wp_comments` TO `tp461o2_comments`;
RENAME TABLE `wp_links` TO `tp461o2_links`;
RENAME TABLE `wp_options` TO `tp461o2_options`;
RENAME TABLE `wp_postmeta` TO `tp461o2_postmeta`;
RENAME TABLE `wp_posts` TO `tp461o2_posts`;
RENAME TABLE `wp_terms` TO `tp461o2_terms`;
RENAME TABLE `wp_term_relationships` TO `tp461o2_term_relationships`;
RENAME TABLE `wp_term_taxonomy` TO `tp461o2_term_taxonomy`;
RENAME TABLE `wp_usermeta` TO `tp461o2_usermeta`;
RENAME TABLE `wp_users` TO `tp461o2_users`;

Im Anschluss müssen noch alle Werte in den Tabellen options und usermeta aktualisiert werden, die auf den alten Tabellenpräfix verweisen.

UPDATE `tp461o2_options` SET `option_name`=REPLACE(`option_name`,’wp_’,’tp461o2_’) WHERE `option_name` LIKE ‘%wp_%';
UPDATE `tp461o2_usermeta` SET `meta_key`=REPLACE(`meta_key`,’wp_’,’tp461o2_’) WHERE `meta_key` LIKE ‘%wp_%';

Zuletzt wird der Tabellenpräfix in der wp-config.php angepasst und alles sollte rund laufen:

$table_prefix  = 'tp461o2_';

Anzumerken ist noch, dass diese Methode zwar funktioniert, aber Schwierigkeiten auftreten können sobald weitere Tabellen von Plugins angelegt worden sind. Diese müssen dann auch entsprechend umbenannt werden. Am Besten wird der Präfix aber schon bei der Installation von WordPress entsprechend angepasst, so dass diese Änderung später gar nicht mehr nötig wird.

Referenz