Esto constara de 4 partes muy importantes sin embargo, sí ya cuentas con la taxonomía a la cual le deseas agregar el campo adicional, puedes saltarte el paso 1.
- Crear la taxonomía para un post type existente o custom post type
- Agregar el campo a la taxonomía
- Guardar los datos
- Editar los datos
Crear la taxonomía para un post type existente o custom post type
Para esta parte lo hare sencillo, voy a crear una taxonomía de lenguajes de programación y se llamara lenguaje. Si quieres hacerlo mas sencillo puedes ir a https://www.wp-hasty.com/tools/wordpress-taxonomy-generator/ y crear una taxonomía llenando los campos que ahí se encuentran.
Recuerda que este bloque va en tu archivo de functions.php
function create_lenguaje_tax() {
$labels = array(
'name' => _x( 'lenguajes', 'taxonomy general name', 'textdomain' ), //Nombre plural
'singular_name' => _x( 'lenguaje', 'taxonomy singular name', 'textdomain' ), //Nombre singular
'search_items' => __( 'Buscar lenguajes', 'textdomain' ), // Titulo para buscar
'all_items' => __( 'Todos los lenguajes', 'textdomain' ), //Titulo para mostrar todos los elementos
'parent_item' => __( 'Parent lenguaje', 'textdomain' ), //Titulo para elemento parent
'parent_item_colon' => __( 'Parent lenguaje:', 'textdomain' ), //Titulo para elemento parent
'edit_item' => __( 'Editarlenguaje', 'textdomain' ), //Titulo para editar elemento
'update_item' => __( 'Actualizar lenguaje', 'textdomain' ), //Titulo para editar elemento
'add_new_item' => __( 'Agregar nuevo lenguaje', 'textdomain' ), //Titulo para agregar un elemento
'new_item_name' => __( 'Nuevo nombre de lenguaje ', 'textdomain' ), //Titulo para agregar un elemento
'menu_name' => __( 'lenguaje', 'textdomain' ),
);
$args = array(
'labels' => $labels,
'description' => __( '', 'textdomain' ),
'hierarchical' => true,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
'show_in_quick_edit' => true,
'show_admin_column' => false,
'show_in_rest' => true,
);
register_taxonomy( 'lenguaje', array('post'), $args );
}
add_action( 'init', 'create_lenguaje_tax' );
Agregar el campo a la taxonomía
Recuerda que este bloque va en tu archivo de functions.php
<?php
// Agregamos nuestro add_action diciéndole que se ejecutara en el hook de lenguaje_add_form_fields
// Para armar tu estructura del hook debes remplazar lenguaje por el slug de tu taxonomía {taxonomia}_add_form_fields
// Después el nombre de la función que vamos a ejecutar
add_action( 'lenguaje_add_form_fields', 'marcode_add_term_fields' );
// Ahora creamos nuestra función recibiendo como dato la variable $taxonomy
function marcode_add_term_fields( $taxonomy ) {
//En este punto cerré php para poder escribir el HTML de manera mas practica.
//Creamos nuestro campo de dato en este caso yo creare un select.
//No olvides asignarle un name y id
?>
<div class="form-field">
<label for="marcode-select">Selecciona el lenguaje</label>
<select name="marcode-select" id="marcode-select">
<option value="">Elige un lenguaje</option>
<option value="csharp">C#</option>
<option value="php">PHP</option>
<option value="java">Java</option>
<option value="c++">C++</option>
</select>
</div>';
<?php
}
Editar los datos
Recuerda que este bloque va en tu archivo de functions.php
<?php
// Agregamos nuestro add_action diciéndole que se ejecutara en el hook de lenguaje_edit_form_fields
// Para armar tu estructura del hook debes remplazar lenguaje por el slug de tu taxonomía {taxonomía}_edit_form_fields
// Después el nombre de la función que vamos a ejecutar
// También debe incluir la prioridad por default es 10
// Y finalmente la cantidad de argumentos que permitirá la funcion
add_action( 'lenguaje_edit_form_fields', 'marcode_edit_term_fields', 10, 2 );
// Creamos la función y recibimos los dos datos $term y $taxonomy
function marcode_edit_term_fields( $term, $taxonomy ) {
// Obtenemos el valor del meta dato 'marcode-select y lo almacenamos en $value
$value = get_term_meta( $term->term_id, 'marcode-select', true );
// En este punto cerré php para poder escribir el HTML de manera mas practica.
// Creamos una estructura tipo tabla para inyectarla al final de los campos ya existentes del termino de la taxonomía
// Comparamos el valor de $value con el valor de nuestra opciones para así asignarle un 'selected' y aparezca seleccionado
?>
<tr class="form-field">
<th>
<label for="marcode-select">Selecciona el lenguaje </label>
</th>
<td>
<select name="marcode-select" id="marcode-select">
<option value="">Elige un lenguaje</option>
<option value="csharp" <?php if($value =='csharp'){echo 'selected';} ?> >C#</option>
<option value="php" <?php if($value =='php'){echo 'selected';} ?>>PHP</option>
<option value="java" <?php if($value =='java'){echo 'selected';} ?>>Java</option>
<option value="c++" <?php if($value =='c++'){echo 'selected';} ?>>C++</option>
</select>
</td>
</tr>
<?php
}
Guardar los datos
Recuerda que este bloque va en tu archivo de functions.php
// Aquí creamos nuestros 2 acciones (crear y editar) para no complicarnos la existencia
// La estructura de nuestros hooks tiene la misma lógica que el anterior
// Tu estructura del hook seria created_{taxonomia} y edited_{taxonomia}
// Posteriormente el nombre de la funcion que ejecutaremos
add_action( 'created_lenguaje', 'marcode_save_term_fields' );
add_action( 'edited_lenguaje', 'marcode_save_term_fields' );
// Creamos la funcion recibiendo como dato el $term_id
function marcode_save_term_fields( $term_id ) {
//Utilizaremos la funcion update_term_meta() que recibe 3 datos
// $term_id -> El id de nuestro termino
// marcode-select ->Metadata key
//sanitize_text_field( $_POST[ 'marcode-select' ] ) -> Metadata value ya sanitizado
update_term_meta(
$term_id,
'marcode-select',
sanitize_text_field( $_POST[ 'marcode-select' ] )
);
}