Zabawa w grafy
Graf nieskierowany to takie zwierzę, które ma węzły i krawędzie (ale bez szczałków):
![]()
Jeżeli zamiast a, b, c i d wrzucimy wpisy na blogu, a połączenia między nimi wyciągniemy z wtyczki YARPP, wówczas - przy odrobinie wysiłku - uzyskamy takie cóś:

Powyższy graf reprezentuje wszystkie wpisy na moim blogu na dzień 27 marca 2021.
Lekki zoom:

Nieco większy zoom:

Jak takiego cudaka uzyskać?
Mi się udało metodą prób i błędów, łącznie jakieś półtora godziny kombinowania.
Krok po kroku:
- Logujemy się na nasz serwer z blogiem przez ssh.
- Upewniamy się, że mamy zainstalowany pakiet
graphviz(czyli:sudo apt -y install graphviz) - Tworzymy plik
~/.my.cnfi wpisujemy do niego:
[mysql]
user = nazwa-uzytkownika-wordpress
password = haslo-uzytkownika-wordpress
(użytkownika i hasło możemy sobie wyciągnąć z pliku wp-config.php w folderze instalacyjnym wordpressa)
- nadajemy plikowi
~/.my.cnfodpowiednie uprawnienia:chmod 600 ~/.my.cnf
Powyższy trick umożliwi nam wykonywanie zapytań do bazy wordpressa bez konieczności podawania za każdym razem hasła.
- Tworzymy osobny folder, u mnie nazywa się on
refale można go sobie nazwać dowolnie. Chodzi o to, żeby nie zaśmiecać sobie katalogu domowego. Wchodzimy do niego:cd ref - Tworzymy cztery pliki:
dotheader.txt,dotfooter.txt,labels.sqlorazreferences.sql.
dotheader.txt:
graph {
rankdir=LR;
node [nodesep=2.0; fontsize=11; shape=box];
graph [overlap=false; splines = true;];
dotfooter.txt:
}
(tak, zgadza się, jedna linia tekstu, z jednym znakiem: "}")
labels.sql:
select concat(y.reference_ID, ' [label="', replace(regexp_replace(p1.post_title, '[^0-9a-zA-ZżźćńąąśłęóŻŹĆŃĄŚŁĘÓ ]', ' '), ' ', ' '), '"]') ptptpt
from wp_yarpp_related_cache y
join wp_posts p1 on y.reference_id = p1.ID
where p1.post_type = 'post'
union
select concat(y.ID, ' [label="', replace(regexp_replace(p2.post_title, '[^0-9a-zA-ZżźćńąąśłęóŻŹĆŃĄŚŁĘÓ ]', ' '), ' ', ' '), '"]')
from wp_yarpp_related_cache y
join wp_posts p2 on y.ID=p2.ID
where p2.post_type = 'post';
references.sql:
select concat(y.reference_ID, ' -- ', y.ID)
from wp_yarpp_related_cache y
join wp_posts p1 on y.reference_id = p1.ID
join wp_posts p2 on y.ID=p2.ID
where p1.post_type='post' and p2.post_type='post';
- Mówiłem cztery pliki? Kłamałem! 🙂 Tworzymy teraz piąty plik, ja go sobie nazwałem
go.sh:
!/bin/bash
mysql -N -u nazwa-uzytkownika-wordpress -D nazwa-bazy-wordpress < ./labels.sql > labels.txt
mysql -N -u nazwa-uzytkownika-wordpress -D nazwa-bazy-wordpress < ./references.sql > references.txt
cat ./dotheader.txt ./labels.txt ./references.txt ./dotfooter.txt > out.dot
sfdp ./out.dot -Tsvg > out.svg
Uwaga: w powyższym pliku upewniamy się, że wpisaliśmy poprawnie nazwę użytkownika oraz nazwę bazy danych wordpress (jedno i drugie możemy wyciągnąć z wp-config.php w katalogu instalacyjnym wordpressa)
- Nadajemy temu plikowi atrybut wykonywalności:
chmod +x ./go.sh - Uruchamiamy go:
./go.sh(enter)
Jeżeli wszystkie powyższe kroki wykonaliśmy bez błędów, powinniśmy dostać na wyjściu plik out.svg z "mapką" naszego blogu.
Na razie mi się temat trochę przejadł, więc ewentualny ciąg dalszy odkładam na później. Kolejnym krokiem będzie zapewne zrobienie tej mapki w wersji klikalnej, ewentualnie osobne mapki dla poszczególnych kategorii, może jeszcze dodanie "ozdobników" w postaci tagów?
Ale to już innym razem.
Komentarze