Obtener todos los tipos de posts y taxonomías existentes WordPress
No se si alguna vez habéis necesitado conocer todos los typos de posts y taxonomías que existan en WordPress en un momento dado, tanto los registrados por algún plugin como por el tema activo o los que vienen ya con WordPress. Yo me he encontrado con una situación parecida, pues quería añadir un meta box a cualquier tipo de post. No realmente a cualquier tipo, por ejemplo no quería hacerlo para el tipo de post page
, pero sí para el resto.
Buscando en la documentación de WordPress me topé con dos funciones, get_post_types() y get_taxonomies(). La primera la podía utilizar para obtener todos los tipos de posts y aplicarle algunos filtros, con lo que ya tenía la solución. La segunda hace algo similar pero con las taxonomías. Veamos cómo se utilizan estas dos funciones.
get_post_types()
Con esta función, como su nombre indica, vamos a obtener todos los post types que han sido registrados en WordPress.
Sintaxis
get_post_types( $args, $output, $operator )
Parámetros
$args
Es un array de argumentos que han de cumplir los tipos de posts a buscar. Es opcional, por defecto un array vacío, y se puede utilizar cualquiera de los argumentos admitidos por register_post_type.
$output
Puede ser el string "names"
(valor por defecto) u "objects"
. Si es «names» se obtiene un arrary indexado con los nombres de cada tipo de post y si es «objects» se obtiene un array de objetos representado cada tipo de post.
$operator
Puede ser "and"
u "or"
. Será el operador utilizado para comparar los argumentos establecidos en $args
.
register_post_type
en el action hook init
. En consecuencia, get_post_types()
necesita ejecutarse en un evento posterior o, a lo sumo, en init
con una prioridad muy alta, para asegurarnos que cualquier plugin que registre algún tipo de post ya lo haya hecho. Lo mismo ocurre con las taxonomías y get_taxonomies()
.Ejemplo
Añadir un meta box a todos los tipos de posts que tengan activada la interfaz de usuario (la pantalla de edición en wp-admin), es decir, los que se registraron con el parámetro "show_ui" => true
:
$args = array(
"show_ui" => true
);
//$post_types será un array con los nombres de los tipos de posts
$post_types = get_post_types( $args );
foreach($post_types as $type) {
//Para cada $post, añadir el metabox
add_meta_box( 'cyb-meta-box', __('Mi Meta Box'), 'cyb_meta_box_callback', $type );
}
Si lo hubiésemos hecho con objetos:
$args = array(
"show_ui" => true
);
//$post_types será un array con los nombres de los tipos de posts
$post_types = get_post_types( $args, 'objects' );
foreach($post_types as $type) {
//Para cada $post, añadir el metabox
add_meta_box( 'cyb-meta-box', __('Mi Meta Box'), 'cyb_meta_box_callback', $type->name );
}
get_taxonomies()
De forma análoga, get_taxonomies()
se utiliza para obtener las taxonomías. Su uso es prácticamente igual, salvo que los argumentos admitidos en $args
, en lugar de ser los mismos que admite register_post_type()
, son los mismos que acepta register_taxonomy().
Sintaxis:
get_taxonomies( $args, $output, $operator )
Parámetros
$args
Array de argumentos que han de cumplir las taxonomías a buscar. Es opcional, por defecto un array vacío, y se puede utilizar cualquiera de los argumentos admitidos por register_taxonomy().
$output
Puede ser "names"
u "objects"
.
$operator
Puede ser "and"
u "or"
. Utilizado para comparar los argumentos establecidos en$args
.
Ejemplo
Obtener los names
de todas las taxonomías registradas para el tipo de post personalizado noticia
y que sean hereditarias:
$args = array(
'object_type' => array( 'noticia' ),
'hierarchical' => true
);
//$taxonomies será un array con los nombres de las taxonomías encontradas
$taxonomies = get_taxonomies( $args )