El otro día necesitaba relacionar cada categoría de un blog con una página concreta de la web. Pensé que sería muy cómodo si la propia categoría ya me diese por ejemplo la id de su página relacionada. Con esto en mente enseguida me pregunté cómo añadir campos personalizados a las categorías.
Lo hago en 3 sencillos pasos:
El primero es tener a mano esta pequeña función que me facilita mucho la vida cuando tengo que hacer algún select de las páginas que tengo en la web.
function paginas()
{
$paginas = array( '' => ' - Selecciona una página - ' );
foreach ( get_pages() as $p )
{
$paginas[ $p->ID ] = $p->post_title;
}
return $paginas;
}
Después de buscar un poco localicé el código que necesitaba para añadir campos personalizados a las categorías. Me puse a toquetearlo para ajustarlo a lo que me pedía el proyecto y acabé con esto:
// Añadir campos a una categoria
function custom_category_fields($term) {
$paginas = paginas();
// Primero comprobamos el filtro para saber si estamos creando o editando.
// Si estamos trabajando con taxonomías,
// reemplazamos "category" por el nombre de la taxonomía.
// ej: opinion_add_form_fields, opinion_edit_form_fields
if (current_filter() == 'category_edit_form_fields') {
$pagina = get_term_meta($term->term_id, 'pagina', true);
?>
<tr class="form-field">
<th valign="top" scope="row"><label for="term_fields[pagina]"><?php _e('Página'); ?></label></th>
<td>
<select name="term_fields[pagina]" id="term_fields[pagina]">
<?php foreach( $paginas as $page_id => $page ): ?>
<option value="<?php echo $page_id; ?>" <?php if($page_id == $pagina) echo "selected"; ?>><?php echo $page; ?></option>
<?php endforeach;?>
</select>
<span class="description"><?php _e('Selecciona la página'); ?></span>
</td>
</tr>
<?php } elseif (current_filter() == 'category_add_form_fields') {
?>
<div class="form-field">
<label for="term_fields[pagina]"><?php _e('Página'); ?></label>
<select name="term_fields[pagina]" id="term_fields[pagina]">
<?php foreach( $paginas as $page_id => $page ): ?>
<option value="<?php echo $page_id; ?>" <?php if($page_id == $pagina) echo "selected"; ?>><?php echo $page; ?></option>
<?php endforeach;?>
</select>
<p class="description"><?php _e('Selecciona la página'); ?></p>
</div>
<?php
}
}
// Añadimos el/los campos con nuestra función callback
// Igual que antes, si estamos trabajando con taxonomías
// reemplazamos "category" por el nombre de la taxonomía.
// ej: opinion_add_form_fields, opinion_edit_form_fields
add_action('category_add_form_fields', 'custom_category_fields', 10, 2);
add_action('category_edit_form_fields', 'custom_category_fields', 10, 2);
function custom_save_category_fields($term_id) {
if (!isset($_POST['term_fields'])) {
return;
}
foreach ($_POST['term_fields'] as $key => $value) {
update_term_meta($term_id, $key, $value);
}
}
// Guardamos los valores de los campos, con nuestra función callback
// De nuevo, si estamos trabajando con taxonomías ...
add_action('edited_category', 'custom_save_category_fields', 10, 2);
add_action('create_category', 'custom_save_category_fields', 10, 2);
Atención a la parte del select:
<select name="term_fields[pagina]" id="term_fields[pagina]">
Aquí se define el campo o campos que quiero añadir a la categoría. Se hace dos veces, una va en una estructura de tabla, la otra en una estructura de div. Una es para cuando se crea la categoría, la otra para cuando se edita.
En lugar de un select podría ser un <input type=»text» o un <input type=»checkbox» según lo que necesite el proyecto.
Por último sólo queda recuperar el dato en cuestión para trabajar con él. En mi caso con estas 2 líneas lo consigo:
$term_id = get_queried_object()->term_id;
$pagina = get_term_meta($term_id, 'pagina', true);
La primera extrae la id de la categoría para pasarla a la segunda, donde recupero el valor del campo personalizado y a partir de ahí puedo trabajar con él.
Y como es de bien nacido ser agradecido dejo aquí la referencia donde encontré el código inicial para llegar a esta solución:
https://wpcrumbs.com/how-to-add-custom-fields-to-categories/
eduardo
maestro, modificas todo esto en el functions.php??
explicas muy bien pero no decis donde meter el codigo este.
JSoleguia
¡Buenas, Eduardo!
Esto se suele modificar en el archivo functions.php, efectivamente.
Aunque si quieres tener las cosas un poco organizadas puedes ponerlo en un archivo .php aparte y desde functions.php hacer un require_once() a ese archivo.
Yo suelo crear una carpeta inc/ y meto dentro estos archivos con funcionalidades, por ejemplo podrías hacer algo como:
themes/
> tu-theme/
>> functions.php => aquí pones un require_once(‘inc/category_functions.php’);
>> inc/category_functions.php => aquí metes el código
Espero que te sea útil.
Un saludo.