Archiv der Kategorie: MySQL

Alle Preise in Woocommerce ändern – auf die smarte Art

Wer schon einmal nach dem Schlüsselwort price in einem Datenbankdump von Woocommerce und WordPress gesucht hat, weil er seine Artikelpreise gerne auf einen Schlag ändern möchte, der wird einfach nur verzweifeln.

Es gibt allein in wp_post_meta 12 Möglichkeiten, Preise einzugeben. Und das ist noch nicht einmal alles.

Annahme: Wir wollen unsere Preise einer Inflation von 2 Prozent anpassen. Wie geht man vor?

Tabelle wp_postmeta

UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_regular_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_sale_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_regular_price_tmp' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_sale_price_tmp' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_price_tmp' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_min_variation_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_max_variation_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_min_variation_regular_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_max_variation_regular_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_min_variation_sale_price' AND meta_value != ''
UPDATE wp_postmeta SET meta_value = meta_value*1.02 WHERE meta_key = '_max_variation_sale_price' AND meta_value != ''

Tabelle wp_options

DELETE FROM wp_options WHERE (option_name LIKE '_transient_wc_var_prices_%' OR option_name LIKE '_transient_timeout_wc_var_prices_%')

Die letzte Zeile ist besonders wichtig, da Woocommerce  einen Transient-Cache nutzt, um Seiten schneller darstellen zu können. Indem man diesen Speicher auf einen Schlag löscht, wird er automatisch beim nächsten Aufruf eines Produktes neu generiert.

Minibian – Raspberry PI – Installieren

Ziel: ein minimales Linux für einen kompletten (Web)server auf Basis eines Raspberry Pi

Quelle: https://minibianpi.wordpress.com/features/

Software: Win32DiskImagerPuTTY

Hardware: Raspberry Pi 2B (oder 3), SD Mikro Karte 32 GB (oder größer)

Netzwerk: (W)LAN-Router mit LAN-Anschluss

Image auf SD-Karte installieren

  • Download https://sourceforge.net/projects/minibian/
  • Das Image (Endung: img) entzippen und mit Win32DiskImager auf SD-Karte schreiben. Vorsicht, nicht aus Versehen einen falschen Laufwerksbuchstaben wählen.
  • SD-Karte auswerfen, in Raspberry Pi packen
  • Pi per LAN mit Router verbinden
  • Pi mit Strom versorgen und einige Minuten warten, bis der Name im Netzwerk bekannt ist

Mit Maschine verbinden

  • PuTTY starten und mit “minibian” verbinden.
    • Login: root
    • Passwort: raspberry
passwd # Passwort ändern

Festplatte voll ausreizen

fdisk /dev/mmcblk0 # dann folgende Kommandos
  • p – Partitionen zeigen (i. d. R. zwei) – Startwert der zweiten, der Hauptpartition notieren (hier 125056)
  • d – zweite Partition löschen
  • n – neue Partition anlegen, Partition type: Primary, Partition number: 2, Startwert: 125056 (der notierte, NICHT der default Wert), Endwert: Default für volle Größe
  • p – überprüfen der Eingaben
  • w – schreiben der Partitionen (Fehlermeldung ignorieren)
reboot
resize2fs /dev/mmcblk0p2
df -h # sollte jetzt (nahezu) die volle Größe unter /dev/root/ belegt haben

Vorbereitungen

apt-get install sudo
adduser BENUTZER # besser nicht mit root arbeiten
usermod -aG sudo BENUTZER # packen wir ihn zur sudo-Gruppe
su - BENUTZER # das Minus-Zeichen, damit auch wirklich ein kompletter Wechsel stattfindet
sudo apt-get install nano # bloß kein vi

Bash-Tuning

sudo nano ~/.bashrc # folgendes ans Ende eintragen:

alias +=’pushd .’
alias ..=’cd ..’
alias …=’cd ../..’
alias beep=’echo -en “\007″‘
alias dir=’ls -l’
alias gzcat=’gunzip -c’
alias l=’ls -alF’
alias la=’ls -la’
alias ll=’ls -la’
alias ls=’/bin/ls $LS_OPTIONS’
alias ls-l=’ls -l’
alias md=’mkdir -p’
alias o=’less’
alias rd=’rmdir’
alias rehash=’hash -r’
alias rm=’rm -i’
alias unzip=’tar xfvz’
alias which=’type -p’
alias zip=’tar cfvz’

logout # wieder ausloggen und einloggen, damit das Bash-Tuning anschlägt
su - BENUTZER

Betriebssystem und Komponenten auf den neuesten Stand bringen

sudo apt-get -y update
sudo apt-get -y dist-upgrade # kann dauern
sudo apt-get -y autoremove
sudo apt-get -y autoclean
sudo apt-get install cpufrequtils
cpufreq-info # zeigt Informationen zur CPU an

Firmware updaten

sudo apt-get install rpi-update # nur für Raspberry
sudo rpi-update # nur für Raspberry, neue Firmware
sudo reboot #  neustart, kann etwas länger dauern, bis Rechner wieder gefunden wird

Benchmarks

Diese Befehle benötigt man natürlich nur, wenn man die aktuelle Rechenleistung mit anderen Systemen vergleichen möchte.

sudo apt-get install sysbench
sysbench --test=cpu --num-threads=4 run # CPU Test
sysbench --test=memory --memory-block-size=500MB --memory-total-size=10GB run # Speichertest
sysbench --test=fileio --file-total-size=20G prepare # Lese/Schreibtest benötigt ein File
sysbench --test=fileio --file-total-size=4G prepare #  viermal soviel wie RAM, kann dauern
sysbench --test=fileio --file-total-size=4G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run # Kb/sec-Wert wichtig
sysbench --test=fileio --file-total-size=4G cleanup # und wieder entfernen

Sicherheitsupdates automatisieren

sudo apt-get -y update && sudo apt-get -y install cron-apt # kann dauern
sudo nano /etc/cron-apt/action.d/5-secupdates # neue Datei mit Inhalt:

upgrade -y -o APT::Get::Show-Upgraded=true

dann

sudo mkdir /etc/apt/sources.d
sudo nano /etc/apt/sources.d/security.sources.list # neue Datei mit Inhalt:

deb https://security.debian.org/ wheezy/updates main contrib non-free
deb-src https://security.debian.org/ wheezy/updates main contrib non-free

und

sudo nano /etc/cron-apt/config.d/5-secupdates # neue datei mit Inhalt:

OPTIONS=”-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/sources.d/security.sources.list -o Dir::Etc::SourceParts=\”/dev/null\””

abschließend

sudo nano /etc/cron.d/cron-apt # zeiten anpassen, wenn gewünscht
sudo cron-apt -s # test, kann dauern
sudo cat /var/log/cron-apt/log # prüfen

LAMP

sudo groupadd www-data # eventuell schon vorhanden
sudo usermod -a -G www-data www-data
sudo apt-get install apache2 -y
sudo apt-get install php5 -y
sudo apt-get install mysql-server -y # passwörter für MySQL müssen erstellt werden
sudo a2enmod rewrite # mod_rewrite fuer URL-Manipulation
sudo service apache2 restart
sudo apt-get install php5-mysql phpmyadmin -y # dauert, verlangt MySQL-Passwort (s.o.), für apache2 und lighttpd einrichten

Webmin

sudo apt-get update
cd ~
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.831_all.deb
sudo apt-get -y install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python
sudo dpkg --install webmin_1.831_all.deb # dauert lang
rm webmin*l.deb -f
sudo reboot

Test im Browser:

http://minibian/

http://minibian/phpmyadmin (Benutzer: root, Passwort: siehe oben)

https://minibian:10000/

Copy MySQL tables across different servers with PHP

How to copy table1 from host1 to host2:

<?php
set_time_limit(0);
ini_set('memory_limit', '-1');
$execstring="mysqldump -h host1 -u user1 -ppassword1 databasename TblName | mysql -h host2 -u user2 -ppassword2 anotherDatabase";
$output="";
exec($execstring, $output);
?>

 

Aware: all the values after pipe (|) must not contain special characters (e.g. !) as they are interpreted by the bash. So escape them.

Backup source and target before testing.

Smarte Suche für MySQL und WordPress mit mehreren Suchwörtern

Die eingebaute Suche von WordPress ist alles andere als gut, versagt sie doch schon bei mehr als einem Suchwort.

Bevor man aber gleich wieder Plugins installiert, kann man die Sache auch händisch programmieren.

Dazu muss zunächst in MySQL ein Volltext-Suchindex für die relevanten Datenspalten erzeugt werden:

ALTER TABLE `wp_posts` ADD FULLTEXT `MyFullTextIndex` (`post_title`, `post_content`)

Wie man sehen kann, bevorzuge ich die Suche in den Titeln und dem gesamten Textkörper. Wem das aber zu viel des Guten ist, kann es auch auf die Textzusammenfassung begrenzen:

ALTER TABLE `wp_posts` ADD FULLTEXT `MyFullTextIndex` (`post_excerpt`)

Nun kann man ganz einfach gewichtet suchen:

SELECT ID, post_title, MATCH (post_title, post_content) AGAINST ('Suchwort1 Suchwort2 Suchwort3') AS score

FROM wp_posts

WHERE MATCH (post_title, post_content) AGAINST ('Suchwort1 Suchwort2 Suchwort3')

AND post_status = 'publish'

Bingo!