Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
dienste:wp_tkev [31.12.2020 15:54] – Jetpack deaktiviert und gelöscht bernd | dienste:wp_tkev [28.12.2021 21:24] (aktuell) – [Tabelle] mape2k |
---|
Die Serverkonfiguration ist in [[dienste:bytecluster0002:wordpress]] dokumentiert, nachfolgend werden nur die innerhalb von Wordpress erfolgten Anpassungen/Plugins etc. aufgeführt. | Die Serverkonfiguration ist in [[dienste:bytecluster0002:wordpress]] dokumentiert, nachfolgend werden nur die innerhalb von Wordpress erfolgten Anpassungen/Plugins etc. aufgeführt. |
| |
| ===== Wordpress User Enumeration ===== |
| |
| In WordPress gibt es mehrere Stellen, an denen der Benutzername eines Kontos ausgelesen werden kann. Möchte man dies verhindern, müssen in der **functions.php** mehrere Filter ergänzt werden. Eine Anleitung dazu findet man auf [[https://blog.kulturbanause.de/2018/03/wordpress-user-enumeration-verhindern/|kultuberbanause.de]]. |
| |
| **Im aktiven Weblog sind die Änderungen noch nicht eingebaut.** |
| |
| |
| ===== wp-config.php ===== |
| |
| ==== Cache aktivieren ==== |
| |
| Die nachfolgende Zeile muss vor ''require_once ABSPATH . 'wp-settings.php';'' eingefügt werden. |
| |
| <code php>define( 'WP_CACHE', true );</code> |
| |
| |
| ===== functions.php ===== |
| |
| ==== erlaubte Dateitypen für Medien-Upload anpassen ==== |
| |
| WordPress erlaubt im Standard nur eine begrenzte Auswahl an Dateitypen, welche in die Mediathek hochgeladen werden dürfen (siehe [[https://codex.wordpress.org/Uploading_Files]]). Die Liste der erlaubten Dateitypen kann über die functions.php angepasst werden ([[https://wp-guru.net/erlaubte-dateitypen-fuer-den-upload-in-die-mediengallerie-hinzufuegen/|Beispiel]]). Damit der nachfolgende Code Update-sicher bleibt, wird er als Snippet im Plugin "Code Snippets" angelegt. |
| |
| <code php>function dateitypen_bearbeiten($mime_types){ |
| $mime_types['zip'] = 'application/zip'; //.zip hinzufügen |
| // unset($mime_types['pdf']); //.pdf entfernen |
| return $mime_types; |
| } |
| add_filter('upload_mimes', 'dateitypen_bearbeiten', 1, 1);</code> |
| |
===== Template ===== | ===== Template ===== |
| |
Das endgültige Template steht noch nicht fest. | ==== User CSS ==== |
| |
| Verwendet wird aktuell das Template "Modern" mit folgenden CSS-Anpassungen... |
| |
| <code css>#stc-unsubscribe-checkbox,#stc-all-categories,#stc_categories {width:1em;} |
| |
| #stc-subscribe-btn,#stc-unsubscribe-btn {border: 2px solid #D8D8D8;color:#6A6C6E} |
| |
| .posts .entry {padding-left:1em;padding-right:1em} |
| |
| .sidebar .widget {padding: 1em;} |
| |
| .intro-title { |
| font-size: 3rem; |
| padding: 4% 0; |
| } |
| |
| .sidebar .widget input, .footer-widgets .widget input, .sidebar .widget select, .footer-widgets .widget select, .sidebar .widget textarea, .footer-widgets .widget textarea { |
| -width: 100%; |
| } |
| |
| .entry-content-container, .comments-area-inner, .site-info-inner, .footer-widgets { |
| padding-bottom: 2rem; |
| } |
| |
| .attachment .entry-media, .entry-content-container, .comments-area-inner, .site-info-inner, .footer-widgets { |
| padding-top: 2rem; |
| } |
| |
| .posts .entry-media { |
| margin-left: -1em; |
| margin-right: -1em; |
| margin-bottom: 2.6244em; |
| }</code> |
| |
| ==== Vorschaubilder ==== |
| |
| Damit die Vorschaubilder zum Template passen, müssen unter Einstellungen/Medien die Größen der Bilder angepasst werden, die im Standard recht klein und quadratisch sind. Die Anpassungen entspricht den empfohlenen Bildgrößen, welche ebenfalls auf der Seite aufgeführt sind. |
| |
| * Vorschaubilder: 420 x 0 |
| * Mittelgroß: 744 x 0 |
| * Groß: 1200 x 0 |
| |
===== verwendete Plugins ===== | ===== verwendete Plugins ===== |
| |
^ Plugin ^ Zweck ^ | ^ Plugin ^ Zweck ^ |
| [[https://de.wordpress.org/plugins/advanced-custom-fields/|Advanced Custom Fields]] | Erlaubt die Definition zusätzlicher Felder, auch abhängig von einzelnen Beiträgen. Wird für das Template "Modern" empfohlen. | | | [[https://de.wordpress.org/plugins/advanced-custom-fields/|Advanced Custom Fields]] | Erlaubt die Definition zusätzlicher Felder, auch abhängig von einzelnen Beiträgen. Wird für das Template "Modern" empfohlen. | |
| [[https://de.wordpress.org/plugins/akismet/|Akismet Spam Protection]] | Ausfiltern von Kommentar-Spam, benötigt einen API-Key. Eine Datenschutz-freundlichere Alternative ohne externen Dienst wäre perspektivisch besser. | | | [[https://de.wordpress.org/plugins/antispam-bee/|Antispam Bee]] | Anti-Spam-Plugin als Alternative zu Akismet | |
| [[https://de.wordpress.org/plugins/classic-editor/|Classic Editor]] | Implementierung des alten Editors ohne WYSIWYG. | | | [[https://de.wordpress.org/plugins/cache-enabler/|Cache Enabler]] | Cache verwalten und bei Bedarf löschen | |
| [[https://de.wordpress.org/plugins/contact-form-7/|Contact Form 7]] | Kontaktformular | | | [[https://de.wordpress.org/plugins/classic-editor/|Classic Editor]] | Implementierung des alten Editors ohne WYSIWYG. | |
| [[https://de.wordpress.org/plugins/contextual-related-posts/|Contextual Related Posts]] | zeigt ähnliche Beiträge unter einem Artikel an | | | [[https://de.wordpress.org/plugins/code-snippets/|Code Snippets]] | erlaubt das einfügen von Codeblöcken in die functions.php ohne das man die Datei des Themes anpassen muss | |
| [[https://de.wordpress.org/plugins/email-subscribers/|Email Subscribers & Newsletters]] | versendet E-Mail-Benachrichtigungen bei neuen Beiträgen an Abonennten, hat Double-Opt-In. Derzeit in der Seitenleiste, kann aber auch als eigene Seite genutzt werden. | | | [[https://de.wordpress.org/plugins/contact-form-7/|Contact Form 7]] | Kontaktformular | |
| [[https://de.wordpress.org/plugins/enhanced-text-widget/|Enhanced Text Widget]] | Wird für den Raumstatus in der Seitenleiste benötigt, da Wordpress standardmäßig keinen PHP-Code ausführt. | | | [[https://de.wordpress.org/plugins/contextual-related-posts/|Contextual Related Posts]] | zeigt ähnliche Beiträge unter einem Artikel an | |
| [[https://de.wordpress.org/plugins/simple-yearly-archive/|Simple Yearly Archive]] | Übersichtsseite aller veröffentlichten Beiträge | | | [[https://de.wordpress.org/plugins/disable-remove-google-fonts/|Disable and Remove Google Fonts]] | Deaktiviert die Einbindung von Google Fonts in ein Theme ohne das am Code etwas angepasst werden muss. Funktion hängt vom Theme ab, mit "Modern" scheint es zu passen. | |
| [[https://de.wordpress.org/plugins/two-factor/|Two-Factor]] | 2-Faktor-Authentifizierung für Login | | | [[https://de.wordpress.org/plugins/email-subscribers/|Email Subscribers & Newsletters]] | versendet E-Mail-Benachrichtigungen bei neuen Beiträgen an Abonennten, hat Double-Opt-In. Derzeit in der Seitenleiste, kann aber auch als eigene Seite genutzt werden. | |
| [[https://de.wordpress.org/plugins/wp-githuber-md/|WP Githuber MD]] | Umfangreicher MarkDown-Editor mit Syntax-Highlighting und HTML-Preview innerhalb des Editors | | | [[https://de.wordpress.org/plugins/enhanced-media-library/|Enhanced Media Library]] | Zusätzliche Funktionen für die Media-Bibliothek (z. B. Alben) | |
| [[https://de.wordpress.org/plugins/xml-sitemap-feed/|XML Sitemap & Google News]] | erzeugt XML-Sitemaps für bessere/schnellere Indexierung durch Suchmaschinen | | | [[https://de.wordpress.org/plugins/enhanced-text-widget/|Enhanced Text Widget]] | Wird für den Raumstatus in der Seitenleiste benötigt, da Wordpress standardmäßig keinen PHP-Code ausführt. | |
| | [[https://de.wordpress.org/plugins/ics-calendar/|ICS Calendar]] | Stellt auf einer Seite einen Kalender mit Terminen dar. Schön an diesem Plugin ist die Möglichkeit, mehrere ICS in einem Kalender darstellen zu lassen. | |
| | [[https://de.wordpress.org/plugins/limit-login-attempts-reloaded/|Limit Login Attempts Reloaded]] | Blockiert eine IP für x Minuten bei zu vielen falschen Logins. | |
| | [[https://de.wordpress.org/plugins/regenerate-thumbnails/|Regenerate Thumbnails]] | Erstellt neue Vorschaubilder, wenn man z. B. in den Media-Einstellungen die Auflösungen geändert hat. Kann normalerweise deaktiviert bleiben, wird nicht regelmäßig benötigt. | |
| | [[https://de.wordpress.org/plugins/responsive-lightbox/|Responsive Lightbox & Gallery]] | Lightbox für Bilder, damit diese in einem Hover aufgehen | |
| | [[https://de.wordpress.org/plugins/simple-yearly-archive/|Simple Yearly Archive]] | Übersichtsseite aller veröffentlichten Beiträge | |
| | [[https://de.wordpress.org/plugins/starbox/|Starbox]] | erzeugt einen Autoren-Block unter jedem Artikel | |
| | [[https://de.wordpress.org/plugins/subscribe-to-comments-reloaded/|Subscribe To Comments Reloaded]] | Besucher erhalten auf Wunsch eine E-Mail-Benachrichtigung bei neuen Kommentaren zu einem Artikel, Double-Opt-In ist aktiviert | |
| | [[https://de.wordpress.org/plugins/two-factor/|Two-Factor]] | 2-Faktor-Authentifizierung für Login | |
| | [[https://de.wordpress.org/plugins/wp-githuber-md/|WP Githuber MD]] | Umfangreicher MarkDown-Editor mit Syntax-Highlighting und HTML-Preview innerhalb des Editors | |
| | [[https://de.wordpress.org/plugins/wp-mail-smtp/|WP Mail SMTP]] | Wordpress SMTP-Unterstützung | |
| | [[https://de.wordpress.org/plugins/xml-sitemap-feed/|XML Sitemap & Google News]] | erzeugt XML-Sitemaps für bessere/schnellere Indexierung durch Suchmaschinen | |
| |
===== Plugin-Konfiguration ===== | ===== Plugin-Konfiguration ===== |
| |
===== Kontaktformular ===== | ==== ICS Calendar ==== |
| |
| Die meisten Funktionen bzw. die Ausgabe des Plugins lassen sich über Parameter im ShortCode der Seite steuern. Nachfolgend beispielhaft die Einbindung mit unseren beiden öffentlichen NextCloud-Kalendern von Bytespeicher und Makerspace. |
| |
| [ics_calendar url="https://cloud.technikkultur-erfurt.de/remote.php/dav/public-calendars/62H5QIYTZJMRSB17?export https://cloud.technikkultur-erfurt.de/remote.php/dav/public-calendars/FW4LI1Y6AID0ZVC1?export" view="month" tz="Europe/Berlin" eventdesc="true" location="true" organizer="true" attach="true" title="false" pastdays="90" monthnav="both" color="#3399ff #ff6600" feedlabel="Bytespeicher|Makerspace" legendposition="below" legendstyle="inline"] |
| |
| **Wichtig:** Falls der Kalender nicht dargestellt wird, muss die PHP-Konfiguration geprüft werden! |
| |
| > Why isn’t my calendar loading? |
| > |
| > This may be due to your server’s configuration. This plugin requires either the PHP cURL extensions, or the allow_url_fopen PHP setting to be turned on. Check your PHP configuration or your server administrator if you think this may be the issue. |
| |
| ==== Two Factor ==== |
| |
| Damit sich bei aktivierter 2FA Apps über die XMLRPC-API einloggen können, muss folgender Code in die functions.php gefügt werden: |
| |
| add_filter( 'two_factor_user_api_login_enable', function( $enable ) { |
| // Allow API login when using an application password even with 2fa enabled. |
| if ( did_action( 'application_password_did_authenticate' ) ) { |
| return true; |
| } |
| |
| return $enable; |
| } ); |
| |
| Um das Theme nicht anpassen zu müssen, wird der Code als Snippet im Plugin "Code Snippets" verwendet. |
| |
| ==== Kontaktformular ==== |
| |
Das Kontaktformular wird von "Contact Form 7" bereitgestellt. Die Einstellungen sind überwiegend auf Standard belassen, als Empfänger-E-Mail ist der Vereinsvorstand angegeben. | Das Kontaktformular wird von "Contact Form 7" bereitgestellt. Die Einstellungen sind überwiegend auf Standard belassen, als Empfänger-E-Mail ist der Vereinsvorstand angegeben. |
| |
===== Übersichtsseite aller Artikel ===== | === Vorlage für Formular === |
| |
Das Archiv wird von "Simple Yearly Archive" bereitgestellt. Die Einstellungen sind überwiegend auf Standard belassen, als Datumsformat ist "d.m." eingestellt. | Das Kontaktformular entspricht im Wesentlichen der Standardeinstellung, es wurde jedoch ein Frage-Feld ergänzt, welches vor dem Absenden beantwortet werden muss, um den ein oder anderen Spam-Bot abzuhalten. Groß-/Kleinschreibung ist für die Antworten nicht relevant. |
| |
===== XML-Sitemap ===== | <code><label>Dein Name |
| [text* your-name] </label> |
| |
Die Sitemap wird vom Plugin "XML Sitemap & Google News" erzeugt. In den Einstellungen unter "Post Types" ist "Split by" auf "keine" eingestellt, Rest ist Standard. | <label>Deine E-Mail-Adresse |
| [email* your-email] </label> |
| |
In den Wordpress-Einstellungen für "Schreiben" ist zu prüfen, dass die Ping-Services für Google und Bing/Yahoo aktiviert sind, damit beim Veröffentlichen von Beiträgen die geänderte Sitemap an die Suchmaschinen gemeldet wird für die Indexierung. | <label>Betreff |
| [text* your-subject] </label> |
| |
===== Raumstatus ===== | <label>Deine Nachricht (optional) |
| [textarea your-message] </label> |
| |
Für die Darstellung des Raumstatus in der Seitenleiste wird das Plugin "Advanced Text Widget" benötigt, da Wordpress standardmäßig keinen PHP-Code ausführt. | [quiz quiz-515 "In welcher Stadt befindet sich unser Verein?|xxx" "Wie heißt die Bundeshauptstadt von Deutschland?|Berlin" "Was fördert unser Verein?|xxx"] |
| |
Der Code für den Status sieht wie folgt aus: | [submit "Senden"]</code> |
| |
<code php> | === Honeypot gegen Spam === |
<?php | |
| |
$ctx = stream_context_create(array( | Sollte die Sicherheitsfrage zur Abwehr von Spammern nicht ausreichen, kann ggf. noch zusätzlich/alternativ das Plugin [[https://de.wordpress.org/plugins/contact-form-7-honeypot/|Contact Form 7 Honeypot]] getestet werden. Aktuell ist es nicht installiert. |
'http' => array( | |
'timeout' => 1 | |
) | |
) | |
); | |
$obj = json_decode(file_get_contents('http://status.bytespeicher.org/status.json', false, $ctx)); | |
| |
if (isset($obj->state->open) && $obj->state->open === true) { | ==== Übersichtsseite aller Artikel ==== |
$f = $obj->state->icon->open; | |
$text = "Der Bytespeicher ist offen!"; | |
} else { | |
$f = $obj->state->icon->closed; | |
$text = "Der Bytespeicher ist geschlossen!"; | |
} | |
| |
$f = str_replace('http://status.bytespeicher.org/', 'https://bytespeicher.org/status/', $f); | Das Archiv wird von "Simple Yearly Archive" bereitgestellt. Die Einstellungen sind überwiegend auf Standard belassen, als Datumsformat ist "d.m." eingestellt. |
| |
echo "<p style='text-align:center;'><a target='_blank' href='http://status.bytespeicher.org/'><img src='$f' title='$text' alt='Raumstatus des Bytespeicher' style='width:100%;max-width:200px;' /></a>"; | ==== Cache Enabler ==== |
echo '<br />'.$text."</p>"; | |
| |
| * Zwischengespeicherte Seiten mit gzip vorkomprimieren. **aktiviert** |
| |
$ctx = stream_context_create(array( | Alle anderen Einstellungen sind deaktiviert bzw. leer. |
'https' => array( | |
'timeout' => 1 | |
) | |
) | |
); | |
$obj = json_decode(file_get_contents('https://status.makerspace-erfurt.de/status.json', false, $ctx)); | |
| |
if (isset($obj->state->open) && $obj->state->open === true) { | ==== Subscribe to Comments Reloaded ==== |
$f = $obj->icon->open; | |
$text = "Der Makerspace ist offen!"; | |
} else { | |
$f = $obj->icon->closed; | |
$text = "Der Makerspace ist geschlossen!"; | |
} | |
| |
$f = str_replace('https://status.makerspace-erfurt.de/', 'https://status.makerspace-erfurt.de/', $f); | * StCR Checkbox... **Ja** |
| * Sicher deinstallieren **Ja** |
| * Anfragen automatisch löschen **30** Tage |
| * Datumsformat **d M Y** |
| * StCR Position **Nein** |
| * Double Opt-In aktivieren **Ja** |
| * Autoren abonnieren **Nein** |
| * Aktiviere HTML E-Mails **Nein** |
| * Trackbacks senden **Nein** |
| * Verfolge alle Benachrichtigungen **Nein** |
| * Admin-Abonnement erlauben **Nein** |
| * BCC Admin bei Benachrichtigungen **Nein** |
| * "Font Awesome" aktivieren **Nein** |
| * Nur für Blog-Beiträge aktivieren **Ja** |
| * Nur für angemeldete Benutzer aktivieren **Nein** |
| * Cookies aktivieren **Ja** |
| * Challenge-Frage aktivieren **Nein** |
| * Challenge-Frage //egal// |
| * Challenge-Frage //egal// |
| * Eindeutiger StCR Schlüssel //automatisch erzeugt// |
| |
echo "<p style='text-align:center;'><a target='_blank' href='https://status.makerspace-erfurt.de/'><img src='$f' title='$text' alt='Raumstatus' width='100px' style='width:100%;max-width:200px;' /></a><br />"; | ==== XML-Sitemap ==== |
echo $text."</p>"; | |
| |
?></code> | Die Sitemap wird vom Plugin "XML Sitemap & Google News" erzeugt. In den Einstellungen unter "Post Types" ist "Split by" auf "keine" eingestellt, Rest ist Standard. |
| |
Alternativ-Code ohne Textausgabe und mit kleineren Icons: | In den Wordpress-Einstellungen für "Schreiben" ist zu prüfen, dass die Ping-Services für Google und Bing/Yahoo aktiviert sind, damit beim Veröffentlichen von Beiträgen die geänderte Sitemap an die Suchmaschinen gemeldet wird für die Indexierung. |
| |
| ==== Raumstatus ==== |
| |
| Für die Darstellung des Raumstatus in der Seitenleiste wird das Plugin "Advanced Text Widget" benötigt, da Wordpress standardmäßig keinen PHP-Code ausführt. |
| |
| Der Code für den Status sieht wie folgt aus. |
| Die Größe der Logos lässt sich durch Änderung der Variable $cssMaxWidth anpassen. |
| |
<code php> | <code php> |
<?php | <?php |
| |
$ctx = stream_context_create(array( | // Spaces |
'http' => array( | $spaces = [ |
'timeout' => 1 | 'Bytespeicher' => 'http://status.bytespeicher.org', |
) | 'Makerspace' => 'http://status.makerspace-erfurt.de', |
) | ]; |
); | |
$obj = json_decode(file_get_contents('http://status.bytespeicher.org/status.json', false, $ctx)); | |
| |
if (isset($obj->state->open) && $obj->state->open === true) { | // Max width of icon (small = 100, large = 200) |
$f = $obj->state->icon->open; | $cssMaxWidth = 100; |
$text = "Der Bytespeicher ist offen!"; | |
} else { | |
$f = $obj->state->icon->closed; | |
$text = "Der Bytespeicher ist geschlossen!"; | |
} | |
| |
$f = str_replace('http://status.bytespeicher.org/', 'https://bytespeicher.org/status/', $f); | // JSON path for URI |
| $statusJsonPath = '/status-minimal.json'; |
| |
echo "<a target='_blank' href='http://status.bytespeicher.org/'><img src='$f' title='$text' alt='Raumstatus des Bytespeicher' style='width:100%;max-width:100px;' /></a>"; | // Create stream context with low timeout |
| $context = stream_context_create([ |
| 'http' => [ |
| 'method' => "GET", |
| 'timeout' => 1 |
| ] |
| ]); |
| |
$ctx = stream_context_create(array( | // Check every space |
'https' => array( | // No output on errors |
'timeout' => 1 | foreach ($spaces as $spaceName => $statusUrl) { |
) | // Get minimal status from spacestatus webpage |
) | $jsonContent = file_get_contents($statusUrl . $statusJsonPath, false, $context); |
); | if ($jsonContent === false) { |
$obj = json_decode(file_get_contents('https://status.makerspace-erfurt.de/status.json', false, $ctx)); | // Status could not be received, skip it |
| continue; |
| } |
| |
if (isset($obj->state->open) && $obj->state->open === true) { | // Decode JSON with max depth of 2 |
$f = $obj->icon->open; | $jsonContent = json_decode($jsonContent, false, 2); |
$text = "Der Makerspace ist offen!"; | if (is_null($jsonContent) || !isset($jsonContent->open) || !isset($jsonContent->icon)) { |
} else { | // JSON could not be decoded or entries missing |
$f = $obj->icon->closed; | continue; |
$text = "Der Makerspace ist geschlossen!"; | } |
| |
| // Output spaces |
| $text = 'Der ' . $spaceName . ' ist ' . ($jsonContent->open === true ? 'offen' : 'geschlossen') . '!'; |
| echo '<a href=\'' . $statusUrl . '\'>'; |
| echo '<img src=\'' . $jsonContent->icon . '\' title=\'' . $text . '\' alt=\'Raumstatus des ' . $spaceName . '\' style=\'width:100%;max-width:' . $cssMaxWidth . 'px;\' />'; |
| echo '</a>'; |
} | } |
| |
$f = str_replace('https://status.makerspace-erfurt.de/', 'https://status.makerspace-erfurt.de/', $f); | |
| |
echo "<a target='_blank' href='https://status.makerspace-erfurt.de/'><img src='$f' title='$text' alt='Raumstatus' width='200px' style='width:100%;max-width:100px;' /></a>"; | |
| |
?></code> | ?></code> |