Tengo 2 tipos de publicaciones personalizadas 'marcadores' y 'fragmentos' y una etiqueta de taxonomía compartida. Puedo generar una lista de todos los términos en la taxonomía con get_terms (), pero no puedo entender cómo limitar la lista al tipo de publicación. Lo que básicamente estoy buscando es algo como esto:
get_terms(array('taxonomy' => 'tag', 'post_type' => 'snippet'));
¿Hay una manera de lograr esto? ¡Las ideas son muy apreciadas!
Oh, estoy en WP 3.1.1
custom-post-types
custom-taxonomy
terms
Gavin Hewitt
fuente
fuente
print_r(get_terms_by_post_type(array('category') , array('event') ));
espectáculosWarning: Missing argument 2 for wpdb::prepare()
Entonces sucede que necesitaba algo así para un proyecto en el que estoy trabajando. Simplemente escribí una consulta para seleccionar todas las publicaciones de un tipo personalizado, luego verifiqué cuáles son los términos reales de mi taxonomía que están utilizando.
Luego obtuve todos los términos de esa taxonomía usando
get_terms()
y luego solo usé los que estaban en ambas listas, lo envolví en una función y terminé.Pero luego necesitaba más que solo los ID: necesitaba los nombres, así que agregué un nuevo argumento llamado
$fields
para poder decirle a la función qué devolver. Luego supuse queget_terms
acepta muchos argumentos y mi función se limitó a términos simples que están siendo utilizados por un tipo de publicación, así que agregué unaif
declaración más y listo:La función:
Uso:
Si solo necesita una lista de ID de términos, entonces:
Si solo necesita una lista de nombres de términos, entonces:
Si solo necesita una lista de objetos de términos, entonces:
Y si necesita usar argumentos adicionales de get_terms como: orderby, order, jerárquico ...
¡Disfrutar!
Actualizar:
Para arreglar el recuento de términos al cambio de tipo de publicación específico:
a:
fuente
(array) $args
lugar de una lista de 4 $ vars? Esto le permitiría no preocuparse por el orden en que arroja los argumentos, por lo que algo así comoget_terms_by_post_type( $args = array( 'taxonomies', 'args', 'post_type', 'fields' => 'all') )
y luego llamarlos dentro de la función con$args['taxonomies']
. Esto lo ayudaría a evitar agregar valores vacíos y tener que recordar el orden de sus argumentos. También sugeriría usar comillas simples en lugar de dobles. Los vi sonar hasta cinco veces más rápido.'this is my mood: '.$value
sobre"this is my mood: $value"
, debido a la legibilidad. Cuando se trata de velocidad: no es un poco, lo medí hasta cinco veces. Y cuando usa comillas dobles en todo su tema en todas partes, se resumirán rápidamente cuando reciba muchas solicitudes. De todos modos, lo dejaste claro."
vs.'
y me equivoqué. La diferencia está muy lejos de todo lo que cualquiera notaría.Escribí una función que le permite pasar
post_type
la$args
matriz a laget_terms()
función:HT a @braydon por escribir el SQL.
fuente
Gran pregunta y respuestas sólidas.
Realmente me gustó el enfoque de @jessica usando el filtro terms_clauses, porque extiende la función get_terms de una manera muy razonable.
Mi código es una continuación de su idea, con algunos sql de @braydon para reducir duplicados. También permite una variedad de post_types:
Debido a que get_terms no tiene una cláusula para GROUPY BY, tuve que agregarla al final de la cláusula WHERE. Tenga en cuenta que tengo la prioridad del filtro establecida muy alta, con la esperanza de que siempre sea la última.
fuente
No pude hacer que los argumentos get_terms funcionen con la versión de Gavin del código anterior, pero finalmente lo hice cambiando
a
como estaba en la función original de Bainternet.
fuente
@Bainternet: ¡Gracias! Tuve que modificar ligeramente la función porque no funcionaba (algunos errores tipográficos). El único problema ahora es que el término cuenta está desactivado. El recuento no tiene en cuenta el tipo de publicación, por lo que no creo que pueda usar get_terms () en esto.
EDITAR: Se agregaron las correcciones. Pero de alguna manera todavía no funciona para mí. El recuento aún muestra el valor incorrecto.
fuente
print_r(get_terms_by_post_typea(array('event','category','',array()));
este daWarning: Invalid argument supplied for foreach()
para la líneaforeach ($current_terms as $t){
Evitar duplicados:
fuente