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.

1

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.

Nota: la documentación oficial de WordPress recomienda utilizar 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 );
}
2

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 )