Cuando creamos un tema nos gusta dar todas las opciones para que un tema sea usable, 100% customizable y en resumidas cuentas fácil de usar que es por lo que escogemos a menudo wordpress para nuestras webs. Para ello usamos metabox.io, pero tiene sus limitaciones. Una de ellas es el poder añadir campos personalizados a las taxonomías. Aquí os dejo una solución para implementar en nuestro functions.php.

Este dato es importante ya que el nombre de la taxonomía se incluye en los add_action y se deberá poner el nombre correspondiente a la taxonomía que queremos usar. Por ejemplo si tenemos: tipo_add_form_fields y lo querenoms aplicar a categorias deberíamos poner: category_add_form_fields.

Primero deberemos definir la función para mostrar el campo en la página de registro de una taxonomía que puede ser por defecto (categorías o etiquetas) o taxonomías creadas por nosotros de posts o de custom post types. En este caso usaremos una propia llamada tipo.

<?php
/* Página de añadir un término */
function taxonomy_add_new_meta_field() {
    ?>
    <div class="form-field">
    <label for="term_meta[tax_field]">Custom field</label>
    <input type="text" name="term_meta[tax_field]" id="term_meta[tax_field]" />
    <p class="description">Description of the field</p>
    </div>
<?php
}
 
add_action( 'tipo_add_form_fields', 'taxonomy_add_new_meta_field', 10, 2 );
?>

Ahora deberemos definir la función para la página de editar un término:

<?php
function taxonomy_edit_meta_field($term) {
    // Ponemos el id en una variable
    $t_id = $term->term_id;
 
    // Pedidmos los valores existentes, nos devuelve un array
    $term_meta = get_option( "taxonomy_$t_id" );
    ?>
    <tr class="form-field">
    <th scope="row" valign="top"><label for="term_meta[tax_field]">Custom field</label></th>
        <td>
            <input type="text" name="term_meta[tax_field]" id="term_meta[tax_field]">
            <p class="description">Description of the field</p>
        </td>
    </tr>
    <?php
}
add_action( 'tipo_edit_form_fields', 'taxonomy_edit_meta_field', 10, 2 );
?>

Finalmente sólo tenemos que registrar las acciones de crear y guardar valores de taxonomías:

<?php
function save_taxonomy_custom_meta( $term_id ) {
    if ( isset( $_POST['term_meta'] ) ) {
        $t_id = $term_id;
        $term_meta = get_option( "taxonomy_$t_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];
            }
        }
        // Save the option array.
        update_option( "taxonomy_$t_id", $term_meta );
    }
}  
add_action( 'edited_tipo', 'save_taxonomy_custom_meta', 10, 2 );  
add_action( 'create_tipo', 'save_taxonomy_custom_meta', 10, 2 );
?>

Luego para obtener el valor de nuestro campo sólo tenemos que pedirlo amablemente así:

// Recogemos los valores meta de la taxonomía
$term_meta = get_option('taxonomy_'.$term_id);
 
// Cogemos el que nos interesa
$term_meta_tax_field = $term_mate['tax_field'];
Categorías: Wordpress
Etiquetas:,
Si necesitas una url corta puede usar: codygo.es/1371

2 comentarios

  1. Anonimo dice:

    Hola tengo un problema al poner este codigo, lo que introduzca en el campo no me lo guarda

    • mononelo dice:

      Primero ¡perdona pr la tardanza de la respuesta! Después prueba en vez de poner $term_meta = get_option( "taxonomy_$t_id" ); a poner $term_meta = get_option( "taxonomy_".$t_id );. A veces no le gusta de esta forma y necesita que lo separen. ¡Dime si te funciona bien así y lo modifico en el post! ¡Gracias!

Deja un comentario