19.04.2023

Content-Management-System

Coppermine
Contao
Textpattern
Joomla
Kirby
Joomla
Redaxo
Kirby
Plone
concrete5
CMBasic
b2evolution
CMS-DB
Drupal
DokuWiki
Wordpress

Wordpress Projekt
Wordpress Deutschland
Wordpress Code Reference

Navigation:
Installation
Sicherheit der Installation anpassen
Konfiguration anpassen
Update auf eine neue Version
sonstiges

Seitenanfang

Wordpress

Ordnerstruktur
/wp-admin Administrations Backend für die interne Verwaltung
/wp-content  
/wp-content/languages Sprachdateien
/wp-content/plugins alle Plugins
/wp-content/themes Designs der Webseite
/wp-content/uploads hochgeladene Dateien, Bilder, Videos u.a.
/wp-includes -
Dateien
/wp-includes/version.php Versionsdatei von WordPress
/wp-includes/plugin.php  
wp-register.php Benutzerregistrierung, Loginseite von extern (http://domain.tld/wp-register.php)
   
   
   
PlugIns
Wordtube Player für Videodateien
Security
Akismet Spam Kommentare sortieren engl.
Antispam Bee SPAM Prüfung deutsch
Exploit Scanner Security Prüfung auf Hacker attacken
Secure Wordpress entfernt Wordpress Versionsanzeige u.a.
Limit Login Attempts Anzahl Loginversuche einschränken
System
Statify Statistic PlugIn
Capability Manager Rechte der BenutzeRollen bearbeiten, neue anlegen
Role Scoper Rechte der BenutzeRollen bearbeiten
Better Delete Revision Revisionen löschen
Debug Queries zeigt Anzahl Datenbankabfragen (Performance)
WP Permalauts passt Deutsche Umlaute in Titeln für die URL an
Domain-Mirror Wordpress unter mehrere Domains erreichbar machen
Editoren
WP Editor WYSIWYG Editor, HTML Code wird Farbig hervorgehoben
WP Super Edit WYSIWYG Editor
TinyMCE Advanced Erweiterung für den WYSIWYG Editor von Wordpress
CKEditor For WordPress WYSIWYG Editor
Tools
CMS Tree Page View Aufklapp-Baumstruktur zur Seiten oder Beitragsverwaltung
Simply Show IDs fügt eine Spalte in der Seiten und Beitragsübersicht hinzu, mit der DatenbankID der Seite/Artikel
Contact Form 7 Kontaktformular
Newsletter RSS Feeds
Breadcrumb NavXT Breadcrumb Menü
PS Disable Auto Formatting deaktiviert (wpautop) <p> und <br> Tags werden im Content angezeigt
   

Breadcrumb Menü ohne PlugIn

// breadcrumb
function nav_breadcrumb() {
 
  $delimiter = '&raquo;';
  $home = 'Home'; 
  $before = '<span class="current">'; 
  $after = '</span>'; 
 
  if ( !is_home() && !is_front_page() || is_paged() ) {
 
    echo '<div id="breadcrumb">';
 
    global $post;
    $homeLink = get_bloginfo('url');
    echo '<a href="' . $homeLink . '">' . $home . '</a> ' . $delimiter . ' ';
 
    if ( is_category() ) {
      global $wp_query;
      $cat_obj = $wp_query->get_queried_object();
      $thisCat = $cat_obj->term_id;
      $thisCat = get_category($thisCat);
      $parentCat = get_category($thisCat->parent);
      if ($thisCat->parent != 0) echo(get_category_parents($parentCat, TRUE, ' ' . $delimiter . ' '));
      echo $before . single_cat_title('', false) . $after;
 
    } elseif ( is_day() ) {
      echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
      echo '<a href="' . get_month_link(get_the_time('Y'),get_the_time('m')) . '">' . get_the_time('F') . '</a> ' . $delimiter . ' ';
      echo $before . get_the_time('d') . $after;
 
    } elseif ( is_month() ) {
      echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
      echo $before . get_the_time('F') . $after;
 
    } elseif ( is_year() ) {
      echo $before . get_the_time('Y') . $after;
 
    } elseif ( is_single() && !is_attachment() ) {
      if ( get_post_type() != 'post' ) {
        $post_type = get_post_type_object(get_post_type());
        $slug = $post_type->rewrite;
        echo '<a href="' . $homeLink . '/' . $slug['slug'] . '/">' . $post_type->labels->singular_name . '</a> ' . $delimiter . ' ';
        echo $before . get_the_title() . $after;
      } else {
        $cat = get_the_category(); $cat = $cat[0];
        echo get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
        echo $before . get_the_title() . $after;
      }
 
    } elseif ( !is_single() && !is_page() && get_post_type() != 'post' && !is_404() ) {
      $post_type = get_post_type_object(get_post_type());
      echo $before . $post_type->labels->singular_name . $after;
 
    } elseif ( is_attachment() ) {
      $parent = get_post($post->post_parent);
      $cat = get_the_category($parent->ID); $cat = $cat[0];
      echo get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
      echo '<a href="' . get_permalink($parent) . '">' . $parent->post_title . '</a> ' . $delimiter . ' ';
      echo $before . get_the_title() . $after;
 
    } elseif ( is_page() && !$post->post_parent ) {
      echo $before . get_the_title() . $after;
 
    } elseif ( is_page() && $post->post_parent ) {
      $parent_id  = $post->post_parent;
      $breadcrumbs = array();
      while ($parent_id) {
        $page = get_page($parent_id);
        $breadcrumbs[] = '<a href="' . get_permalink($page->ID) . '">' . get_the_title($page->ID) . '</a>';
        $parent_id  = $page->post_parent;
      }
      $breadcrumbs = array_reverse($breadcrumbs);
      foreach ($breadcrumbs as $crumb) echo $crumb . ' ' . $delimiter . ' ';
      echo $before . get_the_title() . $after;
 
    } elseif ( is_search() ) {
      echo $before . 'Ergebnisse für Ihre Suche nach "' . get_search_query() . '"' . $after;
 
    } elseif ( is_tag() ) {
      echo $before . 'Beiträge mit dem Schlagwort "' . single_tag_title('', false) . '"' . $after;
 
    } elseif ( is_author() ) {
       global $author;
      $userdata = get_userdata($author);
      echo $before . 'Beiträge veröffentlicht von ' . $userdata->display_name . $after;
 
    } elseif ( is_404() ) {
      echo $before . 'Fehler 404' . $after;
    }
 
    if ( get_query_var('paged') ) {
      if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) echo ' (';
      echo ': ' . __('Page') . ' ' . get_query_var('paged');
      if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) echo ')';
    }
 
    echo '</div>';
 
  }
}

aktivieren des Breadcrumb Menüs in der header.php, page.php, single.php oder archiv.php

<?php if (function_exists('nav_breadcrumb'))
	nav_breadcrumb(); ?>

 

Seitenanfang

Installation

- unter Debian/ubuntu, Pakete installieren, Verzeichnis erstellen, Herunterladen, entpacken und Berechtigungen setzen.

apt-get install apache2-mpm-prefork php5 libapache2-mod-php5 unzip
mkdir /www
mkdir /www/log
wget http://wpde.org/files/2013/01/wordpress_351-de.zip -P /www/
unzip /www/wordpress_351-de.zip -d /www/
chown -R www-data:www-data /www

- Apache installieren und anpassen

a2enmod rewrite php5
# /etc/apache2/conf.d/virtual.conf
# Multiple VirtualHosts
#
Alias /images/ /www/images/
Alias /download/ /www/download/

NameVirtualHost *
# /etc/apache2/sites-available/wordpress
<VirtualHost *>
 ServerName domain.tld
 ServerAlias wordpress.zz
 DocumentRoot /www/wordpress
 RewriteEngine On
 RewriteOptions inherit
 CustomLog /www/log/wordpress.log combined
 ErrorLog /www/log/wordpress.err
 LogLevel notice
</VirtualHost>
a2ensite wordpress
service apache2 restart

PHP Installation testen

<!-- /www/wordpress/info.php -->
<?php
phpinfo ();
?>

im Browser aufrufen http://domain.tld/info.php

- MySQL installieren und anpassen

apt-get install mysql-server mysql-client php5-mysql
mysql -u root -p
CREATE DATABASE  `wordpress` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL ON wordpress.* TO 'wp_user'@'localhost' IDENTIFIED BY 'my-passwd';

DBOwner der Wordpress Datenbank

Benutzer: wp_user
Passwort: my-passwd

- Wordpress Installation anpassen

cp wp-config-sample.php wp-config.php

- Anpassung der wp-config.php

# wp-config.php
...
/**#@+
 * Authentication Unique Keys and Salts.
 */
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');
/**#@-*/
...
$table_prefix  = 'wp_';

Authentication Unique Keys and Salts - Sicherheitsschlüssel für die Verschlüsselung der Daten in der MySQL Datenbank
$table_prefix - Datenbanktabellen Präfix, sollte individuell gesetzt werden um SQL-Injections zu erschweren, jede Wordpress Instanz benötigt einen Eigenen Präfix um die Installation zu trennen.

Jetzt kann man im Browser http://domain.tld/wp-admin für die weitere Einrichtung aufrufen.

Fehlermeldung beim Start von Wordpress für die Ersteinrichtung

Failed opening required ... (include_path='.:/usr/share/php:/usr/share/pear')

Lösung, Zugriffsrechte auf die wp-config.php prüfen oder folgenden Befehl ausführen.

update PEAR
Seitenanfang

Sicherheit der Installation anpassen

Artikel WordPress sicherer machen

- Zugriff auf wp-config.php verhindern, per .htaccess oder Apache Konfiguration ein Beispiel für die Apache Konfiguration

# /etc/apache2/conf.d/wordpress
# /wp-config.php vor Zugriff schützen
<Files wp-config.php>
	Order Deny,Allow
	Deny from all
</Files>

# /wp-login.php durch Passwortabfrage schützen
<Files wp-login.php>
   AuthName "Admin-Bereich"
   AuthType Basic
   AuthUserFile >>>Pfad zu htpasswd-Datei<<<.htpasswd
   require valid-user
</Files>

# /wp-admin/ vor Zugriff schützen
<FilesMatch
 "(\.htaccess|\.htpasswd|wp-config\.php|liesmich\.html|readme\.html)">
	Order Deny,Allow
	Deny from all
</FilesMatch>

# Datei admin-ajax.php vom Schutz ausnehmen, da diese von einigen PlugIns benutzt wird
<Files admin-ajax.php>
     Order Allow,Deny
     Allow from all
     Satisfy any 
</Files

andere Variante Wordpress Zugriff auf wp-login.php nur vom T-Online und Arcor Netz aus.

<Files wp-login.php>
	Order Deny,Allow
	Deny from all
	Allow from .t-ipconnect.de
	Allow from .arcor-ip.net
</Files>
# /etc/php5/apache2/php.ini absichern
[PHP]
register_globals = off
allow_url_fopen = off
safe_mode = on open_basedir = <Pfadname des Webverzeichnisses> disable_functions = exec,system,passthru,shell_exec,popen,escapeshellcmd,proc_open,proc_nice,ini_restore display_errors = off

- PlugIn Search and Replace

Die Einstellung ersetzt die User-ID 1 durch die User-ID 239, das soll Angriffe erschweren, da automatische Scripte nicht mehr greifen können.

ändern der UserID des Administrators
Einstellungen | Suche in
Feld
User-ID: aktivieren
Suche nach: 1
Ersetze mit: beliebige Ziffernfolge (z.B. 239)

- PlugIn Limit Login Attempts
Anzahl Loginversuche einschränken

- PlugIn Secure Wordpress
entfernt Wordpress Versionsanzeige u.a.

Seitenanfang

Konfiguration anpassen

- Einstellungen
Einstellungen | Lesen
Startseite zeigt:

Einstellungen | Permalinks
Benutzerdefinierte Struktur: /%category%/%postname%

- Zugriff aus Adminbackend auf SSL beschränken

/** wp-config.php */
...
 define('FORCE_SSL_ADMIN', true);
...

- Anzahl der Revisionen reduzieren auf 5, mit False wird keine Revision mehr angelegt.

/** wp-config.php
 * Anzahl der Revisionen auf 5 setzen. */
...
define('WP_POST_REVISIONS', 5);
...

- Multisite Support
nach dem ändern der wp-config erscheint im Admin Menü unter Werkzeuge | Netzwerk-Einrichten

/** wp-config.php
 * Multisite Support aktivieren */
...
define('WP_ALLOW_MULTISITE', true);
...
Seitenanfang

Update auf eine neue Version

- Backup
PlugIn WP-DB-Backup - sichert die Datenbank

Backup aller Dateien des Wordpress Ordners

- Vorbereitung zum Update auf neue Version

alle PlugIns deaktivieren um Fehler zu verringern

auf dem Server alle Dateien und Verzeichnisse löschen, außer
/wp-content
wp-config.php

- neue Version laden und einspielen

Im Browser http://domain.tld/wp-admin/upgrade.php um die Datenbank zu aktualisieren

 

 

 

Seitenanfang

sonstiges

- Geschwindigkeit der Site prüfen
in die Fußzeile footer.php folgende Zeile einfügen

...
<?php echo $wpdb->num_queries; ?>q, <?php timer_stop(1); ?>s
</body>

Seite aktualisieren, in der letzten Zeile auf der Seite wird dann der Performance Wert angezeigt.

- Seiten Template erstellen
im Ordner /wp-content/themes/<Theme>/index.php kopieren z.B. nach seitentemplate.php. Die Vorlage bearbeiten, am Anfang ein paar Zeilen einfügen.

<?php
/*
 Template Name: Seiten Vorlage
 */
 ...

danach ist die Vorlage unter Seiten | Erstellen | Attribute | Template verfügbar

- Design | Editor
Twenty Eleven: Seiten-Template (page.php) wählen, den folgenden Abschnitt entfernen, auskommentiern oder auf false setzen

...
<?php comments_template( '', true ); ?>
...

Twenty Eleven: Fußzeile (footer.php)
Link auskommentieren

<!-- <a href= ...
... </a> -->

Twenty Eleven: Stylesheet (style.css)

...
.one-column #page {
/*	max-width: 690px; */
	max-width: 100%;
...

Verlinkung am sichersten über die DatenbankID diese zeigt das PlugIn "Simply Show IDs" an.
http://domain.tld/?p=xxx
anstelle von xxx die ID angeben.

Themes bearbeiten
- je nach ausgewählten Theme in das passende Verzeichnis wechseln
wp-content/themes/<Themes Name>/
page-php und content.php für die Ausgabe einfacher Seiten
header.php - Kopf aller Seiten, die PHP Datei wird durch den Befehl "get_header(); ?>" aufgerufen. Das Primary Menü ist auch im Header enthalten.
footer.php - Fußzeile aller Seiten, wie beim Header analog auch bei der Fußzeile "<?php get_footer(); ?>" wird footer.php aufgerufen.
single.php - Einzelansicht eines Artikels im Blog
funktions.php - Registriert das Primary Menü im Frontend unter Design | Menüs und die Sidebar für die Widgets Design | Widgets
style.css - CSS Formatierung der kompletten Themes
index.php - Startseite
category.php - Kategorisierungen der Artikel
comments.php - Kommentare

- Conditional Tags
mit diesen Tags können Bedingungen festgelegt werden, wann z.B. Kommentare auf der Seite angezeigt werden, oder nur an den Admin geschickt werden.
z.B. in der comments.php

<!-- Conditional Tags -->
<?php
if(is_page()){
	wp_list_comments();
}else{ echo 'Ihr Kommentar wird nicht veröffentlicht, sondern nur an den Admin geschickt';}
comment_form();
?>

die Bedingung gibt an, das auf einer einzelne Seite (is_page) die Kommentare angezeigt werden, ist der Benutzer z.B. in einem Artikel, wird dort nur der Hinweis "Ihr Kommentar wird nicht veröffentlicht ..." gezeigt.

is_page - einzelne Seite
is_single - einzelner Artikel
is_home - Startseite
is_frontpage -

- Änderung Theme Preference Lite style.css

...
/* Primary wrappers */
...
#centered-wrapper
/*	max-width:1200px; */
	max-width:98%;
...

/wp-content/themes/preference-lite/css/bootstrap.css

.container {
  width: 940px;

Wordpress URL ändern

- MySQL Login

mysql -u'user' -p'Passwort' wordpress

- URL anzeigen

MySQL Tables anzeigen

show tables;

Tables: wp_options
Fields: option_name, option_value
Wert: siteurl option_value

select * from wp_options WHERE option_name = 'home' OR option_name = 'siteurl';

Beispiel von der Konsole

mysql -u'User' -p'Passwort' -s -N -e "use wordpress; \
 select * from wp_options WHERE option_name = 'home' OR option_name = 'siteurl';" 2>/dev/null

Tables: wp_posts
Fields: guid, post_content

select guid from wp_posts;
select post_content from wp_posts;

Tables: wp_postmeta
Fields: meta_value

select meta_value from wp_postmeta;

- URL anpassen

UPDATE wp_options SET option_value = replace(option_value, 'http://www.oldurl', 'http://www.newurl')
 WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'http://www.oldurl','http://www.newurl');
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.oldurl', 'http://www.newurl');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.oldurl','http://www.newurl');