¿Cómo puedo obtener solo los términos padre?
¿Existe alguna manera de obtener solo los términos padre de una taxonomía personalizada o categoría?

Sí, simplemente pasa el parámetro parent a get_terms
cuando lo llames, como mencionó Michael.
Desde WordPress 4.5 este es el uso recomendado:
$myterms = get_terms( array( 'taxonomy' => 'taxonomy_name', 'parent' => 0 ) );
Antes de WP 4.5 este era el uso predeterminado:
$myterms = get_terms( 'taxonomy_name_here', array( 'parent' => 0 ) );
Devolverá todos los términos que tengan un valor parent de 0
, es decir, términos de nivel superior.

¿Los términos en esa taxonomía están asociados con un post (o tipo personalizado)? Si no es así, necesitarás pasar el parámetro hide_empty
, configurándolo también a 0
, para que puedas ver términos que actualmente no están en uso.

Ten en cuenta que esto solo obtendrá el nivel padre 1, el término "madre". Para recuperar todos los ancestros, usa get_ancestors(TERM_ID, TAXONOMY, 'taxonomy')
https://developer.wordpress.org/reference/functions/get_ancestors/

usa el parámetro 'parent':
http://codex.wordpress.org/Function_Reference/get_terms
o
http://codex.wordpress.org/Function_Reference/get_categories

para plantillas de correo electrónico de WooCommerce utiliza lo siguiente:
$terms = get_the_terms( $_product->id , 'product_cat');
if($terms) {
foreach( $terms as $term ) {
$term = get_term_by("id", $term->parent, "product_cat");
if ($term->parent > 0) {
$term = get_term_by("id", $term->parent, "product_cat");
}
$cat_obj = get_term($term->term_id, 'product_cat');
$cat_name = $cat_obj->name;
}
}
echo '<br />('. $cat_name . ')';

¿En qué se diferencia esto de la respuesta (ya aceptada) propuesta hace más de dos años?

¿viste los comentarios en la respuesta (ya aceptada)? si no hay más respuestas útiles ¿por qué la pregunta sigue abierta?

Había una única consulta sobre términos que no aparecían, que no estaba relacionada con la pregunta original. Abordé ese problema en un comentario de respuesta (ya que no tenía relación con la validez o corrección de la respuesta ya proporcionada).

Para esta demostración, asumiremos que tenemos una taxonomía llamada "Libros". Y podríamos tener una jerarquía como:
Ficción (id: 699)
- Esta es una Historia de Ficción.
No Ficción
- Título de No Ficción
Fantasía
- ...
Queremos obtener el término padre de la taxonomía "Libros" del post actual.
/* Obtener el Nombre del Término Padre de la Taxonomía por ID del post */
function get_parent_term_by_post_id($taxname, $taxid=null){
if(isset($taxid)):
//Obtener por ID de término pasado en la función
$parent_tax = get_term_by('id', $taxid, $taxname);
return $parent_tax ->name; //usar name, slug o id
else:
//Obtener por PostId de la página actual
$terms = wp_get_post_terms( get_the_id(), $taxname);
$tax_parent_id = $terms[0]->parent;
if($tax_parent_id == 0):
$tax_parent_id = $terms[0]->parent; //obtener el siguiente ID padre
endif;
$parent_tax = get_term_by('id', $tax_parent_id , $taxname);
return $parent_tax ->name; //usar name, slug o id
endif;
}
Luego simplemente lo ejecutas en tu plantilla así:
//ingresar nombre de taxonomía personalizada. Obtendrá por ID de post
echo get_parent_term_name_by_post_id('libros'); //retorna Ficción
o
//por ID de término
echo get_parent_term_name_by_post_id('libros', 699); //retorna Ficción
