24.11.2020

tax_input in wp_insert_post richtig verwenden

Von Barbara

Heute schauen wir uns an, wie man mittels tax_input eine benutzerdefinierte Taxonomie hinzufügt während man einen neuen Post erstellt.

Die Funktion wp_insert_post() erlaubt es auf einfache Art und Weise neue Posts in deine WordPress Datenbank hinzuzufügen.

Den grundlegenden Array für den neuen $post zu bilden ist recht einfach, bei zusätzlichen Elementen wird es aber schnell schwierig.

Wir beginnen mit dem grundlegenden Array für einen neuen Post:

$post = array(
    'post_title' => 'Hallo neuer Beitrag!',
    'post_content' => 'Hier steht ganz viel Inhalt'
);
$post_id = wp_insert_post( $post );

Als nächstes erstellen wir den Array für die Taxonomie:

$taxonomy = array(
    'color' => array(
        'green',
        'red'
    )
);

Zusammengefügt erhalten wir also folgendes:

$post = array(
    'post_title' => 'Hallo neuer Beitrag!',
    'post_content' => 'Hier steht ganz viel Inhalt',
    'tax_input' => $taxonomy
);
$post_id = wp_insert_post( $post );

Multiple Taxonomien

Natürlich kann man auch mehrere Taxonomien gleichzeitig einfügen, hierzu erweitern wir einfach unser $taxonomy Array:

$taxonomy = array(
    'color' => array(
        'green',
        'red'
    ),
    'size' => array(
        'big'
    )
);

Hierarchische Taxonomien

Bisher haben wir lediglich nicht-hierarchische Taxonomien hinzugefügt. Wenn wir nun hierarchische Taxonomien benötigen, wird es etwas komplizierter, denn hier können wir nicht einfach Strings mit dem Term benutzen, das würde ein heilloses Durcheinander erzeugen da für jeden Post neue Terms angelegt würden.

Stattdessen müssen wir vor dem Einfügen überprüfen, ob der Term bereits existiert. Außerdem verwenden wir die Funktion wp_insert_term um neue Terms anzulegen.

$department = 'Food';
$section = 'Produce';

// Check if department exists
$department_term = term_exists( $department, 'category', 0 );
// Create if not
if ( !$department_term ) {
    $department_term = wp_insert_term( $department, 'category', array( 'parent' => 0) );
}

// Check if section exists as child of department
$section_term = term_exists( $section, 'category', $department_term['term_taxonomy_id'] );
// Create if not
if ( !$section_term ) {
    $section_term = wp_insert_term( $section, 'category', array( 'parent' => $department_term['term_taxonomy_id'] ) );
}

$taxonomy = array(
    'category' => array(
        $section_term['term_taxonomy_id'],
        $department_term['term_taxonomy_id']
    )
);

$post = array(
    'post_title' => 'Hallo neuer Beitrag!',
    'post_content' => 'Hier steht ganz viel Inhalt',
    'tax_input' => $taxonomy
);
$post_id = wp_insert_post( $post );

Wir überprüfen zunächst ob die Abteilung “Food” schon besteht, falls nicht, wird sie angelegt. Die Funktion term_exists() checkt ob ein Term schon existiert und gibt die Term-ID zurück oder null falls keiner gefunden wurde. Wurde eine Taxonomie angegeben wie in unserem Fall category gibt die Funktion ein array mit Term-ID und Taxonomie-ID zurück bei erfolgreicher Suche. Mehr könnt ihr hier nachlesen: https://developer.wordpress.org/reference/functions/term_exists/

Sollte der Term nicht bestehen, wird er angelegt mittels wp_insert_term().

Anschließend durchlaufen wir denselben Vorgang mit der Unterabteilung “Produce”. Der Unterschied besteht darin, dass wir als parent die ID unserer Abteilung “Food” verwenden, sowohl für term_exists() als auch für wp_insert_term().

Jetzt können wir die IDs in unserem array $taxonomy benutzen um den neuen Post mit der richtigen Taxonomie zur Datenbank hinzuzufügen.

Benutzer-Berechtigungen

In manchen Situationen kann es vorkommen, dass tax_input in Kombination mit wp_insert_post() nicht funktioniert, dies hängt meist mit den Capabilities eines Benutzers zusammen, zum Beispiel wenn ein Subscriber über eine Frontend-Submission einen neuen Beitrag erzeugt.

In diesem Fall kann man stattdessen mit der Funktion wp_set_object_terms() arbeiten, hier wird erst der Post in die Datenbank eingefügt und anschliessend die Taxonomie dazu gespeichert.

Mehr Infos zu wp_set_object_terms() findet ihr in der WordPress Code Reference: https://developer.wordpress.org/reference/functions/wp_set_object_terms/