Agrega campos adicionales a tus taxonomías

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.

  1. Crear la taxonomía para un post type existente o custom post type
  2. Agregar el campo a la taxonomía
  3. Guardar los datos
  4. 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' ] )
  );

}

Deja un comentario

Share This