Bulk Delete post_meta in allen Inhaltstypen

skeleton key surround with dry leaves
foto von michael dziedzic

Die meisten Themes die man in WordPress ausprobiert, hinterlassen Spuren. Vor allem Premium-Themes mit ihrer Vielzahl an Einstellungen, die sich nicht nur auf das globale Erscheinungsbild beschränken, sondern pro Seite / Beitrag und sonstigen Inhaltstypen vorgesehen sind, hinterlassen mithin Tausende von Einträgen in der Post-Meta-Tabelle in so genannten Custom Fields.

Das Plugin Advanced Custom Fields hinterlässt pro Feld (unabhängig davon ob Haupt- oder Subfeld) gleich zwei Einträge.

Aus welchen sonstigen Gründen auch immer Post-Meta-Daten aus dem System entfernt werden sollen, wie das geht, wird hier gezeigt. Voraussetzung ist, dass die Schlüssel (Feldnamen) bekannt sind.

Für die Massenbearbeitung von Inhalten gibt es natürlich auch das eine oder andere Plugin. Geht es um das Löschen von benutzerdefinierten Feldern, darf mit Kosten gerechnet werden.

WordPress selbst bietet (natürlich) auch eine Funktion an, um Post-Meta-Daten zu löschen. So muss nicht zwingend ein Plugin dafür gesucht und installiert werden, dessen Funktionalität es vielleicht nur ein einziges Mal braucht.

Die Funktion delete_metadata wird mit 5 Parametern aufgerufen:

'post' bedeutet, der Vorgang bezieht sich auf post-Objekte, es könnte auch 'term' oder 'user' sein (alles, was eine objekttypmeta-Tabelle hat).

Der zweite Parameter, hier '0', bezieht sich auf die ID (es könnten hier also auch nur die MetaDaten bestimmter Posts nach deren ID gelöscht werden).

Der dritte Parameter (im Beispiel $field) bezieht sich auf den Meta_key.

Nummer vier, der Meta_value, muss, um wirklich alle Felder zu löschen, ein leere String ('') sein, oder false.

Der fünfte und letzte Parameter muss true sein, damit alle Felder mit den angegebenen Schlüsseln gelöscht werden.

function delete_useless_postmeta() {
	$fields = array( 
		'useless_data_key_1',
		'useless_data_key_2' ....
	);
	foreach( $fields as $field ) {
		delete_metadata( 'post', 0, $field, false, true );
	}
}

Um den Vorgang zu initialisieren, kann er über eine Einstelllung aktiviert werden, oder einen Hook. Nach dem Durchlauf könnte eine Option hinzugefügt werden, um ein Flag zu setzen, sodass der Vorgang nur einmal durchgeführt wird.

function delete_useless_postmeta() {
	if ( 'done' == get_option('prefix_useless_deleted') ) return;
	$fields = array( 
		'useless_data_key_1',
		'useless_data_key_2' ....
	);
	foreach( $fields as $field ) {
		delete_metadata( 'post', 0, $field, false, true );
	}
	add_option('prefix_useless_deleted', 'done');
}
add_action( 'init', 'delete_useless_postmeta' );

Die Voraussetzung dafür, eine Funktion wie diese zu verwenden ist zu wissen, was man tut, warum man es tut und mit welchen Konsequenzen, und vor allem, vorher ein Datenbankbackup gemacht zu haben! Sind die Daten erst gelöscht, gibt es kein Zurück mehr.

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable