Agregar campo personalizado a la categoría

22

Me gustaría agregar campos personalizados a una determinada categoría. Una categoría solo tiene los siguientes campos:

Nombre:

Babosa:

Padre:

Descripción:

Como tengo un sitio de series de TV, quiero agregar algunos campos más, quiero algo como esto, cuando creo una nueva categoría (Categoría = Serie)

Nombre:

Artista:

Año:

Tipo:

Género:

Resumen:

Babosa:

Padre:

Descripción:

Y así...

Cualquier ayuda por favor? Gracias por adelantado.

Earlee
fuente
Aquí hay una hoja de trucos que uso cuando hago esto. Tiene los ganchos y filtros de acción relevantes en una breve lista. charlestonsw.com/…
Lance Cleveland

Respuestas:

24

Publiqué un How To al respecto hace una semana http://en.bainternet.info/2011/wordpress-category-extra-fields

espero que esto ayude.

Ohad


Aquí están los detalles de la publicación:

Lo primero que debemos hacer es agregar los campos adicionales al formulario de edición de categoría usando el gancho edit_category_form_fields y usamos una función simple que imprimirá los campos adicionales.

<?php
//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');

//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_Image_url"><?php _e('Category Image Url'); ?></label></th>
<td>
<input type="text" name="Cat_meta[img]" id="Cat_meta[img]" size="3" style="width:60%;" value="<?php echo $cat_meta['img'] ? $cat_meta['img'] : ''; ?>"><br />
        <span class="description"><?php _e('Image for category: use full url with '); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra1"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra1]" id="Cat_meta[extra1]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra1'] ? $cat_meta['extra1'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra2"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra2]" id="Cat_meta[extra2]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra2'] ? $cat_meta['extra2'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra3"><?php _e('extra field'); ?></label></th>
<td>
        <textarea name="Cat_meta[extra3]" id="Cat_meta[extra3]" style="width:60%;"><?php echo $cat_meta['extra3'] ? $cat_meta['extra3'] : ''; ?></textarea><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<?php
}

Como puede ver, agregué 4 campos nuevos y todos están en una matriz Cat_meta [clave] porque de esa manera solo creamos en fila en la tabla de opciones para guardar todos los campos adicionales de la categoría en lugar de una fila para cada campo.

A continuación, debemos guardar los campos adicionales en la base de datos una vez que un usuario envía el formulario de edición de categoría y lo hacemos usando "edited_category" con una función que se ejecutará a través de cada uno de los campos enviados y los insertará en la base de datos usando la función update_option , Me gusta esto:

<?php
// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');

// save extra category extra fields callback function
function save_extra_category_fileds( $term_id ) {
    if ( isset( $_POST['Cat_meta'] ) ) {
        $t_id = $term_id;
        $cat_meta = get_option( "category_$t_id");
        $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key){
            if (isset($_POST['Cat_meta'][$key])){
                $cat_meta[$key] = $_POST['Cat_meta'][$key];
            }
        }
        //save the option array
        update_option( "category_$t_id", $cat_meta );
    }
}

En el código anterior, puede ver que todos los campos adicionales que hemos agregado se almacenan en la tabla de opciones de la base de datos con el nombre 'category_ID', donde ID es la identificación de la categoría específica que acabamos de editar y eso significa que podemos llamar a esto datos en nuestros complementos o archivos de tema fácilmente usando la función get_option.

por ejemplo, mi ID de categoría es 25, entonces mi código se verá así

<?php $cat_data = get_option('category_25'); ?>

Como dije al principio, necesito mostrar una imagen diferente para cada categoría, así que en ese caso agregué estas pocas líneas de código a la categoría de mi tema.php justo después del código que muestra el título de la categoría:

<?php
//first get the current category ID
$cat_id = get_query_var('cat');

//then i get the data from the database
$cat_data = get_option("category_$cat_id");

//and then i just display my category image if it exists
if (isset($cat_data['img'])){
    echo '<div class="category_image"><img src="'.$cat_data['img'].'"></div>';
}

Agradable y fácil y todos hemos terminado. El resultado debería ser similar a esto:

ingrese la descripción de la imagen aquí

Bainternet
fuente
44
Por favor, publique el contenido principal de su blog en esta respuesta. La descomposición de enlaces puede ocurrir, incluso en tu propio blog.
Django Reinhardt
1
Esto fue respondido en 2011 amigo :)
Bainternet 01 de
1
¿Tu punto es?
Django Reinhardt
44
Si no cree que esta respuesta tenga algún valor, debería eliminarse ... Sin embargo, esta pregunta tiene más de 16,000 visitas. Creo que la pregunta sigue siendo útil para las personas, a pesar de su edad, y esta respuesta se mejoraría al incluir los detalles del enlace en cuestión.
Django Reinhardt
44
... mientras ustedes estaban ocupados debatiendo (aunque hace un año), me llevó menos de 5 minutos poner todo en la respuesta. Es fácil ...
MxmastaMills
18

A partir de Wordpress 4.4, se han agregado las funciones add_term_meta () , update_term_meta () y get_term_meta () . Esto significa que el código provisto por MxmastaMills se puede actualizar para utilizar un enfoque mucho menos hacky.

Aquí está mi actualización de la misma. Solo hay un campo ya que quería agregar un título personalizado, pero funcionará igual para todos los campos que desea agregar.

function addTitleFieldToCat(){
    $cat_title = get_term_meta($_POST['tag_ID'], '_pagetitle', true);
    ?> 
    <tr class="form-field">
        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Category Page Title'); ?></label></th>
        <td>
        <input type="text" name="cat_title" id="cat_title" value="<?php echo $cat_title ?>"><br />
            <span class="description"><?php _e('Title for the Category '); ?></span>
        </td>
    </tr>
    <?php

}
add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');

function saveCategoryFields() {
    if ( isset( $_POST['cat_title'] ) ) {
        update_term_meta($_POST['tag_ID'], '_pagetitle', $_POST['cat_title']);
    }
}
add_action ( 'edited_category', 'saveCategoryFields');
Luke Simmons
fuente
2
Algunas cosas a tener en cuenta: en el edited_categorygancho, tag_IDestará en la $_POSTmatriz, no en el $_GET. También add_term_metaagregará una nueva entrada en lugar de anular una posible entrada anterior. Usar en su update_term_metalugar.
Martin Dimitrov
@MartinDimitrov ¿Podría arreglar la respuesta de luke-simmons haciendo clic en el botón editar? De esta manera, todos pueden usar el mejor código disponible, incluso aquellos que no codifican muy bien (¡diseñador aquí!). ¡Gracias!
Hugo
1
No guarda los datos en el formulario
Dev
@Dev guarda datos, simplemente no los muestra a menos que cambie $ _POST a $ _GET en la segunda línea.
banesto
3

Este código de trabajo:

add_action ( 'edit_category_form_fields', function( $tag ){
    $cat_title = get_term_meta( $tag->term_id, '_pagetitle', true ); ?>
    <tr class='form-field'>
        <th scope='row'><label for='cat_page_title'><?php _e('Category Page Title'); ?></label></th>
        <td>
            <input type='text' name='cat_title' id='cat_title' value='<?php echo $cat_title ?>'>
            <p class='description'><?php _e('Title for the Category '); ?></p>
        </td>
    </tr> <?php
});
add_action ( 'edited_category', function() {
    if ( isset( $_POST['cat_title'] ) )
        update_term_meta( $_POST['tag_ID'], '_pagetitle', $_POST['cat_title'] );
});
Mario62RUS
fuente
Esto es menos torpe que el otro y lo acabo de verificar con WordPress 5.2.2
nico gawenda
1

Paul Menard proporcionó un ejemplo de cómo crear y usar el término meta en su blog ...
Meta personalizado para nuevas taxonomías en WordPress 3.0 .

No hay ningún ejemplo de creación de la tabla de base de datos o de verificar que los $_POSTvars estén configurados, por lo que deberá hacer esas pequeñas cosas usted mismo, pero parece una base de código decente para construir sobre ... :)

t31os
fuente