Come disabilitare completamente una tassonomia nella parte frontale del sito?
Ho registrato tre tassonomie personalizzate. Tutte e tre queste tassonomie personalizzate sono collegate al mio custom post type.
C'è solo una tassonomia delle tre registrate che vorrei non fosse assolutamente accessibile nella parte frontale del sito web.
Qual è la soluzione migliore per questo?
Ho provato a specificare diversi argomenti durante la registrazione della tassonomia, ma niente sembra funzionare.
$args['show_in_nav_menus'] = false;
$args['query_var'] = false;
$args['public'] = false;
Dovrei semplicemente agganciarmi a template_redirect
e fare un controllo con is_tax()
? Se è la tassonomia che voglio disabilitare, reindirizzare semplicemente all'archivio del custom post type?

La risposta di s_ha_dum non ha funzionato per me, ma questo sì:
/**
* Disabilita completamente gli archivi dei termini per questa tassonomia.
* @param string $taxonomy Nome della tassonomia 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 — Questo è più nello "stile Wordpress" rispetto alla risposta accettata. Idealmente, dovrebbe esserci un argomento "has_archive", come per i post type...

Questo genera un avviso Undefined variable: taxonomy in ... [location]
C'è un modo per evitarlo?

La tassonomia di WordPress offre flessibilità nell'impostare le sue proprietà durante la registrazione. Per disabilitare gli archivi delle tassonomie in WordPress, imposta "public" come "false" come mostrato nel codice di esempio qui sotto. Ciò rimuoverà il link azione "Visualizza" dalla schermata della tassonomia e reindirizzerà l'utente alla homepage del sito quando tenterà di accedere manualmente all'URL della tassonomia.
Esempio
// Registra una Tassonomia Personalizzata
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Tassonomie', 'Nome Generico Tassonomia', 'text_domain' ),
'singular_name' => _x( 'Tassonomia', 'Nome Singolare Tassonomia', 'text_domain' ),
'menu_name' => __( 'Tassonomia', 'text_domain' ),
'all_items' => __( 'Tutti gli Elementi', 'text_domain' ),
'parent_item' => __( 'Elemento Genitore', 'text_domain' ),
'parent_item_colon' => __( 'Elemento Genitore:', 'text_domain' ),
'new_item_name' => __( 'Nome Nuovo Elemento', 'text_domain' ),
'add_new_item' => __( 'Aggiungi Nuovo Elemento', 'text_domain' ),
'edit_item' => __( 'Modifica Elemento', 'text_domain' ),
'update_item' => __( 'Aggiorna Elemento', 'text_domain' ),
'view_item' => __( 'Visualizza Elemento', 'text_domain' ),
'separate_items_with_commas' => __( 'Separa gli elementi con virgole', 'text_domain' ),
'add_or_remove_items' => __( 'Aggiungi o rimuovi elementi', 'text_domain' ),
'choose_from_most_used' => __( 'Scegli tra i più utilizzati', 'text_domain' ),
'popular_items' => __( 'Elementi Popolari', 'text_domain' ),
'search_items' => __( 'Cerca Elementi', 'text_domain' ),
'not_found' => __( 'Non Trovato', 'text_domain' ),
'no_terms' => __( 'Nessun elemento', 'text_domain' ),
'items_list' => __( 'Lista Elementi', 'text_domain' ),
'items_list_navigation' => __( 'Navigazione Lista Elementi', 'text_domain' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => false, // Impostalo a false per rimuovere il link Visualizza dal backend e reindirizzare alla homepage
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
);

Questa è l'unica risposta corretta. Per chi volesse filtrare le tassonomie esistenti, può utilizzare il filtro register_taxonomy_args
.

Invece di public = false, aggiungi un'altra variabile nell'array publicly_queryable = false che non mostrerà l'opzione di visualizzazione, public= false rimuoverà l'intera opzione dal menu nel pannello di amministrazione.

Non sono sicuro del perché @chris-herbert lo abbia scritto in questo modo, ma se aggiungi questo al tuo file functions.php, forzerà qualsiasi navigazione verso quell'archivio a reindirizzare alla tua pagina 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();
}
}

Per garantire che la tua tassonomia non venga mai interrogata nel front end, puoi rimuoverla da tutte le query front end.
add_action(
'pre_get_posts',
function($qry) {
if (is_admin()) return;
$kill = 'genre'; // elimina questa tassonomia
$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']) && 'genre' === $tax['taxonomy']) {
unset($tax_query[$k]);
}
}
if (1 < count($tax_query)) {
$tax_query['relation'] = $relation;
}
$qry->set('tax_query',$tax_query);
}
);
L'uso di una closure dovrebbe rendere difficile la rimozione del callback.
Potresti anche voler implementare il reindirizzamento come ipotizzato, ma farlo non impedirebbe alle query secondarie nei template di pagina o nei widget di recuperare la tassonomia, o potrebbe causare problemi se tenti di reindirizzare tardi nel caricamento della pagina.

Ho votato negativamente per scoraggiare l'uso di questa tecnica approssimativa. Vedi la risposta di @chris-herbert qui sotto, che è più in linea con il pensiero di WP (anche se non è ancora l'ideale, ma è colpa di WP).
