Las categorías de WordPress nos permiten agrupar entradas y relacionarlas, este tipo de taxonomía es jerárquica, es decir, que permite crear taxonomías de nivel superior y anidar taxonomías dentro de estas. Al igual que las etiquetas, las categorías tienen términos (terms), que están asociados a su taxonomía. En muchas ocasiones necesitamos crear algún tipo de meta-dato dentro de las categorías para que nos devuelvan algo en una situación concreta, por ejemplo, queremos que cada categoría que creemos tenga un color de texto, esto lo podríamos hacer con css, pero entonces no sería dinámico, por lo que la mejor opción es crear un campo personalizado o término que guarde un valor y podamos controlar desde el panel de administración.

 

Por defecto, las categorías vienen con 4 términos creados en WordPress

  • Nombre (term-name-wrap)
  • Slug (term-slug-wrap)
  • Categoría superior (term-parent-wrap)
  • Descripción (term-description-wrap)

 

Al diferencia de las entradas, no podemos añadir campos personalizados desde el panel de WordPress por lo que crearemos una función, esta primera parte es opcional y añadirá el nuevo término al formulario de añadir nueva categoría.

 

<?php
function didesweb_tax_add_new_meta() {
  ?>
  <div class="form-field">
    <label for="term_meta[new_term_meta]"><?php _e( 'Nueva meta', 'didesweb' ); ?></label>
    <input type="text" name="term_meta[new_term_meta]" id="term_meta[new_term_meta]" value="">
    <p class="description"><?php _e( 'Descripción de la nueva meta','didesweb' ); ?></p>
  </div>
<?php
}
add_action( 'category_add_form_fields', 'didesweb_tax_add_new_meta', 10, 2 );

 

A continuación añadiremos el nuevo término al formulario de editar categoría, aquí vamos a tener que disponer siempre de este campo de formulario por esa razón podemos ahorrarnos la función anterior y editar o añadir este campo desde el formulario de editar categoría.

 

<?php
function didesweb_tax_edit_new_meta($term) {
  $new_term_id = $term->term_id;
  $term_meta = get_option( "taxonomy_$new_term_id" ); ?>
  <tr class="form-field">
  <th scope="row" valign="top"><label for="term_meta[new_term_meta]"><?php _e( 'Nueva meta', 'didesweb' ); ?></label></th>
    <td>
      <input type="text" name="term_meta[new_term_meta]" id="term_meta[new_term_meta]" value="<?php echo esc_attr( $term_meta['new_term_meta'] ) ? esc_attr( $term_meta['new_term_meta'] ) : ''; ?>">
      <p class="description"><?php _e( 'Descripción de la nueva meta','didesweb' ); ?></p>
    </td>
  </tr>
<?php
}
add_action( 'category_edit_form_fields', 'didesweb_tax_edit_new_meta', 10, 2 );

 

Por último tenemos que crear la función que guarde esos datos al guardar el formulario. Si hemos usado la función para añadir el nuevo campo en el formulario de añadir categoría usaremos además el hook create_category para que se guarden los datos al crear la nueva categoría, de lo contrario, bastará con agragerlo al hook edited_category.

 

<?php
function didesweb_tax_save_new_meta( $term_id ) {
  if ( isset( $_POST['term_meta'] ) ) {
    $new_term_id = $term_id;
    $term_meta = get_option( "taxonomy_$new_term_id" );
    $cat_keys = array_keys( $_POST['term_meta'] );
    foreach ( $cat_keys as $key ) {
      if ( isset ( $_POST['term_meta'][$key] ) ) {
        $term_meta[$key] = $_POST['term_meta'][$key];
      }
    }
    update_option( "taxonomy_$new_term_id", $term_meta );
  }
}  
add_action( 'edited_category', 'didesweb_tax_save_new_meta', 10, 2 );  
add_action( 'create_category', 'didesweb_tax_save_new_meta', 10, 2 );

 

Ya que tenemos hecho el trabajo estaría bien que deje también aquí el código para mostrar los valores en el front ¿no?. Con el siguiente código se mostraría un listado de las categorías con el color que nos devuelva el valor de su término:

 

<?php 
  $categories =  get_categories(); 
  echo '<ul>';
  foreach ($categories as $cat) { 
  $new_term_id = $cat->term_id;
  $term_meta = get_option( "taxonomy_$new_term_id" );
  echo '<li><a style="color:' . $term_meta['new_term_meta'] . ';" href="'. get_category_link( $cat->term_id ) .'">' . $cat->name . '</a></li>';
  }
  echo '<ul>';
?>

 

Valoraciones


Sé el primero en valorar

* Tu valoración puede tardar hasta 72 horas en publicarse.

He leido y acepto el Aviso legal y condiciones de uso

Utilizamos cookies propias y de terceros para personalizar el contenido y los anuncios, ofrecer funciones de medios sociales y analizar el tráfico. Además compartimos información sobre el uso que haces de nuestra web con nuestros partners de medios sociales, de publicidad y de análisis web. Si continúas navegando estás dando tu consentimiento para la aceptación de nuestra Política de cookies.

ACEPTAR
Aviso de cookies