Achtung: die in den nächsten Zeilen beschriebene Methode ist nicht dokumentiert und somit SEHR gefährlich. Nur Experten von Linux Shell Scripten und Datenbank SQL Befehlen sollten es wagen! Auf jedenfall sollte ein gültiger Datenbank Export vorhanden sein! (siehe – ah – sorry, habe ich noch nicht beschrieben)
Ich hatte die Aufgabe, 102 Seiten herzustellen, die sich nur in kleinen (aber natürlich wichtigen) Teilen unterschieden. Ich hatte mir zwar den Plugin „Duplicate Page“ von mndpsingh287 runtergeladen, aber damit wird nur eine vorhandene Seite dupliziert, die man dann händisch anpassen kann. Für 102 Seiten war mir das zu aufwändig!
Also, zuerst mal Grundlangenforschung: wie speichert WordPress eine Seite. Nein – nicht im Dateisystem! Dafür ist die Datenbank zuständig, und zwar in der Tabelle wp_posts! Ansehen kann man sich die Tabelle mit dem bei 1blu angebotenen MySql Manager: https://webhosting<?>.1blu.de/1blu-dbManager/index.php.
Also: lege deine Quellseite neu an, vielleicht mit Hilfe von „Duplicate Page“, denn: Es soll eine Primärseite werden, d.h. es sollten noch keine Änderungen gemacht worden sein. WordPress führt nämlich Buch über Änderungen an einer Seite – jedes Aktuallisieren führt zu einem neuen Record.
Dann gehe auf die Datenbank, und siehe dir den Rekord mit dem höchsten ID an. Schaue dir die einzelnen Spalten an (falls dein Prefix nicht wp ist, anpassen!):
mysql -u user --password='passwprd' dbname
mysql> select max(id) from wp_posts;
+---------+
| max(id) |
+---------+
| 820 |
+---------+
1 row in set (0.00 sec)
mysql> select * from wp_posts where id in (820);
| ID | post_author | post_date | post_date_gmt | post_content | post_title | post_excerpt | post_status | comment_status | ping_status | post_password | post_name | to_ping | pinged | post_modified | post_modified_gmt | post_content_filtered | post_parent | guid | menu_order | post_type | post_mime_type | comment_count |
| 820 | 1 | 2021-03-01 21:29:18 | 2021-03-01 20:29:18 | <!-- wp:file < dein HTML Text > --> | Dein neuer Titel im Klartext | | publish | closed | closed | | Dein neuer Titel im WordPress Format | | | 2021-03-01 21:29:18 | 2021-03-01 20:29:18 | | 61 | https://www.domain.de/?page_id=820 | 0 | page | | 0 |
1 row in set (0.00 sec)
Sollte da nicht im Feld post_status „publish“ stehen, ist das keine Startseite, sondern schon eine Änderung. Wie sieht es mit einer ID um 1 weniger aus? Sind die Verluste dadurch verkraftbar?
Mache dir jetzt unter Linux (z.B. auf deinem Webserver) eine Liste mit den Objekten, die variable sind. Beispiel:
# Kommentar Zeilen kann man so markieren
200305 Heft1.pdf Dies ist das Januar Heft mit Rückblick auf ...
200306 Heft2.pdf Hier fällt mir nichts ein
200307 Heft3.pdf Die Liste kann ganz lang sein
Nun baue ein Script, was diese Liste liest, und die gewünschen Änderungen in dem Export Rekord vornimmt. Die Spalte ID musst du natürlich für jeden Record hochzählen, beginnt mit dem vorhandenen ID + 1.
#!/bin/sh
export myid=621 # mit dieser ID startet das Script
while read myline # in myline steht anschliessend die gesamte Zeile
do
mysd=$(echo $myline |cut -d' ' -f 1) # schneide deine Teile heraus
myrn=$(echo $myline |cut -d' ' -f 2)
myrm=$(echo $myrn | tr [A-Z] [a-z] |sed -e 's/://g'|sed -e 's/\.pdf$//'|sed -e 's/\.//g') # WP baut es so um
mydn=$(echo $myline |cut -d' ' -f 3-) # hier ist Freitext mit Blank
myxn=$(echo $mydn|sed -e s/.pdf//|tr -s ' ' '-'|tr '-' ' '|sed -e s/ae/ä/g ) # Entfernen von Verzierungen etc
#echo '------Kontrolausgaben für die Debug Phase--------'
#echo $myline
#echo "$myid - $mysd - $myrn - $mydn - $myxn"
if [ $mysd != "#" ]; then # überspringe Kommentarzeilen
cat <<THEEND
Hier wird dann das SQL Statement eingebaut - siehe nächsten Block
THEEND
echo
myid=$(expr $myid + 1 ) # Hochzählen
echo "# ------------- next item $myid ---------------------"
fi
done < $HOME/Liste.txt
Nun zum SQL Statement, dass noch oben eingefügt werde muss. Hole dir den Inhalt mit:
select post_content from wp_posts where id=820;
Dann baue das Ergebnis in so ein Statement ein:
INSERT INTO wp_posts
(id,post_author, post_date, post_date_gmt, post_content, post_title,
post_excerpt, post_status, comment_status, ping_status, post_password,
post_name, to_ping, pinged, post_modified, post_modified_gmt,
post_content_filtered, post_parent, guid, menu_order, post_type,
post_mime_type, comment_count)
select
$myid,post_author, sysdate(), UTC_TIMESTAMP(),
' <!-- wp:file {"id":637,"href":"https://www.domain.de/wp-content/uploads/2021/02/$myrn"} -->
<div class="wp-block-file"><a href="https://www.domain.de/wp-content/uploads/2021/02/$myrn" class="wp-block-file__button" download>Herunterladen</a></div>
<!-- /wp:file -->
<!-- wp:pdfemb/pdf-embedder-viewer {"pdfID":637,"url":"https://www.domain.de/wp-content/uploads/2021/02/$myrn"} -->
<p class="wp-block-pdfemb-pdf-embedder-viewer"></p>
<!-- /wp:pdfemb/pdf-embedder-viewer -->
<!-- wp:paragraph -->
<p><a href="https://www.domain.de/sourcepage/" data-type="page" data-id="61">Zurück zur Auswahlseite</a></p>
<!-- /wp:paragraph -->',
'$myxn',
post_excerpt, post_status, comment_status, ping_status, post_password,
'$myrm', to_ping, pinged, sysdate(), utc_timestamp(),
post_content_filtered, post_parent, 'https://www.domain.de/?page_id=$myid',
menu_order, post_type, post_mime_type, comment_count
from wp_posts
where id=836;
Die obigen festen Zahlen stammen natürlich aus meinem Projekt!
- 836 – die Quellseite
- 61 – die Seite, auf die man zurückspringen kann
- 637 – eigentlich die ID von PDF File in der Tabelle wp_posts, die auf das Objekt in der Medien Liste zeigt. Hat aber irgendwie keine Bedeutung, ich habe sie nicht geändert, obwohl sie ausser für das erste Objekt nicht stimmten.
Das resultierende SQL Script ausführen! Eventuell die Echos herausnehmen!
sh myscript.sh > myresult.sql
mysql -u user --password='passwprd' dbname < myresult.sql
Nun können die neuen Seiten in der Seitenauflistung gesehen werden. Ich hatte bewusst nicht die Aufgabe, dazu Menü Einträge im großen Hauptmenu zu machen!
Aber ich hatte die Aufgabe, Links in einer Steuerdatei einzufügen, so dass man die Seiten auf diese Art und Weise aufrufen kann.
Problem 1: Ich wollte auch mittels Datenbankoperationen zu diesen Seiten Link auf eine Steuerseite machen, aber das ging leider nicht. Keine Ahnung, warum! Aber es geht auch mit Cut&Paste
Problem 2: Die generierte Seite ließ sich in WP – Seite ansehen, aber wenn man dann den Link auf die Steuerseite eingebaut hatte, funktioniert er nicht! Ursache: der Eintrag der neuen Seite für post_name war nicht korrekt. WordPress mauschelt diesen irgendwie aus dem Titel heraus. Ich habe das mit der Definition von $myrm im obigen Script versucht, nachzuvollziehen. Hat bei mir dann geklappt.
Ok, wie habe ich mir die Sache vereinfacht, wieder mit einem Script:
#!/bin/sh
export myid=846
while read myline
do
mysd=$(echo $myline |cut -d' ' -f 1)
myrn=$(echo $myline |cut -d' ' -f 2)
myrm=$(echo $myrn | tr -s [A-Z] [a-z] |sed -e 's/://g'|sed -e 's/\.//g'|sed -e 's/.pdf$//')
myrm=$(echo $myrn | tr [A-Z] [a-z] |sed -e 's/://g'|sed -e 's/\.pdf$//'|sed -e 's/\.//g')
mydn=$(echo $myline |cut -d' ' -f 3-)
myxn=$(echo $mydn|sed -e s/.pdf//|tr -s '-' ' '|sed -e s/ae/ä/g |sed -e s/oe/ö/g|sed -e 's/JS/Dr. Josef Sauer:/')
#echo '--------------'
#echo $myline
if [ "$mysd" != '#' ]; then # überspringe Kommentarzeilen
#echo "$myid - $mysd -rn: $myrn - rm: $myrm - xn: $myxn"
cat <<THEEND
<a href="https://www.domain.de/steuerseite/$myrm" data-type="page" data-id="839">$myxn</a><br><br>
THEEND
echo
myid=$(expr $myid + 1 )
#echo "# ------------- next item $myid ---------------------"
fi
done < $HOME/scripts/Liste2.txt
exit
Klar, das Script macht zuviel, aber ich bin halt faul und habe nur das erste Script kopiert.
Nun öffne in WP die Steuerseite, und lege einen neuen Absatzblock an, tippe einen Buchstaben, z.b. „a“. Gehe in die HTML Ansicht. Nun ersetzt „a“ mittels cut&paste „a“ durch die Ausgabe des obigen Scripts.
Aktualiesieren – und nun kannst du testen, ob die neuen Links funktionieren!