Tengo dos tipos de publicaciones personalizadas 'país' y 'ciudad' y una taxonomía compartida 'bandera'.
Si yo uso:
<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');
Obtengo una lista de todos los términos en la taxonomía, pero quiero limitar la lista al tipo de publicación 'país'.
¿Cómo puedo hacerlo?
Usando la nueva solución
<?php
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
$childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($childTerms as $childTerm) {
echo $childTerm->name.'<br />';
}
}
?>
No puedo hacer eco de $ childTerm-> name. ¿Por qué?
custom-post-types
taxonomy
terms
usuario1443216
fuente
fuente
Respuestas:
Me temo que esto no es posible de forma nativa (¿todavía?). Vea este seguimiento: http://core.trac.wordpress.org/ticket/18106
Del mismo modo, en la página de administración de taxonomía, el recuento de publicaciones refleja todos los tipos de publicaciones. (
Estoy bastante seguro de que también hay un ticket de trac para eso) http://core.trac.wordpress.org/ticket/14084Vea también esta publicación relacionada .
Nueva solución
Habiendo escrito el siguiente, he lanzado una forma mucho mejor (en el sentido de que puedes hacer más) es usar los filtros provistos en la
get_terms()
llamada. Puede crear una función de contenedor que useget_terms
y (condicionalmente) agregue un filtro para manipular la consulta SQL (para restringir por tipo de publicación).La función toma los mismos argumentos que
get_terms($taxonomies, $args)
.$args
toma el argumento adicional delpost_types
cual toma una matriz | cadena de tipos de publicación.Pero no puedo garantizar que todo funcione 'como se esperaba' (estoy pensando en completar el recuento). Parece funcionar usando solo el predeterminado
$args
paraget_terms
.Uso
Solución original
Inspirado en el boleto de trac anterior, (probado, y funciona para mí)
Uso
o
fuente
$args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);
. Editaré esto para permitir cadenas de consulta ...$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
:?wpse57444_get_terms()
$args
es el segundo argumento. Ahí acabas de ponerwpse57444_get_terms( 'flag', array( 'country', 'city' ) );
La respuesta anterior de @ stephen-harris solo funcionó para mí parcialmente. Si intenté usarlo dos veces en la página, no funcionó. Además, la idea de enterrar consultas mysql como esa me preocupa: creo que es una mejor práctica usar métodos básicos para lograr una solución, para evitar conflictos con futuras actualizaciones de WP. Aquí está mi solución, basada en algún comentario # 7 sobre el boleto de Trac al que hace referencia
Uso:
Esto funciona solo para un tipo de publicación y una taxonomía, porque eso es lo que necesitaba, pero no sería demasiado difícil modificar esto para aceptar múltiples valores.
Hubo alguna mención en ese hilo de Trac de que esto puede no escalar bien, pero estoy trabajando en una escala bastante pequeña y no he tenido problemas con la velocidad.
fuente
Dos tipos de publicaciones personalizadas 'país' y 'ciudad' y una taxonomía compartida 'bandera'. Desea limitar la lista al tipo de publicación 'país'.
Aquí hay una solución más simple:
fuente
[editar] Este es un comentario sobre la excelente respuesta de Stephen Harris.
No devuelve ningún término si se usa con múltiples tipos de publicaciones como esta
$flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));
. Esto se debe a que $ wpdb-> prepare desinfecta la cadena $ post_types_strp.post_type IN('country,city')
mientras debería estarp.post_type IN('country','city')
. Ver este boleto: 11102 . Use la solución de este tema para solucionar esto: /programming//a/10634225fuente
También intenté usar la respuesta de @Stephen Harris, pero la consulta que necesitaba era bastante difícil de escribir como una sola consulta y usando las piezas de filtro.
Además, también necesitaba usar esa función varias veces en la misma página y resolví el problema declarando el
wpse_filter_terms_by_cpt
función fuera de la función de contenedor.De todos modos, la respuesta de @Mark Pruce en mi opinión encaja mejor, por las mismas razones que dijo, a pesar de que necesita que haga una consulta más (y el bucle relacionado) para preparar los argumentos para la
wp_get_object_terms
función.fuente