Cómo Agregar Campos Personalizados a Taxonomías Personalizadas en WordPress de Forma LIMPIA

27 jun 2012, 21:27:42
Vistas: 26.1K
Votos: 5

Guardar campos extra que fueron agregados a una taxonomía. Quiero la forma más apropiada y eficiente de hacerlo. ¿Dónde debería guardar los nuevos campos?

2 posibles soluciones son:

1) Usar la tabla de opciones de WordPress como se describe aquí... Agregar Campos Personalizados a Taxonomías Personalizadas. Esto es reconocidamente "no limpio" y se asume que no es la respuesta correcta.

// Una función callback para guardar nuestro(s) campo(s) personalizado(s) de taxonomía
function save_taxonomy_custom_fields( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
    $t_id = $term_id;
    $term_meta = get_option( "taxonomy_term_$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_term_$t_id", $term_meta );
}
}

2) Agregar una nueva tabla como se describe aquí Taxonomías Personalizadas en WordPress que sigue la convención de nombres de 'wp_' + customtaxonomykey + 'meta'.

3) Alguna otra opción

0
Todas las respuestas a la pregunta 5
1
14

Puedes guardar el ID del adjunto en la tabla de opciones y luego recuperarlo para mostrarlo

Hay tres funciones principales para añadir el meta box a la taxonomía. Las cuales se invocan mediante los siguientes hooks:

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

Aquí puedes cambiar taxonomy_name por cualquier taxonomía predefinida o personalizada. Yo estoy usando "la taxonomía de productos de Woocommerce" y he creado un plugin para ello. Por favor revisa las siguientes funciones para añadir campos personalizados:

{taxonomy_name}_add_form_fields añade un nuevo campo personalizado al formulario de añadir nuevo término. Aquí estoy creando un campo para añadir una Clase al término.

Añade el siguiente código en functions.php de tu tema

public function mj_taxonomy_add_custom_meta_field() {
            ?>
            <div class="form-field">
                <label for="term_meta[class_term_meta]"><?php _e( 'Añadir Clase', 'MJ' ); ?></label>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="">
                <p class="description"><?php _e( 'Introduce un valor para este campo','MJ' ); ?></p>
            </div>
        <?php
        }
    add_action( 'product_cat_add_form_fields', 'mj_taxonomy_add_custom_meta_field', 10, 2 );

{taxonomy_name}_edit_form_fields añade un campo en la página de edición del término

public function mj_taxonomy_edit_custom_meta_field($term) {

        $t_id = $term->term_id;
        $term_meta = get_option( "taxonomy_$t_id" ); 
       ?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[class_term_meta]"><?php _e( 'Añadir Clase', 'MJ' ); ?></label></th>
            <td>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="<?php echo esc_attr( $term_meta['class_term_meta'] ) ? esc_attr( $term_meta['class_term_meta'] ) : ''; ?>">
                <p class="description"><?php _e( 'Introduce un valor para este campo','MJ' ); ?></p>
            </td>
        </tr>
    <?php
    }

add_action( 'product_cat_edit_form_fields','mj_taxonomy_edit_custom_meta_field', 10, 2 );

public function mj_save_taxonomy_custom_meta_field( $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];
                }
            }
            // Guarda el array de opciones
            update_option( "taxonomy_$t_id", $term_meta );
        }

    }  
add_action( 'edited_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );  
add_action( 'create_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );
8 feb 2017 19:33:28
Comentarios

¡Gracias por tus respuestas! ¿Podrías por favor editar tus respuestas y agregar un poco de información sobre qué hace este código y cómo resuelve el problema original?

Howdy_McGee Howdy_McGee
8 feb 2017 20:43:48
1

La opción 2 es el método más limpio, que también he utilizado varias veces. Desafortunadamente, todavía no existe una tabla term_metadata predeterminada en WordPress. Este artículo también cubre el mismo enfoque: http://shibashake.com/wordpress-theme/add-term-or-taxonomy-meta-data

Y por supuesto, también hay un plugin para eso :) http://wordpress.org/extend/plugins/taxonomy-metadata/

27 jun 2012 23:41:19
Comentarios

¡Excelente enlace del tutorial! Tan fácil. Gracias. (¡por supuesto que quería hacer el mío propio ya que los plugins son una solución demasiado fácil!)

csi csi
28 jun 2012 18:38:37
0

1) Tabla wp_options por defecto

Realmente no entiendo por qué la gente propone

update_option( "taxonomy_term_$t_id", $term_meta );

cuando podemos tener una sola opción, cuyos índices son el ID del Término y los campos personalizados como valores

$options = get_option( 'taxonomy_term_meta' );
$options[$t_id] = $term_meta;
update_option( 'taxonomy_term_meta', $options );

y luego simplemente recuperar la opción y obtener el valor almacenado para un ID de Término dado

$options = get_option( 'taxonomy_term_meta' );
echo $options[$tax->term_id];

2) Tabla personalizada wp_taxonomymeta

Eso es lo que hace el plugin Taxonomy Metadata, enlazado por James. Y es bastante simple, una vez creada esta tabla, las funciones add_, get_, update_ y delete_<b>metadata</b> comenzarán a trabajar con 'taxonomy'. Así:

function add_term_meta($term_id, $meta_key, $meta_value, $unique = false) {
    return add_metadata('taxonomy', $term_id, $meta_key, $meta_value, $unique);
}

function delete_term_meta($term_id, $meta_key, $meta_value = '') {
    return delete_metadata('taxonomy', $term_id, $meta_key, $meta_value);
}

function get_term_meta($term_id, $key, $single = false) {
    return get_metadata('taxonomy', $term_id, $key, $single);
}

function update_term_meta($term_id, $meta_key, $meta_value, $prev_value = '') {
    return update_metadata('taxonomy', $term_id, $meta_key, $meta_value, $prev_value);
}

3) Tipo de publicación auxiliar

Como se describe en la respuesta de Matthew Boynes (creo que alguien también menciona esto en el ticket #10142).

4) Fuera de lo convencional

En el código del plugin, hay un enlace al Ticket de Core #10142 que discute todo esto. Es un ticket de 4 años, (cerrado)(quizá más tarde), muchos desarrolladores participaron, pero no se llegó a una conclusión.

Al final, tenemos esta joya (mi énfasis):

paco pepe
Como necesito esto regularmente, he escrito mi propia solución: Utiliza mal el campo "description" como contenedor de almacenamiento para un array serializado. Lo único un poco complicado fue mostrar la descripción plana en la interfaz de administración. De todos modos, esta sería la solución que esperaba: Simplemente convertir el campo de descripción en lugar de añadir un montón de nuevos campos. Si hay una necesidad, veremos los casos de uso después de implementarlo y avanzaremos hacia una solución buscable en una versión posterior.

Bastante ingenioso.

21 oct 2013 23:26:42
2

La mejor respuesta es (3) Alguna otra opción.

Esto es un poco poco convencional, pero escala mejor, aprovecha al máximo el núcleo y no requiere añadir una tabla de base de datos: Añadir un tipo de publicación oculto para la taxonomía. Cada término en la taxonomía obtiene su propia publicación en el tipo de publicación. Con esto implementado, los metadatos del término pueden almacenarse como metadatos de la publicación. Aquí hay un ejemplo de cómo usar este enfoque.

Los principales problemas con cualquier otro enfoque (incluyendo la opción de "usar el campo de descripción del término para guardar datos serializados") son la escalabilidad, el rendimiento y la compatibilidad.

22 oct 2013 00:14:59
Comentarios

Bien recordado, voy a cambiar mi numeración.

brasofilo brasofilo
22 oct 2013 00:21:25

No solo con un tipo de entrada personal oculto. Si un término resulta estar asociado con una sola entrada, ya sea de tipo post o page. Entonces la meta del término puede almacenar el ID de esa entrada y podemos crear muchos campos personalizados para esa entrada que existen para tener una relación con un término en nuestra taxonomía personalizada. Cualquiera que sea tu enfoque, recomiendo encarecidamente crear cierta protección contra la eliminación de términos personalizados si contienen tanta meta información y están vinculados a entradas. Estoy implementando esto ahora en WP e-Customers porque eliminar un término podría causar estragos si la meta del término es necesaria y está en uso.

Ryan Bayne Ryan Bayne
3 feb 2014 01:33:43
0

https://wordpress.org/plugins/taxonomy-metadata/

Puedes personalizarlo a través del plugin mencionado anteriormente.

18 ene 2017 22:01:20