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

Marc Wagner, Oktober 2, 2023

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.

Benutzerbild von Marc Wagner
Marc Wagner

Hi Marc here. I'm the founder of Forge12 Interactive and have been passionate about building websites, online stores, applications and SaaS solutions for businesses for over 20 years. Before founding the company, I already worked in publicly listed companies and acquired all kinds of knowledge. Now I want to pass this knowledge on to my customers.

Ähnliche Beiträge

Comments

  1. 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’)){

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

  2. 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?

    • 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

Hinterlasse einen Kommentar