<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Datenbanken on Natenoms Blog</title><link>https://natenom.de/tags/datenbanken/</link><description>Recent content in Datenbanken on Natenoms Blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright/><lastBuildDate>Fri, 25 Mar 2022 17:08:49 +0100</lastBuildDate><atom:link href="https://natenom.de/tags/datenbanken/index.xml" rel="self" type="application/rss+xml"/><item><title>DokuWiki in statische Website umwandeln</title><link>https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/</link><pubDate>Fri, 25 Mar 2022 17:08:49 +0100</pubDate><guid>https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/</guid><description>Nach circa 12 Jahren habe ich mein gern genutztes DokuWiki auf wikiarchiv.natenom.de in den Ruhestand geschickt. Bereits zuvor hatte ich fast alle Themenbereiche in mein neues Wiki auf wiki.natenom.de verschoben.
Ziel war es, nur noch Webseiten zu haben, die statisch sind. D. h. sie werden nicht mehr auf einem Server mit PHP dynamisch erstellt sondern Zuhause einmalig vorgebaut, hochgeladen und dann bekommt jeder Benutzer immer die selben Dateien.
Dadurch benötigt man weder eine Scriptsprache auf dem Server noch eine Datenank (was DokuWiki aber auch so nicht benötigt, da es mit Text-Dateien statt einer Datenbank arbeitet).</description><content:encoded><![CDATA[<p>Nach circa 12 Jahren habe ich mein gern genutztes DokuWiki auf <a  href="https://wikiarchiv.natenom.de/">wikiarchiv.natenom.de</a> in den Ruhestand geschickt. Bereits zuvor hatte ich fast alle Themenbereiche in mein neues Wiki auf <a  href="https://wiki.natenom.de/">wiki.natenom.de</a> verschoben.</p>
<p>Ziel war es, nur noch Webseiten zu haben, die statisch sind. D. h. sie werden nicht mehr auf einem Server mit PHP dynamisch erstellt sondern Zuhause einmalig vorgebaut, hochgeladen und dann bekommt jeder Benutzer immer die selben Dateien.</p>
<p>Dadurch benötigt man weder eine Scriptsprache auf dem Server noch eine Datenank (was DokuWiki aber auch so nicht benötigt, da es mit Text-Dateien statt einer Datenbank arbeitet).</p>
<p>Hier beschreibe ich alle notwendigen Schritte, um aus einem aktuellen DokuWiki eine statische Website zu erstellen, die man dann sorglos auf jeden Webspace werfen kann.</p>
<p>Das Werkzeug meiner Wahl ist <code>wget</code>, mit dem man ganze Websites oder Teile davon herunterladen kann. Dieses habe ich schon in der Vergangenheit genutzt, um mein altes <a  href="https://natenom.de/2017/10/wie-man-ein-dynamisches-mediawiki-in-eine-statische-webseite-nur-html-dateien-umwandeln-kann/">MediaWiki in den Ruhestand zu schicken</a>.</p>

<h2 id="ziel-eines-archivierten-wikis" data-numberify>Ziel eines archivierten Wikis<a class="anchor ms-1" href="#ziel-eines-archivierten-wikis"></a></h2>
<p>Ich wollte den aktuellen Zustand des Wikis komplett mit allen Themenbereichen in einem Paket haben. Auch mit den Themenbereichen, die bereits im neuen Wiki enthalten sind. Damit die Informationen nicht doppelt vorhanden sind, sollten Weiterleitungen eingerichtet werden, sodass man beim &ldquo;Öffnen/Anklicken&rdquo; solcher Themenbereiche automatisch im neuen Wiki landet.</p>
<p>Das hat unter anderem den Hintergrund, dass man sehr einfach noch an die umgezogenen Themenbereiche dran kommt. Hätte ich sie im Wiki gelöscht, wären sie auch nicht mehr in der Sidebar links zu sehen.</p>
<p>Zudem besteht so die Möglichkeit, dass man das komplette archivierte Wiki weitergeben kann oder lokal zur Verfügung stellen. Als Archiv halt.</p>

<h2 id="vorbereitungen-am-wiki-vor-dem-herunterladen-mit-wget" data-numberify>Vorbereitungen am Wiki vor dem Herunterladen mit wget<a class="anchor ms-1" href="#vorbereitungen-am-wiki-vor-dem-herunterladen-mit-wget"></a></h2>
<p>Damit später im archivierten Wiki möglichst selten 404-Fehlermeldungn erscheinen, habe ich alles deatkviert, was man nicht benötigt und/oder was ohne PHP nicht mehr funktionieren würde.</p>

<h3 id="deaktivierte-aktionen-von-dokuwiki" data-numberify>Deaktivierte &lsquo;Aktionen&rsquo; von DokuWiki<a class="anchor ms-1" href="#deaktivierte-aktionen-von-dokuwiki"></a></h3>
<p>In der Konfiguration von DokuWiki ist es möglich, bestimmte <a  class='urlextern'  href="http://www.dokuwiki.org/config:disableactions">Aktionen</a> zu deaktivieren. Einige davon waren bereits zuvor deaktiviert, ich habe dann noch alle anderen deaktiviert:</p>
<ul>
<li>Übersicht</li>
<li>&ldquo;Letzte Änderungen&rdquo;</li>
<li>&ldquo;Links hierher&rdquo;</li>
<li>&ldquo;Benutzerprofil&rdquo;</li>
<li>&ldquo;Suche&rdquo;, da sie PHP benötigt.</li>
<li>&ldquo;Setze neues Passwort&rdquo;.</li>
<li>&ldquo;Diese Seite bearbeiten&rdquo;</li>
<li>Medien-Manager – Bei &ldquo;Andere Aktionen (durch Komma getrennt)&rdquo; <code>media</code> eingeben. Beim Aufruf von <code>/start?do=media&amp;ns=</code> erscheint die Fehlermeldung <code>Action disabled: media</code>. Das hätte ich schon vor Jahren machen können, hätte ich es gewusst. Denn das war ein Bereich, der dauernd von Bots abgefragt wurde.</li>
</ul>
<p></p><figure class="image-caption"><a href="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions.png"><picture>
                <source type="image/webp" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_816x0_resize_q95_h2_catmullrom_3.webp" title="Disabled actions in DokuWiki" loading="lazy" width="816" height="152" /></picture></a><figcaption>Disabled actions in DokuWiki</figcaption></figure><p>
</p>

<h2 id="indexmenü-ohne-javascript" data-numberify>Indexmenü ohne Javascript<a class="anchor ms-1" href="#indexmenü-ohne-javascript"></a></h2>
<p>Ich habe das Indexmenu für die Sidebar (links) (Seitenname <code>/wiki/sidebar</code>) auf <code>nojs</code> umgestellt, damit kein JavaScript verwendet wird. Aus <code>{{indexmenu&gt;..#1|js#indextheme navbar tsort nsort notoc noscroll nocookie}}</code> wird <code>{{indexmenu&gt;..#1|nojs#indextheme navbar tsort nsort notoc}}</code>. Die Dokumentation dazu <a  class='urlextern'  href="https://www.dokuwiki.org/plugin:indexmenu#full_syntax">gibt es hier</a>.</p>
<p>Die Liste der obersten Ebenen reicht in der Sidebar völlig aus, denn in jedem Namensraum ist am Ender der Startseite schon ein Indexmenü eingefügt, sodass man auf alle Seiten dort zugreifen kann. Zudem wird die Sidebar geöffnet dargestellt, sobald man sich auf einer Seite in einem der Unterbereiche befindet.</p>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content">Ich habe getestet, wie es aussieht, wenn ich zumindest den kompletten Seitenbaum für die Bereiche Mumble und Minecraft immer geöffnet lasse. Dann ist das Wiki auf mobilien Geräten nicht mehr zu gebrauchen, da die Liste aller Seiten extrem lang ist. Schon meine Mumble-Dokumentation besteht aus ca. 330 Seiten.</div>
</div>

<h3 id="weitere-änderungen" data-numberify>Weitere Änderungen<a class="anchor ms-1" href="#weitere-änderungen"></a></h3>
<ul>
<li>DokuWiki-eigene Topbar-Seite gelöscht.</li>
<li>Translation Plugin deaktiviert, da es sonst Links gibt auf z. B. <code>start?id=linux/pulseaudio</code>. Das wäre dann komplizierter geworden mit den ganzen Weiterleitungen (siehe unten) und es sind nur ein paar wenige Seiten in englischer Sprache in meinem Wiki (die ich später ins neue verschieben werde).</li>
<li>Alle Benutzer außer Admin gelöscht</li>
<li>Die Seite <code>/wiki/syntax</code> gelöscht. Die ist in jedem DokuWiki &ldquo;vorinstalliert&rdquo;.</li>
<li>Namensraum <code>en</code> (English) aus dem Indexmenu ausgeschlossen.</li>
<li>Startseite angepasst mit der Information, dass das Wiki archiviert wurde und nun statisch ist.</li>
</ul>

<h2 id="es-geht-los--wiki-mit-wget-herunterladen" data-numberify>Es geht los – Wiki mit wget herunterladen<a class="anchor ms-1" href="#es-geht-los--wiki-mit-wget-herunterladen"></a></h2>
<p>Während des Herunterladens habe ich <a  href="/2022/03/umzug-dokuwiki-hugo-4-einrichtung-fertig/#weiterleitungen">sämtliche Weiterleitungen auf das neue Wiki</a> temporär deaktiviert. Denn ich wollte das gesamte alte Wiki haben und nicht schon teiweise das neue.</p>
<p>Der Aufruf von wget zum Herunterladen des Wikis:</p>
<pre><code>wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=unix --no-parent --reject-regex 'do=' --domains wiki.natenom.de https://wiki.natenom.de
</code></pre>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>


<p>Ich habe das direkt auf dem Server ausgeführt, auf dem das Wiki läuft. Es hat circa 2 Minuten gedauert.</p>
<p>Die Befehlszeile habe ich von <a  class='urlextern'  href="https://gist.github.com/thomaspoignant/7cbae830acefb923e9d3fd373420f2f5">hier</a> und die war <a  class='urlextern'  href="https://www.tiktaktux.de/doku.php?id=linux:dokuwiki_mit_wget_export">hier</a> verlinkt.</p>
<p>Zusätzlich habe ich noch die Sitemap heruntergeladen, die mit oberem Befehl nicht heruntergeladen wird:</p>
<pre><code>wget https://wiki.natenom.de/sitemap.xml.gz
</code></pre>

<h3 id="wieso-weshalb-warum" data-numberify>Wieso, weshalb, warum<a class="anchor ms-1" href="#wieso-weshalb-warum"></a></h3>
<ul>
<li>Man könnte <code>--reject-regex</code> noch erweitern mit <code>'do=|feed.php'</code>. Ich möchte aber alle Feeds behalten, denn so kann man sehen, wenn man diese abonniert hat, dass es im Wiki nicht weiter geht. Und Programme und Suchmaschinen mögen es generell nicht, wenn Dateien plötzlich verschwinden. Dann lieber lassen und nichts neues eintragen.</li>
<li>Dass URLs mit dem Parameter <code>?do=</code> gefiltert werden, ist sinnvoll, weil man sonst zu jeder html-Datei noch einige weitere <code>abc.html?do=def</code> erhält. Z. B. für die Anmeldung, den Medien-Manager und einiges mehr. Hier der Unterschied zwischen einem Download mit wget mit <code>--reject-regex 'do='</code> (links) und ohne (rechts): </p><figure class="image-caption"><picture><source type="png" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-midnight-commander-je-nach-parameter.png" />
			         <img alt="" src="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-midnight-commander-je-nach-parameter.png" title="Links mit do= und rechts ohne" width="726" height="592" loading="lazy" /></picture><figcaption>Links mit do= und rechts ohne</figcaption></figure><p>
</li>
</ul>

<h2 id="dokuwiki-durch-statische-website-ersetzen" data-numberify>DokuWiki durch statische Website ersetzen<a class="anchor ms-1" href="#dokuwiki-durch-statische-website-ersetzen"></a></h2>
<p>Dann war der Zeitpunkt gekommen, das noch laufende DokuWiki durch das heruntergeladene archivierte Wiki zu ersetzen.</p>
<p>Das eine fliegt aus dem Webserver-Verzeichnis raus, das andere kommt rein. Dazu habe ich dann noch die zuvor heruntergeladene Sitemap hineinkopiert.</p>
<p>Backups sind immer wichtig, falls man doch noch mal an irgendwelche Dinge dran müsste.</p>

<h2 id="nacharbeiten-in-der-konfiguration-des-webservers" data-numberify>Nacharbeiten in der Konfiguration des Webservers<a class="anchor ms-1" href="#nacharbeiten-in-der-konfiguration-des-webservers"></a></h2>
<p>Die Konfiguration des Webservers kann man nach dem Umzug deutlich vereinfachen, da nur noch das ausgeliefert wird, was auf dem Server liegt, ohne von PHP verarbeitet werden zu müssen. Darauf gehe ich hier nicht ein sondern werde nur ein paar Dinge nennen, die man ändern muss.</p>

<h3 id="mime-types-wegen-cache-anhang-in-dateinamen" data-numberify>Mime Types wegen &lsquo;Cache&rsquo;-Anhang in Dateinamen<a class="anchor ms-1" href="#mime-types-wegen-cache-anhang-in-dateinamen"></a></h3>
<p>Da ein Dokuwiki einen Cachingmechanismus hat, werden einie Dateien, z. B. Bilder, je nach Art der Einbindung, mit <code>?cache=</code> am Ende referenziert und beim Herunterladen entsprechend von wget benannt. Z. B. wird aus <code>/url/zu/bild.jpg</code> <code>/url/zu/bild.jpg?cache=</code>.</p>
<p>Klickt man auf eine solch referenzierte Datei, dann bietet der Webserver diese zum Download an, statt sie im Browser anzuzeigen. Das liegt daran, dass der Webserver nichts mit dieser &ldquo;Dateiendung&rdquo; anfangen kann.</p>
<p>Deshalb muss man dem Webserver mitteilen, was sich hinter diesen Endungen verbirgt. Das geht mit der folgenden Konfiguration: <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> ~ <span style="color:#e6db74">\.jpg\?cache=</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">types</span> { }
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">default_type</span> <span style="color:#e6db74">image/jpeg</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> ~ <span style="color:#e6db74">\.png\?cache=</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">types</span> { }
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">default_type</span> <span style="color:#e6db74">image/png</span>;
</span></span><span style="display:flex;"><span>    }</span></span></code></pre></div>

<h3 id="jetzt-zusätzlich-auch-auch-html-am-ende-achten" data-numberify>Jetzt zusätzlich Auch auch .html am Ende achten<a class="anchor ms-1" href="#jetzt-zusätzlich-auch-auch-html-am-ende-achten"></a></h3>
<p>Die mit wget heruntergeladenen Dateien haben alle eine .html-Dateierweiterung bekommen. D. h. aus der vorherigen URL <code>/android/</code> wurde <code>/android.html</code>.</p>
<p>Damit aber z. B. Links von extern noch richtig funkionieren, die ja auf <code>/android/</code> verweisen, muss der Webserver angewiesen werden nicht nur auf <code>/android/</code> zu prüfen, sondern auch auf <code>/android.html</code> und dann das Gefundene nutzen. Daher muss das in die config für das alte Wiki (wiki.natenom.de) das hier hinein:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> <span style="color:#e6db74">/</span> <span style="color:#e6db74">...</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">try_files</span> $uri $uri.html $uri/ =<span style="color:#ae81ff">404</span>;</span></span></code></pre></div></p>
<p>Der Webserver prüft also auf <code>android</code>, <code>android.html</code> und <code>/android/</code> und gibt erst 404 zurück, wenn nichts davon gefunden wird.</p>

<h3 id="weiterleitungen-mit-html-auch-am-ziel-beachten" data-numberify>Weiterleitungen mit .html auch am Ziel beachten<a class="anchor ms-1" href="#weiterleitungen-mit-html-auch-am-ziel-beachten"></a></h3>
<p>Da viele Inhalte meines alten Wikis schon in meinem neuen Wiki (wiki.natenom.com) enhalten sind und ensprechend verlinkt werden, musste ich auch dort noch die Konfiguration des Webservers anpassen.</p>
<p>Ich leite nach folgendem Muster von meinem alten Wiki ins neue Wiki weiter:</p>
<p><code>rewrite ^/android(.*)$ https://wiki.natenom.de/docs/android$1 redirect;</code></p>
<p>Das bedeutet, dass z. B. ein weitergeleitetes <code>https://wiki.natenom.de/android</code> im neuen Wiki <code>wiki.natenom.com/</code> sowohl in der Form <code>/android</code> als auch in der Form <code>/android.html</code> ankommen kann. Damit letztere Form im neuen Wiki keine 404 verursacht, kann man den Webserver anweisen, die Dateiendung immer zu entfernen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> <span style="color:#e6db74">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">if</span> <span style="color:#e6db74">(</span>$request_uri ~ <span style="color:#e6db74">^/(.*)\.html)</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">return</span> <span style="color:#ae81ff">302</span> <span style="color:#e6db74">/</span>$1;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }</span></span></code></pre></div>
<p>Somit landen alle Formen der Weiterleitung am richtigen Ziel:</p>
<ul>
<li><code>/android</code> -&gt; <code>wiki.natenom.com/android</code></li>
<li><code>/android.html -&gt; wiki.natenom.com/android</code>.</li>
</ul>

<h2 id="aufräumarbeiten" data-numberify>Aufräumarbeiten<a class="anchor ms-1" href="#aufräumarbeiten"></a></h2>
<p>Dafür habe ich in den letzten Wochen und Monaten immer wieder sehr viel Arbeit investiert. Und nun war es endich soweit. Alle meine Webseiten waren statisch und so konnte ich (nachdem ich schon vor Monaten MySQL deinstallieren konnte, weil der Blog statisch wurde) endlich auch PHP von meinem Server deinstallieren:</p>
<pre><code>systemctl stop php7.3-fpm
systemctl disable php7.3-fpm

apt remove --purge php*

php php-common php-fpm php-gd php-imagick php-mbstring php-sqlite3 php-xml php-zip php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-fpm php7.3-gd php7.3-json php7.3-mbstring php7.3-opcache php7.3-readline php7.3-sqlite3 php7.3-xml php7.3-zip
</code></pre>
<p>Fertig 🙂</p>
<p>Hier das Ergebnis: Mein archiviertes Wiki, das jetzt auf <a  href="https://wikiarchiv.natenom.de/">wiki.natenom.de</a> liegt.</p>
<p></p><figure class="image-caption"><a href="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de.png"><picture>
                <source type="image/webp" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="634" /></picture></a><figcaption></figcaption></figure><p>
</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Für weitere Dateitypen beliebig erweiterbar.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded><enclosure url="https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/cover.png" length="243439" type="image/png"/></item><item><title>Was man alles nicht mehr benötigt, wenn man WordPress durch Hugo ersetzt hat</title><link>https://natenom.de/2022/02/was-man-alles-nicht-mehr-benoetigt-wenn-man-wordpress-durch-hugo-ersetzt-hat/</link><pubDate>Fri, 11 Feb 2022 05:28:03 +0100</pubDate><guid>https://natenom.de/2022/02/was-man-alles-nicht-mehr-benoetigt-wenn-man-wordpress-durch-hugo-ersetzt-hat/</guid><description>Update: Jemand hat per E-Mail angemerkt, dass WordPress zwar mehr Anforderungen habe, dafür aber auch mehr Funktionalität wie Login oder Teamfähigkeit (die ich aber auch nicht benötige). Das ist richtig. :)
Ich habe Anfang Februar 2022 diesen Blog hier von WordPress auf Hugo umgestellt. Ich lasse hier mal die Liste der Vorteile stehen, die sich dadurch für meine Infrastruktur ergeben haben, falls ich jemals wieder mit dem Gedanken spielen sollte, WordPress oder etwas Ähnliches wieder verwenden zu wollen.</description><content:encoded><![CDATA[<div class="shortcode-update">
<p>Update: Jemand hat per E-Mail angemerkt, dass WordPress zwar mehr Anforderungen habe, dafür aber auch mehr Funktionalität wie Login oder Teamfähigkeit (die ich aber auch nicht benötige). Das ist richtig. :)</p>
</div>

<p>Ich habe Anfang Februar 2022 diesen Blog hier von <a  href="/2022/01/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">WordPress auf Hugo umgestellt</a>. Ich lasse hier mal die Liste der Vorteile stehen, die sich dadurch für meine Infrastruktur ergeben haben, falls ich jemals wieder mit dem Gedanken spielen sollte, WordPress oder etwas Ähnliches wieder verwenden zu wollen. Was ich derzeit nicht tue :)</p>
<ul>
<li>MySQL-Server abschalten und deinstallieren. Habe sonst nur noch ein <a  href="https://wiki.natenom.de/">DokuWiki</a> im Betrieb, das keine Datenbank benötigt, weil es mit Flat files arbeitet.</li>
<li>Backup von MySQL-Server deaktivieren.</li>
<li>Backup des Webverzeichnisses des Blogs deaktivieren. Schließlich liegt jetzt die komplette Seite in einem lokalen Git-Repository und wird nur auf den Server geworfen.</li>
<li>Alle Zugangsdaten für den Blog verwerfen.</li>
<li>Schutzvorrichtungen (Basic Auth) für verschiedene Webverzeichnisse des Blogs wie <code>/wp-admin</code> entfernt.</li>
<li>Vereinfachung der Nginx Konfiguration, da der Webserver für den Blog nur noch statische Dateien ausliefern muss.</li>
<li>Entfernen des Cronjobs, der alle 10 Minuten lief und dafür sorgte, dass geplante Blogbeiträge zuverlässig veröffentlicht wurden, auch dann, wenn gerade niemand im Blog unterwegs war.</li>
<li>Im Newsreader konnte ich den Filter löschen, den ich vor Jahren angelegt hatte, um News über Sicherheitslücken in WordPress und in Plugins zu erhalten.</li>
</ul>
]]></content:encoded></item><item><title>Umzug von WordPress zu Hugo – Teil 2 – Bestandsaufnahme und Korrekturen</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/</link><pubDate>Thu, 03 Feb 2022 10:10:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/</guid><description>Im ersten Teil ging um die Gründe meines Wechsels von WordPres zu Hugo und wie man den Wechsel technisch umsetzt und am Ende einen lauffähigen Blog mit Hugo hat, dem man im Browser lokal anschauen kann.
Hier im zweiten Teil geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</description><content:encoded><![CDATA[<p>Im <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">ersten Teil</a> ging um die Gründe meines Wechsels von WordPres zu Hugo und wie man den Wechsel technisch umsetzt und am Ende einen lauffähigen Blog mit Hugo hat, dem man im Browser lokal anschauen kann.</p>
<p>Hier im zweiten Teil geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt. Das hat den Vorteil, dass ich den Blog mit Hugo bereits aktiv nutzen kann und nicht im Hintergrund erst alles auf manuell auf Markdown umstellen musste.</p>
<p>Es wird nicht ganz so viel werden, wie im ersten Teil.</p>

<h2 id="übrig-gebliebenes-html-schön-machen" data-numberify>Übrig gebliebenes HTML schön machen<a class="anchor ms-1" href="#übrig-gebliebenes-html-schön-machen"></a></h2>
<p>Wie bereits erwähnt enthalten viele exportiere Beiträge noch einiges an HTML-Quelltext, der vom Export-Tool nicht in Markdown umgewandelt werden konnte. Und ich werde noch eine Weile mit diesem HTML Code leben müssen, bis ich es irgendwann geschafft habe, alles in sinnvolles Markdown zu übersetzen.</p>
<p>Ich wollte aber schon vorher den neuen Blog mit Hugo veröffentlichen. Deshalb war es notwendig, dass ich diesen bestehenden HTML Code soweit schön mache, dass es am besten gar nicht auffällt, dass die Quelle noch kein Markdown verwendet.</p>
<p>Nachfolgend werden die dafür notwendigen Anpassungen erläutert.</p>

<h3 id="wichtig-wp-content-behalten" data-numberify>Wichtig: wp-content behalten<a class="anchor ms-1" href="#wichtig-wp-content-behalten"></a></h3>
<p>Damit nicht so gut wie alle Bilder und Fotos fehlen, die bisher nur über &ldquo;alten&rdquo; HTML-Code statt über Markdown eingebunden sind, habe ich eine Kopie des Verzeichnisses <code>wp-content/uploads/</code> auch im Webverzeichnis der neuen statischen Webseite eingebunden. So funktionieren alle bisherigen Verlinkungen und Einbettungen weiterhin.</p>
<p>Mit der Zeit werde ich alle Galerien im Blog so umschreiben, dass die Page Bundles benutzen, d. h. die Bilder für einen Beitrag sind zusammen mit dem Beitrag selbst in einem eigenen Verzeichnis.</p>

<h3 id="verzerrte-fotos-in-galerien" data-numberify>Verzerrte Fotos in Galerien<a class="anchor ms-1" href="#verzerrte-fotos-in-galerien"></a></h3>
<p>In einigen der Galerien wurden die Fotos noch in WordPress mit width=&ldquo;2000&rdquo; und height=&ldquo;xxx&rdquo; eingebunden. Das führte dazu, dass sie im neuen Hugo-Theme aufgrund der fehlenden Breite, oder weshalb auch immer, gestaucht angezeigt werden.</p>
<p>Daher habe ich die beiden Tags komplett entfernt mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/ width=&#34;[0-9]{1,4}&#34;//g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/ height=&#34;[0-9]{1,4}&#34;//g&#39;</span> *.md</span></span></code></pre></div>
<p>Diese Zeilen entfernen natürlich alle Vorkommen von width und height. Soweit ich gesehen habe, bleiben diese Tags nach dem Export aus WordPress aber wirklich nur bei Bildern und vermutlich auch bei Videos erhalten.</p>

<h3 id="unscharfe-fotos--zu-klein-wird-zu-groß-angezeigt" data-numberify>Unscharfe Fotos – Zu klein wird zu groß angezeigt<a class="anchor ms-1" href="#unscharfe-fotos--zu-klein-wird-zu-groß-angezeigt"></a></h3>
<p>In anderen Blogbeiträgen gab und gibt es immer noch unscharfe Fotos. Das liegt daran, dass diese Bilder in WordPress als kleine Vorschaubilder angezeigt wurden und bei einem Klick darauf die großen Varianten der Bilder in voller Auflösung in einer Lightbox geföffnet wurden.</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Unscharfes Bild" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp" title="Unscharfes Bild" loading="lazy" width="816" height="847" /></picture><figcaption>Unscharfes Bild</figcaption></figure><p>
</p>
<p>So sah der Beitrag ursprünglich in WordPress aus:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Wie es in WordPress aussah" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp" title="Wie es in WordPress aussah" loading="lazy" width="816" height="674" /></picture><figcaption>Wie es in WordPress aussah</figcaption></figure><p>
</p>

<h4 id="erste-möglichkeit-bei-unscharfen-bildern-lightbox-benutzen" data-numberify>Erste Möglichkeit bei unscharfen Bildern: Lightbox benutzen<a class="anchor ms-1" href="#erste-möglichkeit-bei-unscharfen-bildern-lightbox-benutzen"></a></h4>
<p>Die verwendete Lightbox öffnet im Overlay nicht die kleine Datei sondern die verlinkte, große Datei. In der Lightbox ist das Bild somit scharf.</p>
<p>So sieht es dann aus:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_5d4b7a29b4ffd2cfdc139f980d5d3ec3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_94cc4eae95910fd0164e99ee8ccd57bf.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Große Variante des Bildes wird in der Lightbox geladen" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_5d4b7a29b4ffd2cfdc139f980d5d3ec3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_94cc4eae95910fd0164e99ee8ccd57bf.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp" title="Große Variante des Bildes wird in der Lightbox geladen" loading="lazy" width="816" height="810" /></picture><figcaption>Große Variante des Bildes wird in der Lightbox geladen</figcaption></figure><p>
</p>
<p>In Hugo werden nur noch diese kleinen Bilder in viel zu groß dargestellt. Dank einer verwendeten Lightbox werden zumindest beim Anklicken die Originalfotos in einem Overlay angezeigt und für die Übergangszeit reicht mir das so auch.</p>
<p>Für diese Lösung habe ich mich erst einmal entschieden.</p>

<h4 id="zweite-möglichkeit-bei-unscharfen-bildern-html-automatisiert-anpassen-" data-numberify>Zweite Möglichkeit bei unscharfen Bildern: HTML automatisiert anpassen …<a class="anchor ms-1" href="#zweite-möglichkeit-bei-unscharfen-bildern-html-automatisiert-anpassen-"></a></h4>
<p>Man kann das Problem auch damit beheben, dass man den HTML-Quelltext so abändert, dass statt der kleinen Dateien überall die Originaldateien eingebunden werden, aber weiterhin auch verlinkt bleiben.</p>
<p>Damit wird z. B. statt dem eingebetteten Bild <code>mumble-git-1-100x50.jpg</code> das Bild <code>mumble-git-1.jpg</code> eingebunden. Nicht optimal, da es aus sein kann, dass ein riesiges Originalfoto von einer Landschaft dann relativ klein angezeigt wird. Öffnet man einen Blogbeitrag mit einer Galerie von Landschaftsfotos, dann sieht man zwar nur kleine Bilder, der Browser lädt dann aber direkt alle Bilder in voller Auflösung herunter.</p>
<p>Deshalb habe ich mich gegen diese Lösung entschieden, obwohl sie am besten aussieht.</p>
<p>Hier trotzdem die Befehlszeile(n), um die URLs der kleinen Varianten der Bilder gegen die Originale zu ersetzen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.jpg#\.jpg#g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.png#\.png#g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.gif#\.gif#g&#39;</span> *.md</span></span></code></pre></div>
<p>Natürlich muss man diese Zeilen für die verwendeten Dateitypen anpassen (png, gif, …).</p>
<p>Das Ergebnis wäre dann:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_78298c2eee0c2cdc88bdee4225e1021b.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_d406d7d22b0f55fb789d43d08d39d4a4.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic." srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_78298c2eee0c2cdc88bdee4225e1021b.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_d406d7d22b0f55fb789d43d08d39d4a4.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp" title="Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic." loading="lazy" width="816" height="810" /></picture><figcaption>Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic.</figcaption></figure><p>
</p>

<h3 id="srcsets-entfernen" data-numberify>srcsets entfernen<a class="anchor ms-1" href="#srcsets-entfernen"></a></h3>
<p>Um zusätzlich noch die srcsets aus solchen Galerien zu entfernen, kann man diese Zeile ausführen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s# class=&#34;.*;&#34; /&gt;#/&gt;#g&#39;</span> *.md</span></span></code></pre></div>
<p>Ich  habe das erst einmal sein lassen. Vielleicht schaffe ich es ja noch, dass diese srcsets doch noch genutzt werden, solange ich noch nicht alles auf Markdown umgewandelt habe.</p>

<h3 id="eingebettete-videos-werden-zu-breit-dargestellt" data-numberify>Eingebettete Videos werden zu breit dargestellt<a class="anchor ms-1" href="#eingebettete-videos-werden-zu-breit-dargestellt"></a></h3>
<p>Mit dem video-Tag eingebundene Videos sind im Theme so breit, dass sie teilweise hinter dem rechten Seitenpanel versteckt sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Video hängt hinter der Seitenleiste" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp" title="Video hängt hinter der Seitenleiste" loading="lazy" width="816" height="569" /></picture></a><figcaption>Video hängt hinter der Seitenleiste</figcaption></figure><p>
</p>
<p>Um das zu heben, habe ich erstmal ein bisschen css verwendet:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-css" data-lang="css"><span style="display:flex;"><span><span style="color:#f92672">video</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">max-width</span>: <span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">height</span>: <span style="color:#66d9ef">auto</span>;
</span></span><span style="display:flex;"><span>}</span></span></code></pre></div></p>
<p>Damit werden alle Videoeinbettungen, auch die, die ich später mit Markdown verwenden werde, richtig angezeigt.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Video ist wieder richtig" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp" title="Video ist wieder richtig" loading="lazy" width="816" height="569" /></picture></a><figcaption>Video ist wieder richtig</figcaption></figure><p>
</p>
<p>Später werde ich den HTML Code durch einen Shortcode video ersetzen.</p>

<h2 id="artikelbilder" data-numberify>Artikelbilder<a class="anchor ms-1" href="#artikelbilder"></a></h2>
<p>In den WordPress-Themes, die ich bisher verwendet hatte, gab es immer Artikelbilder. Ich finde das sehr schön, weil es meiner Ansicht nach auflockernd wirkt und man besser erkennt, worum es in einem Blogbeitrag gehen könnte. Deshalb fand ich es schade, als ich bemerkte, dass in meinem ausgewählten Theme keine Artikelbilder zu sehen waren.</p>
<p>Ich habe dann selbst versucht Artikelbilder zu implementieren und dabei dann entdeckt, dass das Theme solche durchaus vorsieht und nur die richtigen Angaben im Front Matter fehlten.</p>
<p>Dank des Exports von WordPress landeten im Frontmatter bei immerhin ca. 1900 von 2460 Beiträgen die Angaben zu Artikelbildern im Stil von:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">featured_image</span>: <span style="color:#ae81ff">dateiname.jpg</span></span></span></code></pre></div></p>
<p>Doch das Hugo Theme erwartet die folgende Struktur:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">images</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">dateiname.jpg</span></span></span></code></pre></div></p>
<p>Kein Problem, denn mit dem Streamingeditor <code>sed</code> unter Linux ist das mit einem Befehl erleidgt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/^featured_image: (.*)$/images:\n  - \1/&#39;</span> *.md</span></span></code></pre></div>
<p>Seitdem werden, wie auch im WordPress zuvor, Artikelbilder auch im mit Hugo generierten Blog angezeigt.</p>

<h2 id="reicht-wieder" data-numberify>Reicht wieder<a class="anchor ms-1" href="#reicht-wieder"></a></h2>
<p>Das reicht auch schon für den zweiten Teil.</p>
<p>Im nächsten Teil geht es dann um Lightboxen, Kommentare, um verschiedene Konfigurationsmöglichkeiten und mehr.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/cover.png" length="130038" type="image/png"/></item><item><title>Umzug von WordPress zu Hugo – Teil 1 – Von den Gründen bis zum ersten funktionierenden Blog</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</link><pubDate>Thu, 03 Feb 2022 07:30:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</guid><description>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.
Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann.</description><content:encoded><![CDATA[<p>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.</p>
<p>Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann. Und wenn jemand anderes damit auch noch etwas anfangen kann, dann ist es noch besser.</p>
<p>Dabei schreibe ich übrigens das erste Mal einen Blogbeitrag mit einem einfachen Editor, offline, ohne Browser, in einem einfachen Textbearbeitungsprogramm. Und das fühlt sich gut an.</p>

<h2 id="wieso-überhaupt-weg-von-wordpress" data-numberify>Wieso überhaupt weg von WordPress?<a class="anchor ms-1" href="#wieso-überhaupt-weg-von-wordpress"></a></h2>
<p>Ich habe WordPress seit 2009 für meinen Blog benutzt und es immer auf eigenen Servern selbst gehostet. Ich war immer sehr zufrieden damit. WordPress hat es mir ermöglicht, mich immer nur auf den Inhalt konzentrieren zu können und hat mir die ganze Arbeit drumherum abgenommen. Und es ist immer noch so. Das schätze ich an dem Content Management System WordPress. Jedes Upgrade auf eine neue Version war immer fehlerfrei mit nur wenigen Klicks möglich.</p>
<p>Die meisten Funktionen von WordPress habe ich nie benutzt. Und mit dem Update auf den Gutenberg-Editor und jetzt kürzlich auf 5.9 mit dem Super Feature &ldquo;Full Site Editing&rdquo; ist noch klarer geworden, dass ich solch ein komplexes System nicht benötige. Es ist immer noch sehr einfach zu bedienen und zu aktualisieren, aber ich brauche es eben nicht.</p>
<p>Was ich brauche, ist eine einfache Möglichkeit, Texte zu schreiben, die Maus möglichst nicht bewegen zu müssen und außerdem benötige ich nur die grundlegensten Formatierungen. Kurzum das, was <a  class='urlextern'  href="https://daringfireball.net/projects/markdown/">Markdown</a> bietet.</p>
<p>Natürlich sind da noch andere Aspekte:</p>
<ul>
<li>Wartbarkeit: Webserver, PHP, Datenbank, alles will gepflegt werden und benötigt ab und zu Aufmerksamkeit. Mit Hugo kann man den kompletten Blog, der aus statischen Dateien (HTML, CSS, JavaScript) besteht, auf einen Webserver werfen und für immer dort liegen lassen.</li>
<li>Portierbarkeit/Backup: Sollte ich mal vom Rad fallen und nicht mehr aufstehen, kann man sich das Archiv herunterladen und hat weiterhin Zugriff auf die Inhalte des Blogs. Entsprechend wird man sich später das einmal alle x Zeit aktualisierte Archiv herunterladen können. Dazu später mehr.</li>
<li>Sicherheit: Da nichts dynamisch ausgeführt wird, gibt es auch keine Sicherheitslücken, die jemand ausnutzen könnte.</li>
<li>&ldquo;Einfachheit&rdquo;: Text-Editor, Hugo laufen lassen, hochladen per SFTP. Fertig.</li>
</ul>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Fenster eines Texteditors unter KDE/Plasma" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp" title="Fenster eines Texteditors unter KDE/Plasma" loading="lazy" width="816" height="523" /></picture></a><figcaption>Fenster eines Texteditors unter KDE/Plasma</figcaption></figure><p>
</p>

<h2 id="ein-schönes-theme-für-hugo-finden" data-numberify>Ein schönes Theme für Hugo finden<a class="anchor ms-1" href="#ein-schönes-theme-für-hugo-finden"></a></h2>
<p>Man kann natürlich auch selbst ein Theme bauen, aber das ist nichts für mich.</p>
<p>Eine Liste von aktuell 285 Themes gibt es auf der Webseite von Hugo, siehe <a  class='urlextern'  href="https://themes.gohugo.io/">hier</a>.</p>
<p>Ich habe mich für das Theme <a  class='urlextern'  href="https://themes.gohugo.io/themes/hugo-theme-bootstrap/">Bootstrap Theme for Personal Blog and Documentations</a> entschieden, weil es fast alles liefert, was ich benötige und vielfältige Einstellungsmöglichkeiten hat.</p>
<p>Was ich besonders mag:</p>
<ul>
<li>Dark Mode/Light Mode</li>
<li>Suchfunktion (<a  class='urlextern'  href="https://fusejs.io">fuse.js</a>)</li>
<li>Durch Ausblenden der Seitenliste kann der Inhaltsbereich breiter gemacht werden.</li>
<li>Es gibt bereits Shortcodes für Nachrichtenboxen (Info, Alarm, &hellip;). Siehe <a  class='urlextern'  href="https://hbs.razonyang.com/en/docs/shortcodes/alert/">hier</a>.</li>
<li><a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-twitter-cards">Twitter Cards</a> und <a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-open-graph">Open Graph</a></li>
<li>Responsive</li>
<li>optional mehrsprachig</li>
<li>Archivseiten</li>
<li>Shortcods für Verleinern von Bildern. Die verkleinerten Bilder werden beim Rendern von Hugo aus den Originaldateien erzeugt.</li>
<li>Lazy loading für Bilder</li>
<li>Inhaltsverzeichnis für Blogbeiträge</li>
<li>Keine Einbindung von externen Inhalten</li>
<li>Liste von &ldquo;ähnlichen Beiträgen&rdquo;</li>
</ul>

<h2 id="vor-dem-export-in-wordpress-aufräumen" data-numberify>Vor dem Export in WordPress aufräumen<a class="anchor ms-1" href="#vor-dem-export-in-wordpress-aufräumen"></a></h2>

<h3 id="tabellen-aufräumen" data-numberify>Tabellen aufräumen<a class="anchor ms-1" href="#tabellen-aufräumen"></a></h3>
<p>Vor dem Export der Daten kann man den Blog noch etwas aufräumen. Hat man z. B. wie ich über die Jahre viele verschiedene Plugins ausprobiert und wieder entfernt, dann könnten die Daten der Plugins immer noch irgendwo in den Tabellen der Datenbank liegen und beim Export in den Daten landen. Das wären alles zusätzliche Daten, die man nicht benötigt.</p>
<p>Dazu hatte ich mal einen eigenen Blogbeitrag verfasst, siehe <a  href="/2021/05/datenbank-von-wordpress-auch-mal-aufraeumen/">hier</a>.</p>

<h3 id="entwürfe" data-numberify>Entwürfe<a class="anchor ms-1" href="#entwürfe"></a></h3>
<p>Werden Entwürfe exportiert, dann erhalten diese in der exportierten Version kein Datum und sind somit erstmal aus dem Sichtbereich raus oder bekommen seltsame Namen/URLs zugewiesen wie z. B. &ldquo;?p=52696/&rdquo;, das der fortlaufenden ID von Blogbeiträgen entspricht. Das will man später alles nicht einzeln bearbeiten müssen. Deshalb Entwürfe löschen oder veröffentlichen.</p>

<h3 id="verlinkungen-in-wordpress" data-numberify>Verlinkungen in WordPress<a class="anchor ms-1" href="#verlinkungen-in-wordpress"></a></h3>
<p>Man kann in WordPress entweder die komplette URL verwenden (Standard), um auf einen Beitrag im eigenen Blog zu verlinken oder die ID des Beitrags verwenden.</p>
<p>Die komplette URL wäre z. B. &ldquo;natenom.de/2021/01/beitrag-ueber-den-kleinen-elefanten&rdquo; während die ID &ldquo;natenom.de/?p=12345&rdquo; wäre.</p>
<p>Solche Verlinkungen sollte man noch im laufenden WordPress Blog finden und in die erste Form (lange URL) überführen, da die zweite Form mit der ID in Hugo nicht funktionieren wird.</p>
<p>Dazu reicht die Suchfunktion im Adminpanel aus. Man sucht nach &ldquo;/?p=&rdquo;. In meinem Fall fanden sich ca. 130 solcher Beiträge mit ID Verlinkungen.</p>

<h2 id="optional-backup-des-blogs--für-hugo-nicht-relevant" data-numberify>(optional) Backup des Blogs – Für Hugo nicht relevant<a class="anchor ms-1" href="#optional-backup-des-blogs--für-hugo-nicht-relevant"></a></h2>
<p>Da der Blog am Ende abgeschaltet werden soll, habe ich ein letztes Mal Backups gemacht:</p>
<ul>
<li>Backup der WordPress Datenbank</li>
<li>Als Admin in WordPress angemeldet und unter Werkzeuge -&gt; Daten exportieren -&gt; Alle Inhalte ausgewählt und die xml-Datei heruntergeladen. In dieser Datei sind alle Beiträge, alle Seiten und auch die Kommentare von Benutzern enthalten. Nicht jedoch die hochgeladenen Dateien. In meinem Fall ist die Datei um 50 MiB groß und hat um die 50000 Zeilen.</li>
<li>Backup des kompletten WordPress-Verzeichnisses inklusive den hochgeladenen Dateien und dem ganzen PHP-Zeug</li>
<li>Herunterladen der kompletten Webseite mit wget, um später noch nachvollziehen zu können, unter welchen URLs was zu finden war. Für solche URLs, die Hugo nicht generiert. Die könnte man dann mit einem Webserver passend weiterleiten. Die Kommandozeile dafür ist:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget --recursive --domains<span style="color:#f92672">=</span>natenom.de --html-extension --page-requisites --convert-links --no-parent <span style="color:#e6db74">&#34;/&#34;</span> -R <span style="color:#e6db74">&#34;*xmlrpc*&#34;</span> --reject-regex <span style="color:#e6db74">&#34;.*wp-content.*&#34;</span></span></span></code></pre></div>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>


<p>Das Verzeichnis <code>wp-content</code> habe ich bewusst ausgelassen, da es nur hochgeladene Dateien enthält (ca. 7 GiB), die bereits in einem anderen Backup enthalten sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp" title="Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien." loading="lazy" width="816" height="430" /></picture></a><figcaption>Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien.</figcaption></figure><p>
</p>

<h2 id="daten-für-hugo-aus-wordpress-exportieren" data-numberify>Daten für Hugo aus WordPress exportieren<a class="anchor ms-1" href="#daten-für-hugo-aus-wordpress-exportieren"></a></h2>
<p>Mit dem Tool <a  class='urlextern'  href="https://github.com/SchumacherFM/wordpress-to-hugo-exporter">WordPress to Hugo Exporter</a> kann man alle Seiten und Beiträg eines Blogs in eine Zip-Datei exportieren.</p>
<p>Ich gehe hier nicht darauf ein, wie man das Tool verwendet, da das ausreichend gut auf dessen Webseite erklärt ist. Wichtig ist hier nur, dass man am Ende eine Datei erhält, hier im Beispiel mit dem Namen wpexport.zip.</p>
<p>Auf der Projektseite steht, was man an der PHP-Datei anpassen muss, damit auch Kommentare exportiert werden.</p>
<p>Der Export kann eine ganze Weile dauern und sollte deshalb auf der Kommandozeile ausgeführt werden. Die <code>wpexport.zip</code> meines Blogs hatte eine Dateigröße von etwas mehr als 7 GiB.</p>
<p>Die Datei <code>wpexport.zip</code> hat diese Struktur:</p>
<pre tabindex="0"><code>seite-a/index.md
seite-b/index.md
irgendeine-seite/index.md
posts/
    2022-01-05-mein-beitrag-im-januar
    2022-01-06-mein-beitrag-ueber-bluemeleinchen
    2022-02-08-ein-neuer-beitrag-mit-tollen-fahrraedern
wp-content/
    uploads/
        2022/
            01/
                2022-01-04-hochgeladenes-bild-1.jpg
                2022-01-04-hochgeladenes-bild-2.jpg
config.yaml
</code></pre><ul>
<li>Es sind alle &ldquo;Seiten&rdquo; des Blogs als Verzeichnisse enthalten, in den index.md-Dateien sind die Inhalte.</li>
<li>Die &ldquo;Beiträge&rdquo; (Englisch &ldquo;Posts&rdquo;) liegen als md-Dateien im Verzeichnis &ldquo;posts&rdquo;.</li>
<li>Die hochgeladenen Dateien wie Fotos, Screenshots oder auch Audio und Video liegen im Verzeichnis wp-content/uploads, sortiert nach Jahr und Monat.</li>
<li>Dann gibt es noch die Datei config.yaml, welche die URL des Blogs enthält, den Namen und die Beschreibung.</li>
</ul>
<p>Die Daten lädt man dann auf den eigenen PC herunter.</p>

<h2 id="eine-webseite-mit-hugo-anlegen-und-theme-einfügen" data-numberify>Eine Webseite mit Hugo anlegen und Theme einfügen<a class="anchor ms-1" href="#eine-webseite-mit-hugo-anlegen-und-theme-einfügen"></a></h2>
<p>Ich will hier nicht darauf eingehen, wie man eine Webseite mit Hugo anlegt und das Theme einfügt, das ist auf der Projektseite bereits ausführlich gut dokumentiert, siehe <a  class='urlextern'  href="https://gohugo.io/getting-started/quick-start/">hier</a>.</p>
<p>Sobald das erledigt und das Theme eingebunden ist, kann man die exportierten Daten aus dem heruntergeladenen Archiv entpacken und die Daten in das Verzeichnis des neuen Blogs hineinkopieren:</p>
<ul>
<li>Die Datei <code>config.yaml</code> habe ich weg gelassen.</li>
<li>Das Verzeichnis <code>posts</code> wird nach <code>content</code> kopiert.</li>
<li>Das Verzeichnisse <code>seite-x</code> werden nach <code>content/pages</code> kopiert.</li>
<li>Das Verzeichnis <code>wp-content</code> wird nach <code>static</code> kopiert.</li>
</ul>

<h2 id="ein-bisschen-konfiguration" data-numberify>Ein bisschen Konfiguration<a class="anchor ms-1" href="#ein-bisschen-konfiguration"></a></h2>
<p>Eine Liste aller Einstellungsmöglichkeiten gibt es auf der <a  class='urlextern'  href="https://hbs.razonyang.com/v0/en/docs/configuration/">Seite des Theme-Entwicklers</a>.</p>

<h3 id="taxonomie" data-numberify>Taxonomie<a class="anchor ms-1" href="#taxonomie"></a></h3>
<p>Bei der Taxonomie wollte ich die URLs von WordPress möglichst erhalten.</p>
<p>Per Voreinstellung verwendet Hugo für tags in der URL &ldquo;tags&rdquo;, WordPress jedoch &ldquo;tag&rdquo;. Bei Kategorien verwendet Hugo &ldquo;categories&rdquo; und WordPress &ldquo;category&rdquo;.</p>
<p>Das kann man in der <code>config.toml</code> anpassen mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">taxonomies</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">category</span> = <span style="color:#e6db74">&#39;category&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">tag</span> = <span style="color:#e6db74">&#39;tag&#39;</span></span></span></code></pre></div>
<p>In meinem ausgewählten Theme funktioniert das jedoch leider nicht, da zwingend &ldquo;tags&rdquo; und &ldquo;categories&rdquo; notwendig sind. Kann man sicher anpassen, ich aber nicht. Also bleibt es bei den Voreinstellungen. Ich werde es dann einfach mit dem Webserver weiterleiten lassen.</p>
<p>In Nginx z. B. mit:</p>
<pre tabindex="0"><code>rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Wenn das gut funktioniert, kann man das später auf <em>permanent</em> umschreiben.</p>

<h3 id="beiträge-nicht-gelistet" data-numberify>Beiträge nicht gelistet<a class="anchor ms-1" href="#beiträge-nicht-gelistet"></a></h3>
<p>Auf der Startseite des Blogs wurden die Beiträge nicht gelistet. Mit Herumprobieren konnte ich herausfinden, dass das an dem Eintrag &ldquo;type: post&rdquo; im Front Matter (Metadaten eines Beitrags) lag. Daher habe ich mit dem folgenden Shell-Aufruf diese Zeile in allen md-Dateien gelöscht:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i <span style="color:#e6db74">&#34;/^type: post</span>$<span style="color:#e6db74">/d&#34;</span> *.md</span></span></code></pre></div>

<h3 id="sonstige-konfiguration" data-numberify>Sonstige Konfiguration<a class="anchor ms-1" href="#sonstige-konfiguration"></a></h3>
<p>Hier noch ein paar weitere wichtige Dinge, die ich in der Konfiguration eingestellt habe.
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">baseURL</span> = <span style="color:#e6db74">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">rssLimit</span> = <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">params</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">comment</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">breadcrumb</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">palette</span> = <span style="color:#e6db74">&#34;blue&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dateFormat</span> = <span style="color:#e6db74">&#34;Mon, 02 Jan 2006 15:04&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">mainSections</span> = [<span style="color:#e6db74">&#34;posts&#34;</span>, <span style="color:#e6db74">&#34;pages&#34;</span> ]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">poweredBy</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">math</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">diagram</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">logo</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">description</span> = <span style="color:#e6db74">&#34; Verkehrswende, Fahrrad, CriticalMass, OpenBikeSensor, SimRa, Mumble, Open Source, Minimalist, OpenStreetMap, Müllsammeln&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">recentPostCount</span> = <span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">relatedPostCount</span> = <span style="color:#ae81ff">6</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">categoryCount</span> = <span style="color:#ae81ff">200</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tagCount</span> = <span style="color:#ae81ff">150</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">searchBar</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">copyright</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">search</span>.<span style="color:#a6e22e">fuse</span>.<span style="color:#a6e22e">threshold</span> = <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">countTaxonomyPosts</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">excerpt</span> = <span style="color:#e6db74">&#34;description&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">viewer</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">showShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">socialShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">outputs</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">home</span> = [<span style="color:#e6db74">&#34;HTML&#34;</span>, <span style="color:#e6db74">&#34;RSS&#34;</span>, <span style="color:#e6db74">&#34;JSON&#34;</span>]</span></span></code></pre></div></p>

<h2 id="von-absoluten-urls-zu-relativen-urls" data-numberify>Von absoluten URLs zu relativen URLs<a class="anchor ms-1" href="#von-absoluten-urls-zu-relativen-urls"></a></h2>
<p>Ich habe keine Ahnung von SEO und habe mich nie damit beschäftigt. Könnte es sein, dass WordPress aus SEO-Gründen absoulte URLs verwendet und nicht realtive? Ich habe dazu die Info auf einer Webseite gefunden, dass relative Links problematisch werden könnten, wenn der Server nicht richtig eingerichtet sei.</p>
<p>Hat man Bedenken, dann weiter zum nächsten Abschnitt.</p>
<p>Aber: Will man den neuen Blog auf dem eigenen PC anschauen, benötigt man ohne die Veränderungen der URLs eine Internetverbindung, damit eingebettete Inhalte wie z. B. Bilder vom Browser von der ursprünglichen Webseite heruntergeladen werden können. Oder aber man biegt das DNS temporär um, muss dann aber zumindest aus https http machen, und so weiter.</p>

<h3 id="absolute-urls-auf-hochgeladene-dateien" data-numberify>Absolute URLs auf hochgeladene Dateien<a class="anchor ms-1" href="#absolute-urls-auf-hochgeladene-dateien"></a></h3>
<p>Alle Verlinkungen auf Fotos, Bilder und Videos sind in WordPress mit der absoulten URL angegeben, in meinem Fall mit <code>natenom.de/wp-content/uploads/...</code>. Und das wird so auch in die md-Dateien exportiert.</p>
<p>Deshalb kann man die URLs mit dem Streameditor sed umschreiben lassen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/wp-content/uploads/#/wp-content/uploads/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Das Kommando führt man in allen Verzeichnissen aus, in denen md-Dateien liegen. Man könnte das auch so umschreiben, dass es ausgehend vom neuen Blogverzeichnis alle md-Dateien findet und so alle erfasst. Aber so reicht es mir.</p>

<h3 id="absolute-urls-auf-blogbeiträge" data-numberify>Absolute URLs auf Blogbeiträge<a class="anchor ms-1" href="#absolute-urls-auf-blogbeiträge"></a></h3>
<p>Das selbe gilt auch für Verlinkungen im Blogbeiträgen auf andere Beiträg im eigenen Blog. Auch diese URLs lasse ich umschreiben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/#/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Aus dem absoulten Link <code>/</code> wird dadurch <code>/</code>.</p>

<h2 id="umlaute-in-urls-von-kategorien-und-tags" data-numberify>Umlaute in URLs von Kategorien und Tags<a class="anchor ms-1" href="#umlaute-in-urls-von-kategorien-und-tags"></a></h2>
<p>Ich verwende im Blog das Tag &ldquo;Müllsammeln&rdquo; und die Kategorie &ldquo;Mobilität&rdquo;. Wordpress hat dabei automatisch die Umlaute in den dafür genutzten URLs in die alternativen Schreibweisen &ldquo;muellsammeln&rdquo; und &ldquo;mobilitaet&rdquo; umgewandelt. Hugo macht das nicht, weshalb dort das Tag auch &ldquo;müllsammeln&rdquo; lautet.</p>
<p>Es gibt mehrere Lösungen:</p>
<ol>
<li>Es dabei belassen, denn mittlerweile sind diese Zeichen kein Problem mehr. Es sieht nur nicht sonderlich schön aus, wenn man statt <strong>mobilität</strong> das hier sieht <strong>mobilit%C3%A4t</strong></li>
<li>Ohne Veränderungen an den Beiträgen wäre die Option <strong>removePathAccents</strong> von Hugo möglich, die aus &ldquo;mobilität&rdquo; &ldquo;mobilitat&rdquo; macht.</li>
<li>Hugo selbst zu verändern, <a  class='urlextern'  href="https://www.von-laufenberg.de/blog/it/hugo-umlaute/">siehe hier</a>.</li>
<li>Alle Vorkommen der Tags in den Beiträgen mit sed umschreiben und ö durch oe ersetzen usw.</li>
<li>Weiterleitungen durch den Webserver, siehe unten.</li>
</ol>
<p>Einen Issue mit vielen Informationen zu diesem Theme gibt es auf Github, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/3476">siehe hier</a>. Ein weitere Issue zu dem Thema ist seit November 2021 noch offen, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/9134">siehe hier</a>.</p>
<p>Ich habe mich entschieden, das so zu belassen das erst einmal mit Weiterleitungen zu &ldquo;fixen&rdquo; und zu schauen, was sich bei dem Issue tut.</p>
<p>In Nginx sind diese:</p>
<pre tabindex="0"><code>rewrite ^/tag/muellsammeln/(.*)$ /tags/müllsammeln/$1 redirect;
rewrite ^/category/mobilitaet/(.*)$ /categories/mobilität/$1 redirect;
rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Ich nutze bei solchen Dingen am Anfang immer erst redirect, was dem HTTP Status 302 entspricht und ändere das dann irgendwann zu permanent (Status 301) um.</p>

<h2 id="fehlerseite-für-404" data-numberify>Fehlerseite für 404<a class="anchor ms-1" href="#fehlerseite-für-404"></a></h2>
<p>Falls doch mal eine Seite nicht gefunden wird, habe ich die <code>404.html</code> in Nginx eingerichtet:</p>
<pre tabindex="0"><code>error_page 404 /404.html;
</code></pre><p>Hier kann man die Seite mal ansehen: <a  href="/blabla-diese-seite-gibt-es-nicht">Dieser Link zeigt auf eine nicht vorhandene Seite</a>.</p>

<h2 id="damit-erstmal-keine-inhalte-fehlen" data-numberify>Damit erstmal keine Inhalte fehlen<a class="anchor ms-1" href="#damit-erstmal-keine-inhalte-fehlen"></a></h2>
<p>Würde man jetzt schon Hugo starten, würden vermutlich viele Inhalte in verschiedenen Beiträgen fehlen. Das liegt daran, dass das oben genannte Export-Tool viele HTML Tags nicht in Markdown konvertieren kann und dann an diesen Stellen den HTML-Quelltext in die exportierten md-Dateien schreibt. Doch Hugo filtert diesen HTML-Quelltext beim Rendern der Website heraus.</p>
<p>Damit ich nicht erst alle 2560 Blogbeiträge manuell überprüfen und korrigieren muss, bevor ich den neuen Blog öffentlich machen kann, habe ich mich entschieden, dieses Verhalten von Hugo umzustellen und Hugo anzuweisen, den HTML-Quelltext nicht herauszufiltern. Das ist zwar nicht im Sinne des Erfinders aber so habe ich die Möglichkeit, die Arbeit auf <em>irgendwann</em> später zu verschieben.</p>
<p>Details dazu findet man <a  class='urlextern'  href="https://gohugo.io/news/0.60.0-relnotes/">hier</a>. Suche nach <code>unsafe</code>.</p>
<p>In die config.toml fügt man dazu Folgendes ein:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">markup</span>]
</span></span><span style="display:flex;"><span>  [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>]
</span></span><span style="display:flex;"><span>    [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>.<span style="color:#a6e22e">renderer</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">unsafe</span> = <span style="color:#66d9ef">true</span></span></span></code></pre></div>

<h2 id="run-hugo-run" data-numberify>Run Hugo, Run<a class="anchor ms-1" href="#run-hugo-run"></a></h2>
<p>Jetzt kann man Hugo veranlassen, den neuen Blog das erste Mal zu rendern und dann lokal zur Verfügung zu stellen. Per Voreinstellung ist er unter localhost:1313 erreichbar.</p>
<p>Dazu wechselt man auf der Kommandozeile in das Verzeichnis des neuen Blogs und führt aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hugo server --renderToDisk -D -E -F -v</span></span></code></pre></div>
<p>Jetzt werden alle gerenderten Dateien und auch die aus dem <code>static</code>-Verzeichnis in das Verzeichnis <code>public</code> kopiert, welches Hugo automatisch erstellt, wenn es noch nicht existiert.</p>
<p>Sobald alles bereit ist, gibt es eine Meldung wie etwa:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>                   |  DE   
</span></span><span style="display:flex;"><span>-------------------+-------
</span></span><span style="display:flex;"><span>  Pages            | <span style="color:#ae81ff">4350</span>  
</span></span><span style="display:flex;"><span>  Paginator pages  | <span style="color:#ae81ff">1694</span>  
</span></span><span style="display:flex;"><span>  Non-page files   |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Static files     |   <span style="color:#ae81ff">88</span>  
</span></span><span style="display:flex;"><span>  Processed images |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>  Aliases          |  <span style="color:#ae81ff">889</span>  
</span></span><span style="display:flex;"><span>  Sitemaps         |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Cleaned          |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Built in <span style="color:#ae81ff">45228</span> ms
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> changes in /home/natenom-web-hugo/<span style="color:#f92672">{</span>assets,content,layouts,static,themes<span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> config changes in /home/natenom-web-hugo/config.toml, <span style="color:#f92672">[</span>…<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Environment: <span style="color:#e6db74">&#34;development&#34;</span>
</span></span><span style="display:flex;"><span>Serving pages from /home/natenom-web-hugo/public
</span></span><span style="display:flex;"><span>Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
</span></span><span style="display:flex;"><span>Web Server is available at http://localhost:1313/ <span style="color:#f92672">(</span>bind address 127.0.0.1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Press Ctrl+C to stop</span></span></code></pre></div>

<h2 id="erstmal-fertig" data-numberify>Erstmal fertig<a class="anchor ms-1" href="#erstmal-fertig"></a></h2>
<p>Das reicht dann auch wieder für diesen Beitrag. Man kann jetzt schon im eigenen Blog offline umgucken und wird hier und da noch unschöne Dinge finden, wie falsch dargestellte Bilder.</p>
<p>In <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2">Teil 2</a> geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/cover.png" length="162917" type="image/png"/></item><item><title>Datenbank von WordPress auch mal aufräumen</title><link>https://natenom.de/2021/05/datenbank-von-wordpress-auch-mal-aufraeumen/</link><pubDate>Mon, 31 May 2021 02:33:24 +0000</pubDate><guid>https://natenom.de/2021/05/datenbank-von-wordpress-auch-mal-aufraeumen/</guid><description>Manche Plugins für WordPress legen eigene Tabellen in der Datenbank an. Hat man, wie hier im Blog, verschiedenste Plugins genutzt, dann sammeln sich über die Jahre viele unnütze Tabellen an.
Diese kann man entweder manuell löschen oder mit einem WordPress-Plugin, wie z. B. diesem hier.
Von einst 134 Dateien im Verzeichnis von MySQL sind nach dem Cleanup noch 18 übrig geblieben.
https://wiki.natenom.de/docs/sammelsurium/wordpress/datenbank_aufraeumen</description><content:encoded><![CDATA[<p>Manche Plugins für WordPress legen eigene Tabellen in der Datenbank an. Hat man, wie hier im Blog, verschiedenste Plugins genutzt, dann sammeln sich über die Jahre viele unnütze Tabellen an.</p>
<p>Diese kann man entweder manuell löschen oder mit einem WordPress-Plugin, wie z. B. <a  class='urlextern'  href="https://de.wordpress.org/plugins/plugins-garbage-collector/">diesem hier</a>.</p>
<p>Von einst 134 Dateien im Verzeichnis von MySQL sind nach dem Cleanup noch 18 übrig geblieben.</p>
<p><a  href="https://wiki.natenom.de/docs/sammelsurium/wordpress/datenbank_aufraeumen">https://wiki.natenom.de/docs/sammelsurium/wordpress/datenbank_aufraeumen</a></p>
]]></content:encoded></item><item><title>DokuWiki (auch ohne Webserver) als Ablage für Informationen nutzen</title><link>https://natenom.de/2018/05/dokuwiki-auch-ohne-webserver-als-ablage-fuer-informationen-nutzen/</link><pubDate>Wed, 30 May 2018 15:05:08 +0000</pubDate><guid>https://natenom.de/2018/05/dokuwiki-auch-ohne-webserver-als-ablage-fuer-informationen-nutzen/</guid><description><![CDATA[<p>Ein Vorteil des dateibasierten <a  class='urlextern'  href="https://www.dokuwiki.org/dokuwiki">DokuWiki</a> gegenüber datenbankbasierten Wikis ist z. B., dass man es komplett offline ohne Webserver bearbeiten und auch eingeschränkt nutzen kann, vorausgesetzt man ist mit der recht einfachen Syntax vertraut.</p>
<p>Ich habe ein lokales Wiki, für das ich meist nur dann den lokalen Webserver anwerfe, wenn ich eine Seite z. B. als PDF exportieren möchte oder die Informationen etwas „schöner“ angezeigt bekommen möchte.</p>]]></description><content:encoded><![CDATA[<p>Ein Vorteil des dateibasierten <a  class='urlextern'  href="https://www.dokuwiki.org/dokuwiki">DokuWiki</a> gegenüber datenbankbasierten Wikis ist z. B., dass man es komplett offline ohne Webserver bearbeiten und auch eingeschränkt nutzen kann, vorausgesetzt man ist mit der recht einfachen Syntax vertraut.</p>
<p>Ich habe ein lokales Wiki, für das ich meist nur dann den lokalen Webserver anwerfe, wenn ich eine Seite z. B. als PDF exportieren möchte oder die Informationen etwas „schöner“ angezeigt bekommen möchte.</p>
<p>Für alles andere starte ich einfach nur einen Texteditor, der mir die Verzeichnisstruktur anzeigen kann, und mit dem ich Zugriff auf alle Wikiseiten habe.</p>
<p>Dazu gesellt sich noch ein Dateimanager, damit ich auch Dateien in den entsprechenden Unterverzeichnisse im Wiki ablegen kann. Mit dem richtigen Pfad kann man diese auch in Wikiseiten einbetten.</p>
<p>Somit habe ich einen gut struktierten Ort für Notizen, Bookmarks, Erlebnisse und sonstige Informationen.</p>
<p>Vor vielen Jahren habe ich dafür übrigens <a  href="/2011/01/basket-ist-zuruck/">basket</a> von KDE benutzt. Dieses gibt es mittlerweile nicht mehr bzw. es wird nicht mehr entwickelt.</p>]]></content:encoded></item><item><title>Nachträgliches Löschen unnötiger Daten wie IP-Adresse aus Kommentaren in WordPress</title><link>https://natenom.de/2018/04/nachtraegliches-loeschen-unnoetiger-daten-wie-ip-adresse-aus-kommentaren-in-wordpress/</link><pubDate>Fri, 13 Apr 2018 15:38:11 +0000</pubDate><guid>https://natenom.de/2018/04/nachtraegliches-loeschen-unnoetiger-daten-wie-ip-adresse-aus-kommentaren-in-wordpress/</guid><description>&lt;p>WordPress speichert beim Kommentieren neben den selbst eingegebenen Daten wie Name, E-Mail-Adresse, URL und natürlich dem Kommentar selbst auch noch automatisch die IP-Adresse des Kommentators, den User-Agent des Browsers und noch einige andere Dinge in der Datenbank.&lt;/p></description><content:encoded><![CDATA[<p>WordPress speichert beim Kommentieren neben den selbst eingegebenen Daten wie Name, E-Mail-Adresse, URL und natürlich dem Kommentar selbst auch noch automatisch die IP-Adresse des Kommentators, den User-Agent des Browsers und noch einige andere Dinge in der Datenbank.</p>
<p>Aus Datenschutzgründen möchte ich einige dieser Daten entweder gar nicht erst in der Datenbank haben oder nachträglich löschen.</p>
<p>Das sind alle Felder der Tabelle wp_comments:</p>
<pre class="wp-block-code"><code>comment_ID 
comment_post_ID 
comment_author 
comment_author_email 
comment_author_url 
comment_author_IP 
comment_date 
comment_date_gmt 
comment_content 
comment_karma 
comment_approved 
comment_agent 
comment_type 
comment_parent 
user_id 
comment_subscribe_optin 
comment_subscribe_optin_verified
comment_subscribe_optin_mailed</code></pre>
<p>Bei den letzten dreien bin ich nicht sicher, ob sie in einer Standard-Installation von WordPress enthalten sind oder von einem installierten Plugin stammen.</p>
<p>Damit die IP gar nicht erst in der Datenbank landet, könnte man sich noch ein WordPress-Plugin installieren. Oder aber man löscht die Daten nach einem Zeitraum X direkt über SQL aus der Datenbank.</p>
<p>Ich habe mich für Letzeres entschieden. In meinem Wiki gibt es dazu eine Beschreibung, <a  href="https://wiki.natenom.de/docs/sammelsurium/wordpress/bestimmte_daten_von_kommentaren_nachtraeglich_loeschen">siehe hier</a>.</p>]]></content:encoded></item><item><title>Liste der Pads bei Etherpad-lite</title><link>https://natenom.de/2012/06/liste-der-pads-bei-etherpad-lite/</link><pubDate>Thu, 07 Jun 2012 10:24:50 +0000</pubDate><guid>https://natenom.de/2012/06/liste-der-pads-bei-etherpad-lite/</guid><description>Die bisherige Methode (mit pyetherpad) zur Auflistung aller Pads funktionert seit einiger Zeit nicht mehr; wenn man allerdings als Datenbank MySQL oder SQLite verwendet, statt der voreingestellten Test-Datenbank, dann kann man sehr einfach eine Liste aller Pads erstellen.
Die Beschreibung findet sich im Wiki von Etherpad-lite.</description><content:encoded><![CDATA[<p>Die <a title="Etherpad-Lite – Pads löschen" href="/2011/09/etherpad-lite-pads-loschen/" target="_self">bisherige Methode (mit pyetherpad)</a> zur Auflistung aller Pads funktionert seit einiger Zeit nicht mehr; wenn man allerdings als Datenbank MySQL oder SQLite verwendet, statt der voreingestellten Test-Datenbank, dann kann man sehr einfach eine Liste aller Pads erstellen.</p>
<p>Die Beschreibung findet sich im <a  class='urlextern'  href="https://github.com/ether/etherpad-lite/wiki/How-to-list-all-pads"title="https://github.com/ether/etherpad-lite/wiki/How-to-list-all-pads">Wiki von Etherpad-lite</a>.</p>
]]></content:encoded></item></channel></rss>