WordPress Datenbanktabellen optimieren

Heute an dieser Stelle ein PHP-Snippet für die functions.php eures WordPress Child-Themes. Die Datenbank fragmentiert durch zum Beispiel das Löschen von Artikeln oder auch Spam. Das erhöht mit der Zeit die Ladezeit. Deshalb optimiere ich von Zeit zu Zeit die DB. Bisher immer manuell mit Hilfe von phpMyAdmin. Seit einiger Zeit mit einer PHP-Funktion.

Nachfolgender Code zeigt diese Funktion. Sie stammt ursprünglich von Sergej Müller. Sergej Müller war verantwortlich für WordPress Plugins wie AntiSpam Bee oder auch Statify. Sergej Müller hat sich aus der WordPress Community zurückgezogen. Die meisten Plugins werden vom Pluginkollektiv weiter gepflegt.

Doch das Kollektiv hat nicht alle Plugins übernommen. Müllers gute, alte Toolbox zum Beispiel nicht. Mit Hilfe dieser Toolbox konnte man auch solche Snippets in WordPress zum Laufen bringen. Diese Toolbox kannte „Module“. Und eben solch ein „Modul“ ist nachfolgendes Snippet.

Das Snippet habe ich in Teilen abgeändert. Die Funktion optimize_db_tables() ist noch original. Der Cronjob wurde von mir angepasst. Er erzeugt ein Transient in der DB Tabelle wp_options mit der Bezeichnung optimized_db_timer. Darin ist das aktuelle Datum und Uhrzeit gespeichert. Das ist aber unwichtig. Wichtig ist nur die Ablaufzeit dieses Transienten. Wurde er von WordPress gelöscht wird er neu erzeugt und die DB optimiert. Die Laufzeit dieses Transienten beträgt 60*60*24 Sekunden, also einen Tag. Das lässt sich aber ändern.

<?php
/**
 * Optimierung der Datenbanktabellen
 * ---------------------------------
 * Tägliche Anwendung des MySQL-Befehls OPTIMIZE TABLE auf Tabellen. 
 * Author: Sergej Müller
 * 
 * https://github.com/twitnic/Toolbox/blob/master/modules/optimize_db.php 
 * http://www.gnu.org/licenses/gpl-2.0.html
 */

function optimize_db_tables() {
  global $wpdb;
  
  $tables = $wpdb->tables();
  foreach ( $tables as $table ) {
    $wpdb->query( "OPTIMIZE TABLE `$table`" );
  }
}

/* Cronjob angepasst von Horst Scheuer im September 2020 */
if ( is_admin() ) {
  if ( ! get_transient( 'optimized_db_timer' ) ) {
    set_transient( 'optimized_db_timer', wp_date("d.m.y H:i"), 60 * 60 * 24 );
    add_action( 'admin_init', 'optimize_db_tables' );
  }
}

Bitte beachtet: Bei mir funktioniert das Snippet problemlos. Man sollte aber beachten, dass diese Funktion an der WordPress-DB rumwerkelt. Sollte diese Funktion Mist bauen sind eure Daten futsch. Also: Ihr nutzt die Zeilen auf eigene Gefahr.