Zum Inhalt springen
🛠 So fügt man vielen Beiträgen in WordPress ein benutzerdefiniertes Feld hinzu

🛠 So fügt man vielen Beiträgen in WordPress ein benutzerdefiniertes Feld hinzu

Eine Website auf WordPress ist auf Hunderte von Beiträgen angewachsen, und jeder benötigt ein neues benutzerdefiniertes Feld. Jeden Beitrag einzeln zu öffnen und auf „Aktualisieren" zu klicken, ist eine Aufgabe für mindestens einen halben Tag.

Besonders dann, wenn Sie ein Theme verfeinern oder ein SEO-Plugin anbinden, das denselben meta_key im gesamten Beitragsbestand benötigt. Das WordPress-Admin-Panel bietet keine Schaltfläche „Auf alle anwenden", aber es stellt Ihnen zwei Wege zur Verfügung, dies mit Code zu lösen.

Nachfolgend beide Methoden mit einsatzbereiten Snippets: schnell (eine SQL-Abfrage für den gesamten Stapel) und einfach (eine Schleife über IDs unter Verwendung der nativen Funktion add_post_meta). Wählen Sie je nach Aufgabe.

Zwei Monitore zeigen verschiedene Code-Blöcke und Entwicklungsdateien auf dem Arbeitsplatz eines Entwicklers

💡 Kurzüberblick:

  • Sie können allen Beiträgen dasselbe benutzerdefinierte Feld mit add_post_meta in einer Schleife zuweisen, 4 Codezeilen.
  • Wenn es Hunderte von Beiträgen sind und Geschwindigkeit zählt, ein direktes INSERT in die Tabelle wp_postmeta über eine eigene Funktion.
  • Beide Methoden funktionieren über die functions.php des Themes oder das Plugin Code Snippets. Sichern Sie die Datenbank, bevor Sie SQL ausführen.

Warum ein Feld vielen Beiträgen auf einmal hinzufügen

Benutzerdefinierte Felder (auch Post-Meta genannt) speichern zusätzliche Informationen zu einem Eintrag: Aufrufzähler, Schlagworte für die interne Filterung, ein „Favorit"-Flag, eine verknüpfte Produkt-ID. Alles, was nicht in die Standardfelder post_title und post_content passt.

Üblicherweise wird ein Feld fallweise hinzugefügt: Beitrag öffnen, den Block „Benutzerdefinierte Felder" im Editor suchen, ein Schlüssel-Wert-Paar eintragen. Wenn das Feld aber auf einmal in allen 200 Beiträgen erscheinen muss, scheidet die manuelle Methode aus.

Typische Szenarien, in denen eine Massenaktion nötig ist:

  • Sie haben ein Child-Theme aktiviert, das get_post_meta($post_id, 'featured_post', true) nutzt, um beliebte Beiträge zu markieren. Ohne Massenbefüllung erscheinen alte Beiträge nicht in der Ausgabe.
  • Ein SEO-Audit erforderte das Setzen von noindex für einen bestimmten Inhaltstyp über ein Meta-Feld, statt über robots.txt.
  • Migration von einer anderen Plattform: Daten aus dem alten CMS liegen als CSV vor und müssen für Tausende von Datensätzen in wp_postmeta geladen werden.

WordPress hat keine native Funktion add_multiple_posts_meta. Es gibt aber zwei bewährte Wege, wählen Sie je nach Situation.

Methode 1. Eine SQL-Abfrage für alle Beiträge

Die schnellste Methode, ein direktes INSERT in die Tabelle wp_postmeta in einer einzigen Transaktion. Statt 200 einzelner Datenbankabfragen machen Sie eine, und sie läuft in Millisekunden.

Nachfolgend die Funktion add_multiple_posts_meta, die ein Array von Beitrags-IDs entgegennimmt und die Signatur des nativen add_post_meta nachbildet: gleiche Parameter, gleiche Reihenfolge.

Fügen Sie den Code in die functions.php des Child-Themes ein oder über das Plugin Code Snippets. Die Funktion selbst prüft, ob ein solches Feld für den Beitrag bereits existiert (wenn $unique = true übergeben wird) und filtert ungültige IDs heraus.

1if( !function_exists( 'add_multiple_posts_meta' ) ){
2 function add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique = false ){
3
4 // If key or ID is not set — exit
5 if( !$meta_key || empty( $post_ids ) ){
6 return false;
7 }
8
9 // One post — pass to native add_post_meta
10 if( is_numeric( $post_ids ) || ( is_array( $post_ids ) && count( $post_ids ) === 1 ) ){
11 return add_post_meta(
12 is_array( $post_ids ) ? $post_ids[0] : $post_ids,
13 $meta_key,
14 $meta_value,
15 $unique
16 );
17 }
18
19 global $wpdb;
20
21 // Filter out invalid IDs and duplicates
22 $valid_post_ids = array_unique(
23 array_filter( $post_ids, function( $post_id ) use ( $wpdb, $meta_key, $unique ){
24 return $post_id
25 && is_numeric( $post_id )
26 && get_post_status( $post_id )
27 && (
28 ! $unique
29 || ! $wpdb->get_var( $wpdb->prepare(
30 "SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s",
31 $post_id,
32 $meta_key
33 ) )
34 );
35 } )
36 );
37
38 if( ! count( $valid_post_ids ) ){
39 return false;
40 }
41
42 // Sanitization
43 $meta_key = wp_unslash( $meta_key );
44 $meta_value = sanitize_meta( $meta_key, wp_unslash( $meta_value ), 'post' );
45
46 // Collect data and format strings for a single INSERT
47 $insert_data = [];
48 $insert_formats = [];
49
50 foreach( $valid_post_ids as $post_id ){
51 array_push( $insert_data, $post_id, $meta_key, $meta_value );
52 $insert_formats[] = '(%d, %s, %s)';
53 }
54
55 $sql_string = "INSERT INTO $wpdb->postmeta (`post_id`, `meta_key`, `meta_value`) VALUES "
56 . implode( ', ', $insert_formats );
57
58 // ... unpacks the array into separate arguments for prepare
59 $sql_query = $wpdb->prepare( $sql_string, ...$insert_data );
60
61 return $wpdb->query( $sql_query );
62 }
63}

Was hier Zeile für Zeile passiert. Die Prüfung !function_exists ist eine Absicherung gegen Konflikte: Falls ein anderes Plugin bereits eine Funktion mit diesem Namen deklariert hat, gibt es keinen fatalen Fehler. Der Block is_numeric($post_ids) übergibt eine einzelne ID an das native add_post_meta, sodass dieselbe Funktion sowohl mit einem einzelnen Beitrag als auch mit einem Array funktioniert. Der Filter array_filter verwirft IDs von Entwürfen, gelöschten Einträgen und solchen, für die das eindeutige Feld bereits existiert. Die Bereinigung mittels wp_unslash und sanitize_meta ist zwingend: Ohne sie zerstören serialisierte Daten und Sonderzeichen die Abfrage.

*Wichtiger Hinweis zu ...$insert_data.* Der ...-Operator (Splat) entpackt das Array in eine flache Liste von Argumenten. Ohne ihn würde $wpdb->prepare ein Array-Argument anstelle einer Menge von (%d, %s, %s) erhalten, und die Abfrage würde mit einem Platzhalter-Zählfehler scheitern. PHP 5.6+ (WordPress setzt mindestens 7.0 voraus, Sie sind also auf der sicheren Seite).

Anwendung

Übergeben Sie ein Array von Beitrags-IDs, den Schlüssel und den Wert als regulären Aufruf. Der vierte Parameter, das Eindeutigkeits-Flag: true fügt das Feld nicht hinzu, wenn es für den Beitrag bereits existiert.

1$post_ids = [ 1, 2, 3, 42, 108 ];
2$meta_key = 'featured_priority';
3$meta_value = 'high';
4$unique = false; // will set for all, even if the field already existed
5
6add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique );

Es ist praktisch, einen solchen Aufruf über den init-Hook auszuführen (einmalig, dann entfernen) oder via WP-CLI mit dem Befehl wp eval-file. Entfernen Sie den Code nach der Ausführung unbedingt aus der functions.php, sonst feuert die Funktion bei jedem Seitenaufruf.

Methode 2. Schleife über IDs mit add_post_meta

Wenn Sie SQL nicht direkt anfassen möchten, nutzen Sie das native add_post_meta in einer Schleife. Der Code ist viermal kürzer und verlässt sich vollständig auf den WordPress-Core.

1$post_ids = [ 1, 2, 3, 42, 108 ];
2$meta_key = 'featured_priority';
3$meta_value = 'high';
4$unique = false;
5
6foreach( $post_ids as $post_id ){
7 add_post_meta( $post_id, $meta_key, $meta_value, $unique );
8}

Die Schleife iteriert über das Array und ruft add_post_meta für jede ID auf. Die Funktion selbst prüft die Existenz des Eintrags, die Eindeutigkeit des Schlüssels (wenn $unique = true gesetzt ist) und die Datenkorrektheit; eine zusätzliche Validierung ist nicht nötig.

Performance. Bei hundert Beiträgen ist der Unterschied zur SQL-Abfrage nicht wahrnehmbar. Wenn Sie aber 5.000 Datensätze haben, erzeugt jeder add_post_meta-Aufruf ein separates INSERT, zuzüglich interner Hooks (added_post_meta, update_post_meta_cache). Bei solchen Volumina läuft die erste Methode mit einer einzigen Abfrage 10- bis 20-mal schneller.

Für einmalige Aktionen mit ein paar Dutzend Beiträgen nutzen Sie die Schleife, machen Sie die Sache nicht komplizierter als nötig.

Vergleich der Ansätze

Kriterium

Methode 1 (einzelnes SQL)

Methode 2 (add_post_meta-Schleife)

Geschwindigkeit bei 5.000 Beiträgen

~0,2 Sek. (1 Abfrage)

~3-6 Sek. (5.000 Abfragen)

Code-Komplexität

~50 Zeilen mit Validierung

4 Zeilen

Sicherheit

Manuelle Bereinigung nötig

add_post_meta erledigt alles

WordPress-Hooks

Werden nicht aufgerufen

added_post_meta, update_post_meta_cache

Wann wählen

Massenmigration, CSV-Import

Einmalige Bearbeitungen, bis zu hundert Beiträge

Eine universelle Regel: Wenn es weniger als hundert Beiträge sind und die Aktion einmalig ist, nutzen Sie die Schleife. Wenn es um regelmäßige Synchronisation oder Migration Tausender Datensätze geht, nur die direkte Abfrage mit der vorbereiteten Funktion.

⁉️🤔 Häufige Fragen

Kann ich ein Feld selektiv zuweisen, nur Beiträgen aus einer bestimmten Kategorie?

Ja. Ermitteln Sie die Beitrags-IDs via get_posts mit dem Parameter 'category' => ID_рубрики und übergeben Sie das Array dann an eine der beiden oben genannten Methoden. Für Tausende von Beiträgen fügen Sie 'numberposts' => -1 und 'fields' => 'ids' hinzu; die Abfrage liefert dann nur ein Array von IDs, ohne Objekte zu laden.

Hier ein fertiges Beispiel: $post_ids = get_posts( [ 'category' => 5, 'numberposts' => -1, 'fields' => 'ids', 'post_type' => 'post' ] );. Rufen Sie dann add_multiple_posts_meta($post_ids, ...) oder eine Schleife mit add_post_meta auf.

Was, wenn ich für verschiedene Beiträge unterschiedliche Feldwerte benötige?

Eine Masseneinfügung funktioniert hier nicht. Erstellen Sie ein assoziatives Array [ ID_поста => значение ] und iterieren Sie in einer Schleife mit add_post_meta oder update_post_meta darüber. Ein Wert für alle, SQL; unterschiedliche Werte für verschiedene Beiträge, nur eine Schleife.

Für mehr als 50 Beiträge mit individuellen Werten nutzen Sie update_post_meta statt add_post_meta: Das erzeugt keine Duplikate, wenn das Feld bereits existiert.

Ist es sicher, SQL-Abfragen direkt auf wp_postmeta zu schreiben?

Es ist sicher unter zwei Bedingungen. Erstens: Führen Sie Daten immer durch $wpdb->prepare; das escapt Sonderzeichen und blockt SQL-Injections. Zweitens: Erstellen Sie vor der Ausführung ein vollständiges Datenbank-Backup. Ein falsches UPDATE ohne WHERE, und wp_postmeta ist für alle Datensätze geleert.

Backup-Befehl via WP-CLI: wp db export backup-before-meta.sql. Wiederherstellung: wp db import backup-before-meta.sql.

Wie unterscheidet sich add_post_meta von update_post_meta?

add_post_meta fügt eine neue Zeile in wp_postmeta ein, selbst wenn der Schlüssel für den Beitrag bereits existiert, was zu einem Duplikat führt. update_post_meta prüft die Existenz des Schlüssels: Existiert er, wird der Wert aktualisiert; wenn nicht, wird er angelegt. Für die Massenbefüllung, bei der es einen Schlüssel pro Beitrag gibt, erzielt add_post_meta mit $unique = true denselben Effekt.

In der Praxis: add_post_meta($id, 'views', 0, true) legt das Feld einmal an und rührt es nie wieder an. update_post_meta($id, 'views', $count) überschreibt den Wert bei jedem Aufruf.

Wo sollte ich den Code platzieren, im Theme oder einem Plugin?

Für einmalige Aktionen in der functions.php des Child-Themes, mit sofortiger Entfernung nach der Ausführung. Für wiederkehrende Aufgaben verpacken Sie ihn als Must-Use-Plugin (Ordner wp-content/mu-plugins/) oder fügen ihn in Code Snippets mit dem Flag „Einmal ausführen" hinzu. Code in einem aktiven Theme ohne Entfernung trifft bei jedem Seitenaufruf auf die Datenbank; das ist unnötige Last.

Was Sie für Ihre Aufgabe wählen sollten

Die Praxis zeigt: 9 von 10 Fällen werden durch die Schleife mit add_post_meta abgedeckt. Das sind vier Codezeilen, eine native Funktion und keine Überraschungen.

Eine direkte SQL-Abfrage ist in zwei Situationen gerechtfertigt: Massenmigration (Tausende von Beiträgen, Zeit ist wertvoll) und periodische Synchronisation, bei der Sie die Bereinigung am Eingang kontrollieren. Ansonsten machen Sie die Sache nicht komplizierter als nötig.

Was Sie jetzt tun sollten:

  • Wenn Sie ein Feld für ≤100 Beiträge zuweisen müssen, kopieren Sie die Schleife aus der zweiten Methode, setzen Sie Ihre IDs ein und führen Sie sie aus.
  • Wenn es mehrere Tausend Beiträge sind, nehmen Sie die Funktion aus der ersten Methode, testen Sie sie aber zuerst an einer Website-Kopie.
  • In jedem Szenario gilt: Sichern Sie die Datenbank vor der Ausführung. Das ist keine Vorsichtsmaßnahme, sondern eine Regel.

Und welche Methode nutzen Sie üblicherweise, um benutzerdefinierte Felder hinzuzufügen: über das Admin-Panel, per Code oder mit einem Plugin wie ACF? Schreiben Sie es in die Kommentare, es ist interessant, Ansätze zu vergleichen.