Wie kann ich bei WordPress eigene Felder für Taxonomien anlegen? (PHP, Anleitung 2023)

Marc Wag­ner

Janu­ar 27, 2023

6 min read|

Genau wie für Post Types kannst du auch eige­ne Fel­der für dei­ne Word­Press Taxo­no­mien anle­gen. Die Wer­te las­sen sich dann in den Term Meta­da­ten spei­chern. Wie das Gan­ze funk­tio­niert, zei­ge ich euch in die­ser Anlei­tung. Außer­dem zei­ge ich dir, wie du die Admin-Tabel­­le dei­ner Taxo­no­mie erwei­terst, um dei­ne Wer­te direkt anzu­zei­gen. Zum Abschluss fügen wir noch eine Sor­tier­funk­ti­on hin­zu.

Erstellen, Bearbeiten und Speichern von eigenen Feldern für WordPress Taxonomien #

Um dei­ne Taxo­no­mien zu erwei­tern, brauchst du fol­gen­de Action-Hooks:

  • Erstel­len von Terms: {$taxonomy}_add_form_fields
  • Bear­bei­ten von Terms: {$taxonomy}_edit_form_fields
  • Spei­chern von Terms: created_{$taxonomy} & edited_{$taxonomy}

{$taxonomy}_add_form_fields

Als Ers­tes erstel­len wir eine Ein­ga­be für das Feld (wir nen­nen es mal “sort”). Es soll eine Num­mer spei­chern, die man zum Bei­spiel zum Sor­tie­ren der Terms ver­wen­den kann. Damit wir für unse­re Terms das Feld direkt beim Erstel­len mit ange­ben kön­nen, fügen wir fol­gen­des PHP Snip­pet ein:

/**
 * Taxonomie: book
 */
function add_form_field_to_taxonomy_book(string $taxonomy): void{
  // add a nonce for security
  wp_nonce_field( 'book_meta_new', 'book_meta_new_nonce' );
  ?>
    <tr class="form-field">
    	<th>
    		<lable for="sort"><?php _e('Sort', 'my_domain'); ?></lable>
      	</th>
      	<td>
      		<input name="sort" id="sort" type="number" value="<?php echo esc_attr($sort); ?>"/>
      		<p class="description"><?php _e('Enter the position within the menu. Negativ values are allowed.', 'my_domain'); ?></p>
        </td>
     </tr>
  <?php
}

add_action('book_add_form_fields', 'add_form_field_to_taxonomy_book', 10, 1);

Jetzt steht uns ein Feld für die Ein­ga­be der Sor­tie­rung (sort) zur Ver­fü­gung. Hier ein Bild, wie das Gan­ze dann aus­se­hen könn­te in dei­nem Word­Press Backend:

image 18
Neu­es Feld (sort) zu einer Taxo­no­mie (book) hin­zu­ge­fügt.

{$taxonomy}_edit_form_fields

Als Nächs­tes müs­sen wir dafür sor­gen, dass wir die Terms und damit auch unser Feld bear­bei­ten kön­nen. Schließ­lich möch­ten wir den Wert sicher­lich auch irgend­wann ein­mal ändern. Damit uns das gelingt, müs­sen wir noch eine wei­te­re Funk­ti­on hin­zu­fü­gen:

public function edit_form_field_for_taxonomy_book(\WP_Term $term, string $taxonomy): void
{
  	$sort = get_term_meta($term->term_id, 'sort', true);

  	// add a nonce for security
  	wp_nonce_field( 'book_meta_edit', 'book_meta_edit_nonce' );
  	?>
    	<tr class="form-field">
    		<th>
    			<label for="sort"><?php _e('Sort', 'f12_table'); ?></label>
      		</th>
      		<td>
      			<input name="sort" id="sort" type="number" value="<?php echo esc_attr($sort); ?>"/>
      			<p class="description"><?php _e('Enter the position within the menu. Negativ values are allowed.', 'f12_table'); ?></p>
      		</td>
    	</tr>
	<?php
}

add_action('book_edit_form_fields', 'edit_form_field_for_taxonomy_book', 10, 2);

Nach dem Ein­bau wird uns end­lich auch ein Feld für das Ändern unse­res Wer­tes beim Bear­bei­ten des Word­Press Terms ange­zeigt. Hier mal ein Bei­spiel, wie das bei uns aus­sah:

image 19
Bear­bei­ten unse­res neu­en Fel­des (sort) für die Taxo­no­mie (book)

created_{$taxonomy} & edited_{$taxonomy}

Zum Schluss müs­sen wir natür­lich noch dafür sor­gen, dass unser Wert in der Daten­bank abge­spei­chert wird. Hier­bei hilft uns fol­gen­der Aus­schnitt:

public function save(int $term_id)
{
  if(!isset($_POST['sort'])){
    return;
  }
  
  if(!isset($_POST['book_meta_new_nonce']) && !isset($_POST['book_meta_edit_nonce'])){
    return; 
  }
  
  if(!wp_verify_nonce($_POST['book_meta_new_nonce'],'book_meta_new') && !wp_verify_nonce($_POST['book_meta_edit_nonce'], 'book_meta_edit')){
    return;
  }
  
  update_term_meta($term_id, 'sort', (int)($_POST['sort']));
}

add_action('created_book', 'save_book_meta', 10, 1);
add_action('edited_book', 'save_book_meta', 10, 1)

Das war es auch schon — damit haben wir alle Schrit­te abge­schlos­sen, um ein neu­es Feld zu erstel­len, zu bear­bei­ten und in der Daten­bank zu spei­chern.

Ausgeben von Term Metadaten mit einem WordPress Shortcode #

Um die Daten jetzt aus­zu­ge­ben, legen wir einen Short­code an. Die­sen kön­nen wir dann nach Belie­ben auf Word­Press Sei­ten und Bei­trä­gen plat­zie­ren. Hier ist ein PHP Snip­pet, um ein Feld aus dei­nem Term abzu­fra­gen. Dabei muss es nicht mal ein Term von der Taxo­no­mie ‘book’ sein.

/**
 * Add shortcode [book_metafield term_id=123 meta_key="sort"]
 * @return string
 */
function render_book_metafield($args, $content = ''): string{
  // parse the $args
  $args = shortcode_atts(['term_id' => 0,'meta_key' => 'sort'], $args, 'book_metafield');
  
  $value = get_term_meta($args['term_id'], 'sort', true);
  
  if(!$value){
    return 'Term not found'; 
  }
  return value;
}

add_shortcode('book_metafield', 'render_book_metafield');

Der Auf­ruf erfolgt dann so: [book_metafield term_id=123 meta_key=“sort”]

Erweitern der Taxonomy Admin-Tabelle um eine neue Spalte #

Du kannst auch die Tabel­le dei­ner Taxo­no­mie erwei­tern, um den Wert des Fel­des direkt in der Über­sicht anzu­zei­gen. Hier­für benö­tigst du die fol­gen­den Word­Press Fil­­ter- und Action-Hooks:

  • Spal­te hin­zu­fü­gen: manage_edit-{$taxonomy}_columns
  • Inhalt hin­zu­fü­gen: manage_{$taxonomy}_custom_column
  • Sor­tier­bar machen: manage_edit-{$taxonomy}_sortable_column

manage_edit-{$taxonomy}_columns

Als Ers­tes tei­len wir Word­Press mit, dass wir eine wei­te­re Spal­te für unse­re Taxo­no­my anzei­gen wol­len. Hier­zu müs­sen wir fol­gen­des PHP Snip­pet ein­fü­gen:

/**
 * Add new column to taxonomy book
*/
public function add_column_for_taxonomy_book(array $columns): array
{
  $columns['sort'] = __('Sort', 'my_domain');
  return $columns;
}

// Filter: manage_edit-{$taxonomy}_columns
add_filter('manage_edit-book_columns', 'add_column_for_taxonomy_book', 10, 1)

manage_{$taxonomy}_custom_column

Jetzt müs­sen wir noch die Aus­ga­be der ein­zel­nen Zei­len erwei­tern, um unse­ren Wert anzu­zei­gen.

/**
 * Show content of term meta.
 */
public function add_content_for_taxonomy_book(string $content, string $column_name, int $term_id):void{
  // Skip if this is not our column
  if($column_name != 'sort'){
     return; 
  }
  
  $sort = get_term_meta($term_id, 'sort', true);
  
  // Skip if term or field does not exist
  if(!$sort){
     return; 
  }
  
  echo esc_attr($sort);
}

// Action: manage_{$taxonomy}_custom_column
add_action('manage_book_custom_column', 'add_content_for_taxonomy_book', 10, 3);

Das war es auch schon. Jetzt wird sowohl die Spal­te als auch die Zei­le mit unse­ren Inhal­ten aus­ge­ge­ben.

image 20
Neue Spal­te (sort) zur Taxo­no­my (book) hin­zu­ge­fügt.

manage_edit-{$taxonomy}_sortable_columns

Zum Schluss erwei­tern wir die Admin-Tabel­­le noch, damit wir nach unse­rem Feld sor­tie­ren kön­nen. Hier­zu brau­chen wir nur noch das fol­gen­de PHP-Snip­­pet:

public function make_book_sortable(array $columns): array
{
  // Add or remove columns here. If you remove them, it
  // will remove the sort function.
  $columns['sort'] = __('Sort', 'my_domain');

  return $columns;
}

add_filter('manage_edit-book_sortable_columns', 'make_book_sortable', 10, 1);

Nach dem Ein­fü­gen kannst du die Terms nach den neu­en Wer­ten durch einen Klick auf den Spal­ten­na­men auf- und abstei­gend sor­tie­ren.

88e86fcb816eff22bc917094df2862d8dd5c0e978b333e6dd5f36f808990c261 96

Arti­kel von:

Marc Wag­ner

Hal­lo, Marc hier. Ich bin der Grün­der von Forge12 Inter­ac­ti­ve und bereits seit über 20 Jah­ren lei­den­schaft­lich dabei Web­sei­ten, Online­shops, Anwen­dun­gen und SaaS-Lösun­gen für Unter­neh­men zu ent­wi­ckeln. Vor der Grün­dung habe ich bereits in Bör­sen notier­ten Unter­neh­men gear­bei­tet und mir aller­lei Wis­sen ange­eig­net. Die­ses Wis­sen möch­te ich nun an mei­ne Kun­den wei­ter­ge­ben.

Hast du eine Fra­ge? Hin­ter­lass bit­te einen Kom­men­tar
  1. blank
    Mar­tin Okto­ber 2, 2023 at 14:43 — Rep­ly

    if(!wp_verifiy_nonce($_POST[‘book_meta_new_nonce’],‘book_meta_new’) && !wp_verify_nonce($_POST[‘book_meta_edit_nonce’], ‘book_meta_edit’)){

    => oops

    if(!wp_verify_nonce($_POST[‘book_meta_new_nonce’],‘book_meta_new’) && !wp_verify_nonce($_POST[‘book_meta_edit_nonce’], ‘book_meta_edit’)){

    • ac6edb55c1fefa891790daaeb15a79a3b9d22ed399292e234411aa67ac6fb9f6 54
      Marc Wag­ner Okto­ber 2, 2023 at 14:52 — Rep­ly

      Hal­lo @Martin — dan­ke für den Hin­weis, kor­ri­gie­ren wir direkt.

  2. blank
    Jörg Febru­ar 17, 2024 at 13:27 — Rep­ly

    Hal­lo Marc, erst ein mal vie­len Dank für die­ses Tuto­ri­al. Genau das habe ich gesucht.
    Aller­dings funk­tio­niert bei mir die nume­ri­sche Sor­tie­rung der Spal­te “sort” nicht. Es wird immer alpha­be­tisch nach dem Namen der ers­ten Spal­te sor­tiert. Hast du eine Idee, war­um?

    • ac6edb55c1fefa891790daaeb15a79a3b9d22ed399292e234411aa67ac6fb9f6 54
      Marc Wag­ner März 12, 2024 at 08:14 — Rep­ly

      Hal­lo Jörg,
      spon­tan lei­der nicht. Ger­ne kannst du uns aber kon­tak­tie­ren und wir hel­fen dir dein Pro­blem zu lösen.

      Vie­le Grü­ße
      Marc von Forge12