Agregar campos personalizados de taxonomía al crear una nueva taxonomía

23 sept 2011, 23:46:39
Vistas: 21.7K
Votos: 8

Edición: Nota importante para WordPress v4.4 en adelante

Esta pregunta utilizaba una buena solución alternativa para la falta de meta términos reales en versiones anteriores de WordPress, pero desde el lanzamiento de WordPress v4.4, se introdujeron los meta términos reales, y esa es definitivamente la forma de proceder ahora.

Aquí hay una publicación que parece un buen punto de partida para meta términos en WordPress 4.4+

Mantengo esta pregunta porque aún podría ser útil para alguien que trabaje con código antiguo, pero quería agregar la nota anterior para que los desarrolladores que comienzan con nuevas implementaciones de meta términos estén en el camino correcto.

Fin de la edición


He podido aprovechar este super tutorial de @Bainternet para agregar campos personalizados para taxonomías. He modificado el markup y agregado una callback separada para añadir campos a la página de administración "Añadir Nueva Categoría". Mi código está al final de esta pregunta.

Sin embargo, me he encontrado con un problema; el campo personalizado aparece en la página de añadir nueva categoría, pero el campo no se guarda.

He notado que la página de añadir nueva taxonomía usa ajax, y eso podría ser parte del problema. Intenté deshabilitar JS, y aún me encuentro con el mismo problema. He estado investigando en el núcleo buscando un hook, pero no puedo encontrar uno. Hay varios tutoriales en la red, pero todos parecen depender de la pantalla de edición de taxonomía para hacer su trabajo.

¿Alguna idea de cómo hacer que esto funcione?

/**
 * Funciones callback para agregar campos extra al formulario de edición y creación de taxonomías
 */
// Página de edición de taxonomía
function extra_edit_tax_fields($tag) {
    // Verificar metadatos de taxonomía existentes para el ID del término
    $t_id = $tag->term_id;
    $term_meta = get_option( "taxonomy_$t_id" ); ?>
    <tr class="form-field">
    <th scope="row" valign="top"><label for="cat_Image_url"><?php _e( 'URL de Imagen de Navegación de Categoría' ); ?></label></th>
        <td>
            <input type="text" name="term_meta[img]" id="term_meta[img]" value="<?php echo esc_attr( $term_meta['img'] ) ? esc_attr( $term_meta['img'] ) : ''; ?>">
            <p class="description"><?php _e( 'Ingrese la URL completa de la imagen de navegación utilizada para esta categoría.' ); ?></p>
        </td>
    </tr>
<?php
}
add_action( 'category_edit_form_fields', 'extra_edit_tax_fields', 10, 2 );

// Página de agregar taxonomía
function extra_add_tax_fields( $tag ) {
    // Verificar metadatos de taxonomía existentes para el ID del término
    $t_id = $tag->term_id;
    $term_meta = get_option( "taxonomy_$t_id" ); ?>
    <div class="form-field">
        <label for="cat_Image_url"><?php _e( 'URL de Imagen de Navegación de Categoría' ); ?></label>
        <input type="text" name="term_meta[img]" id="term_meta[img]" value="<?php echo esc_attr( $term_meta['img'] ) ? esc_attr( $term_meta['img'] ) : ''; ?>">
        <p class="description"><?php _e( 'Ingrese la URL completa de la imagen de navegación utilizada para esta categoría.' ); ?></p>
    </div>
<?php
}
add_action( 'category_add_form_fields', 'extra_add_tax_fields', 10, 2 );

// Función callback para guardar campos extra de taxonomía
function save_extra_taxonomy_fields( $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];
            }
        }
        // Guardar el array de opciones
        update_option( "taxonomy_$t_id", $term_meta );
    }
}   
add_action( 'edited_category', 'save_extra_taxonomy_fields', 10, 2 );   
//add_action( '...No se puede encontrar el hook para habilitar el guardado de campos personalizados al agregar un nuevo término
0
Todas las respuestas a la pregunta 5
3

¡Resuelto!

add_action( 'create_category', 'save_extra_taxonomy_fields', 10, 2 );

Créditos al plugin Category Meta. Descargué varios plugins de metadatos para categorías del repositorio de WordPress, y este tiene la capacidad de añadir los metadatos en la pantalla de Añadir Nuevo. Revisé el código y encontré el escurridizo hook create_{term}.

24 sept 2011 00:37:43
Comentarios

Me encontré con tu publicación mientras intentaba resolver por qué mi código no funciona como se esperaba - wordpress.stackexchange.com/questions/417562/…. Estoy usando la mayoría de lo que tienes listado, pero por alguna extraña razón, los meta términos no se guardan la primera vez, pero sí en todos los envíos posteriores. Agradecería si pudieras orientarme en la dirección correcta.

Motivated Motivated
21 jul 2023 13:44:19

Hola @Motivated, el código publicado aquí está muy desactualizado y no debería usarse más. WP 4.4 introdujo la API de Term Meta que debería usarse en su lugar. Aquí hay un artículo que cubre cómo se puede usar: https://www.smashingmagazine.com/2015/12/how-to-use-term-meta-data-in-wordpress/

Dave Romsey Dave Romsey
22 jul 2023 20:30:37

Gracias. El ejemplo de código que publiqué usaba la API de Term Meta, pero por alguna razón extraña, no se ejecuta la primera vez que se publica el campo personalizado.

Motivated Motivated
23 jul 2023 08:10:03
1

Creo que el tutorial que referenciaste fue genial y he basado este código en él. Almacena los metadatos para la taxonomía menu_category en los formularios de agregar y editar para esa taxonomía, y los muestra en el formulario de edición. La entrada en la tabla de opciones sería taxomomy_24_metas para el término con ID 24.

add_action('menu_category_edit_form_fields','menu_category_edit_form_fields');
add_action('menu_category_add_form_fields','menu_category_edit_form_fields');
add_action('edited_menu_category', 'menu_category_save_form_fields', 10, 2);
add_action('created_menu_category', 'menu_category_save_form_fields', 10, 2);

function menu_category_save_form_fields($term_id) {
    $meta_name = 'order';
    if ( isset( $_POST[$meta_name] ) ) {
        $meta_value = $_POST[$meta_name];
        // Este es un array asociativo con claves y valores:
        // $term_metas = Array($meta_name => $meta_value, ...)
        $term_metas = get_option("taxonomy_{$term_id}_metas");
        if (!is_array($term_metas)) {
            $term_metas = Array();
        }
        // Guardar el valor del meta
        $term_metas[$meta_name] = $meta_value;
        update_option( "taxonomy_{$term_id}_metas", $term_metas );
    }
}

function menu_category_edit_form_fields ($term_obj) {
    // Leer el orden desde la base de datos de opciones
    $term_id = $term_obj->term_id;
    $term_metas = get_option("taxonomy_{$term_id}_metas");
    if ( isset($term_metas['order']) ) {
        $order = $term_metas['order'];
    } else {
        $order = '0';
    }
?>
    <tr class="form-field">
            <th valign="top" scope="row">
                <label for="order"><?php _e('Orden de Categoría', ''); ?></label>
            </th>
            <td>
                <input type="text" id="order" name="order" value="<?php echo $order; ?>"/>
            </td>
        </tr>
<?php 
}
7 feb 2012 12:35:05
Comentarios

Ya no funciona. Por favor, actualiza.

Brad Dalton Brad Dalton
11 may 2017 04:01:18
1

Puedes agregar campos personalizados a la pantalla de agregar nuevo término mediante los siguientes hooks:

  1. {taxonomy_name}_add_form_fields
  2. {taxonomy_name}_edit_form_fields
  3. edited_{taxonomy_name}
  4. create_{taxonomy_name}

Captura de pantalla mostrando campos personalizados en taxonomías

14 feb 2017 23:52:36
Comentarios

¡El enlace está roto!

Jimmy Adaro Jimmy Adaro
9 may 2019 00:23:14
0
add_filter('created_term', 'actualizar_campos_{taxonomia_personalizada}'); // Puedes nombrar tu función de callback como prefieras
function actualizar_campos_{taxonomia_personalizada}($term_id) {
    if($_POST['taxonomy'] == '{taxonomia_personalizada}'): // Una simple verificación para confirmar que es tu taxonomía
        // Realiza tu actualización (prefiero hacerlo en la tabla de opciones, pero puedes hacerlo como prefieras)
    endif;
}

Si deseas un hook más general, puedes usar "created_term" (disponible al menos desde la versión 3.4)

30 dic 2012 23:14:01
0

Puedes optar por el plugin de gestor de taxonomías. Puedes añadir una nueva taxonomía, además de agregar campos personalizados a la taxonomía seleccionada (por ejemplo, un campo de imagen).

28 nov 2011 14:00:30