php - register - Muestra la taxonomía personalizada de publicaciones actuales en WordPress
wordpress custom post type generator plugin (2)
Cómo mostrar las taxonomías y términos actuales de publicaciones
Aquí hay un código modificado del Codex (ver el enlace a continuación) que mostrará todas las taxonomías de la publicación actual con los términos adjuntos:
<?php
// get taxonomies terms links
function custom_taxonomies_terms_links() {
global $post, $post_id;
// get post by post id
$post = &get_post($post->ID);
// get post type by post
$post_type = $post->post_type;
// get post type taxonomies
$taxonomies = get_object_taxonomies($post_type);
$out = "<ul>";
foreach ($taxonomies as $taxonomy) {
$out .= "<li>".$taxonomy.": ";
// get the terms related to post
$terms = get_the_terms( $post->ID, $taxonomy );
if ( !empty( $terms ) ) {
foreach ( $terms as $term )
$out .= ''<a href="'' .get_term_link($term->slug, $taxonomy) .''">''.$term->name.''</a> '';
}
$out .= "</li>";
}
$out .= "</ul>";
return $out;
} ?>
Esto se usa así:
<?php echo custom_taxonomies_terms_links();?>
Salida de demostración
El resultado puede verse así si la publicación actual tiene las taxonomías country
y city
:
<ul>
<li> country:
<a href="http://example.com/country/denmark/">Denmark</a>
<a href="http://example.com/country/russia/">Russia</a>
</li>
<li> city:
<a href="http://example.com/city/copenhagen/">Copenhagen</a>
<a href="http://example.com/city/moscow/">Moscow</a>
</li>
</ul>
Referencia
El ejemplo del código original en el Codex:
http://codex.wordpress.org/Function_Reference/get_the_terms#Get_terms_for_all_custom_taxonomies
Espero que esto ayude, estoy seguro de que puedes adaptar esto a tu proyecto ;-)
Actualizar
Pero, ¿y si quiero mostrar solo algunos de ellos y no todos? Además, me gustaría nombrarlos yo mismo en lugar de dar nombres de taxonomía con guiones bajos. ¿Alguna idea de cómo puedo lograr eso?
Aquí hay una modificación para lograr eso:
function custom_taxonomies_terms_links() {
global $post;
// some custom taxonomies:
$taxonomies = array(
"country"=>"My Countries: ",
"city"=>"My cities: "
);
$out = "<ul>";
foreach ($taxonomies as $tax => $taxname) {
$out .= "<li>";
$out .= $taxname;
// get the terms related to post
$terms = get_the_terms( $post->ID, $tax );
if ( !empty( $terms ) ) {
foreach ( $terms as $term )
$out .= ''<a href="'' .get_term_link($term->slug, $tax) .''">''.$term->name.''</a> '';
}
$out .= "</li>";
}
$out .= "</ul>";
return $out;
}
Creé taxonomías personalizadas en WordPress y quiero mostrar las taxonomías de publicaciones actuales en la publicación en una lista.
Estoy usando el siguiente código para mostrar una taxonomía personalizada llamada "Disciplina de trabajo":
<ul>
<?php $args = array(''taxonomy'' => ''job_discipline''); ?>
<?php $tax_menu_items = get_categories( $args );
foreach ( $tax_menu_items as $tax_menu_item ):?>
<li>
Job Discipline: <a href="<?php echo get_term_link($tax_menu_item,$tax_menu_item->taxonomy); ?>">
<?php echo $tax_menu_item->name; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
Esa es solo una de las muchas taxonomías que quiero enumerar.
El problema es que el código anterior muestra todas las "Disciplinas de trabajo" que tienen al menos una publicación y no la taxonomía de publicación actual.
¿Cómo puedo resolver este problema?
Solo en caso de que alguien quiera mostrarlos agrupados por padre.
Básicamente es la misma respuesta que arriba. Utilicé este formulario de respuesta en otra publicación: https://.com/a/12144671 para agruparlos (por nombre y por padre).
Función modificada para usarlo con objetos:
function object_group_assoc($array, $key) {
$return = array();
foreach($array as $object) {
$return[$object->$key][] = $object;
}
return $return;
}
Función final:
// get taxonomies terms links
function custom_taxonomies_terms_links() {
global $post, $post_id;
// get post by post id
$post = &get_post($post->ID);
// get post type by post
$post_type = $post->post_type;
// get post type taxonomies
$taxonomies = get_object_taxonomies($post_type);
$out = "<ul>";
foreach ($taxonomies as $taxonomy) {
$out .= "<li>".$taxonomy.": ";
// get the terms related to post
$terms = get_the_terms( $post->ID, $taxonomy );
if ( !empty( $terms ) ) {
$terms_by_id = object_group_assoc($terms, ''term_id'');
$terms_by_parent = object_group_assoc($terms, ''parent'');
krsort($terms_by_parent);
foreach ( $terms_by_parent as $parent_id => $children_terms ){
if($parent_id != 0){//Childs
//Add parent to out string
$parent_term = $terms_by_id[$parent_id][0]; //[0] because object_group_assoc return each element in an array
$out .= ''<li><a href="'' .get_term_link($parent_term->slug, $taxonomy) .''">''.$parent_term->name.''</a>'';
//Add children to out string
$out .= ''<ul>'';
foreach ($children_terms as $child_term) {
$out .= ''<li><a href="'' .get_term_link($child_term->slug, $taxonomy) .''">''.$child_term->name.''</a></li>'';
}
$out .= ''</ul></li>'';
} else {//parent_id == 0
foreach ($children_terms as $child_term) {
if(!array_key_exists($child_term->term_id, $terms_by_parent)){//Not displayed yet becouse it doesn''t has children
$out .= ''<li><a href="'' .get_term_link($child_term->slug, $taxonomy) .''">''.$child_term->name.''</a></li>'';
}
}
$out .= ''</ul></li>'';
}
}
}
$out .= "</li>";
}
$out .= "</ul>";
return $out;
}
Usado de la misma manera:
<?php echo custom_taxonomies_terms_links();?>
Nota: simplemente trabajando con términos de un nivel para niños.