¿Cómo deshabilitar completamente una taxonomía en el frontend?
He registrado tres taxonomías personalizadas. Las tres están vinculadas a mi tipo de contenido personalizado.
De las tres taxonomías registradas, hay solo una que no quiero que sea accesible de ninguna manera en el frontend del sitio web.
¿Cuál es la mejor solución para esto?
He estado experimentando con diferentes argumentos al registrar la taxonomía, pero nada parece funcionar.
$args['show_in_nav_menus'] = false;
$args['query_var'] = false;
$args['public'] = false;
¿Debería simplemente conectarme a template_redirect
y hacer una comprobación con is_tax()
? Si es la taxonomía que quiero deshabilitar, ¿simplemente redireccionar al archivo del tipo de contenido personalizado?

La respuesta de s_ha_dum no funcionó para mí, pero esto sí lo hizo:
/**
* Deshabilita completamente los archivos de términos para esta taxonomía.
* @param string $taxonomy Nombre de la taxonomía de WordPress
*/
function kill_taxonomy_archive($taxonomy){
add_action('pre_get_posts', function($qry) use ($taxonomy) {
if (is_admin()) return;
if (is_tax($taxonomy)){
$qry->set_404();
}
}
);
}

+1 — Esta es más la "forma WordPress" que la respuesta aceptada. Idealmente, debería haber un argumento "has_archive", como en los tipos de entrada...

Esto genera un aviso Undefined variable: taxonomy in ... [location]
¿Alguna forma de evitar eso?

Las taxonomías de WordPress ofrecen flexibilidad para establecer sus propiedades durante su registro. Para desactivar los archivos de taxonomía de WordPress, establece "public" como "false" como se muestra en el siguiente código de ejemplo. Esto eliminará el enlace de acción "Ver" de la pantalla de taxonomía y también redirigirá al usuario a la página de inicio del sitio web cuando intente acceder manualmente a la URL de la taxonomía.
Ejemplo
// Registrar Taxonomía Personalizada
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Taxonomías', 'Nombre General de Taxonomía', 'text_domain' ),
'singular_name' => _x( 'Taxonomía', 'Nombre Singular de Taxonomía', 'text_domain' ),
'menu_name' => __( 'Taxonomía', 'text_domain' ),
'all_items' => __( 'Todos los Elementos', 'text_domain' ),
'parent_item' => __( 'Elemento Padre', 'text_domain' ),
'parent_item_colon' => __( 'Elemento Padre:', 'text_domain' ),
'new_item_name' => __( 'Nombre del Nuevo Elemento', 'text_domain' ),
'add_new_item' => __( 'Añadir Nuevo Elemento', 'text_domain' ),
'edit_item' => __( 'Editar Elemento', 'text_domain' ),
'update_item' => __( 'Actualizar Elemento', 'text_domain' ),
'view_item' => __( 'Ver Elemento', 'text_domain' ),
'separate_items_with_commas' => __( 'Separar elementos con comas', 'text_domain' ),
'add_or_remove_items' => __( 'Añadir o eliminar elementos', 'text_domain' ),
'choose_from_most_used' => __( 'Elegir de los más usados', 'text_domain' ),
'popular_items' => __( 'Elementos Populares', 'text_domain' ),
'search_items' => __( 'Buscar Elementos', 'text_domain' ),
'not_found' => __( 'No Encontrado', 'text_domain' ),
'no_terms' => __( 'No hay elementos', 'text_domain' ),
'items_list' => __( 'Lista de Elementos', 'text_domain' ),
'items_list_navigation' => __( 'Navegación de lista de elementos', 'text_domain' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => false, // Establecer como false, lo que eliminará el enlace Ver del backend y redirigirá al usuario a la página de inicio al hacer clic en el enlace de taxonomía.
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
);

Esta es la única respuesta correcta. Para aquellos que quieran filtrar taxonomías existentes, pueden usar el filtro register_taxonomy_args
.

En lugar de public = false, agrega otra variable en el array publicly_queryable = false que no mostrará la opción de vista, public= false eliminará toda la opción del menú en el panel de administración.

No estoy seguro de por qué @chris-herbert lo escribió de esa manera, pero si agregas esto a tu archivo de funciones, esto forzará cualquier navegación hacia ese archivo para que vaya a tu página 404.
add_action('pre_get_posts', 'kill_taxonomy_archive');
function kill_taxonomy_archive($qry) {
if (is_admin()) return;
if (is_tax('tax-slug')){
$qry->set_404();
}
}

Para garantizar que tu taxonomía nunca sea consultada en el front-end, podrías eliminarla de todas las consultas en el front-end.
add_action(
'pre_get_posts',
function($qry) {
if (is_admin()) return;
$kill = 'genero'; // eliminar esta taxonomía
$tax_query = $qry->get('tax_query');
if (empty($tax_query)) return;
$relation = false;
if (isset($tax_query['relation'])) {
$relation = $tax_query['relation'];
unset($tax_query['relation']);
}
foreach ($tax_query as $k => &$tax) {
if (isset($tax['taxonomy']) && 'genero' === $tax['taxonomy']) {
unset($tax_query[$k]);
}
}
if (1 < count($tax_query)) {
$tax_query['relation'] = $relation;
}
$qry->set('tax_query',$tax_query);
}
);
Usar una clausura debería hacer que el callback sea difícil de eliminar.
También podrías implementar la redirección como especulaste, pero hacerlo no evitaría que consultas secundarias en plantillas de página o widgets recuperen la taxonomía o podría causar problemas si intentas redirigir tarde en la carga de la página.

Voté en contra para desalentar el uso de esta técnica poco elegante. Mira la respuesta de @chris-herbert más abajo, que está más alineada con el pensamiento de WP (aunque todavía no es ideal, pero es culpa de WP).
