Cum să dezactivați complet o taxonomie în frontend?
Am înregistrat trei taxonomii personalizate. Toate aceste trei taxonomii personalizate sunt atașate la tipul meu de postare personalizat.
Există o singură taxonomie din cele trei înregistrate, pe care aș dori să nu fie accesibilă în niciun fel în frontend-ul site-ului web.
Care este cea mai bună soluție pentru aceasta?
M-am jucat cu specificarea diferitelor argumente în timpul înregistrării taxonomiei, dar nimic nu pare să funcționeze.
$args['show_in_nav_menus'] = false;
$args['query_var'] = false;
$args['public'] = false;
Ar trebui să folosesc hook-ul template_redirect
și să fac o verificare is_tax()
? Dacă este taxonomia pe care vreau să o dezactivez, să redirecționez pur și simplu către arhiva tipului de postare personalizat?

Răspunsul lui s_ha_dum nu a funcționat pentru mine, dar acesta da:
/**
* Dezactivează complet arhivele de termeni pentru această taxonomie.
* @param string $taxonomy Numele taxonomiei în WordPress
*/
function kill_taxonomy_archive($taxonomy){
add_action('pre_get_posts', function($qry) {
if (is_admin()) return;
if (is_tax($taxonomy)){
$qry->set_404();
}
}
);
}

+1 — Aceasta este mai mult "metoda Wordpress" decât răspunsul acceptat. În mod ideal, ar trebui să existe un argument "has_archive", ca la tipurile de postări...

Aceasta generează o notificare Undefined variable: taxonomy in ... [location]
Există vreo metodă de a evita acest lucru?

Taxonomia WordPress oferă flexibilitate în setarea proprietăților sale în timpul înregistrării. Pentru a dezactiva arhivele de taxonomie în WordPress, setați parametrul "public" ca "false" așa cum este arătat în exemplul de cod de mai jos. Acest lucru va elimina link-ul de acțiune "Vizualizare" din ecranul de taxonomie și va redirecționa utilizatorul către pagina de start a site-ului atunci când încearcă să acceseze manual URL-ul taxonomiei.
Exemplu
// Înregistrare Taxonomie Personalizată
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Taxonomii', 'Numele General al Taxonomiei', 'text_domain' ),
'singular_name' => _x( 'Taxonomie', 'Numele Singular al Taxonomiei', 'text_domain' ),
'menu_name' => __( 'Taxonomie', 'text_domain' ),
'all_items' => __( 'Toate Elementele', 'text_domain' ),
'parent_item' => __( 'Element Părinte', 'text_domain' ),
'parent_item_colon' => __( 'Element Părinte:', 'text_domain' ),
'new_item_name' => __( 'Nume Element Nou', 'text_domain' ),
'add_new_item' => __( 'Adăugare Element Nou', 'text_domain' ),
'edit_item' => __( 'Editare Element', 'text_domain' ),
'update_item' => __( 'Actualizare Element', 'text_domain' ),
'view_item' => __( 'Vizualizare Element', 'text_domain' ),
'separate_items_with_commas' => __( 'Separare elemente cu virgule', 'text_domain' ),
'add_or_remove_items' => __( 'Adăugare sau eliminare elemente', 'text_domain' ),
'choose_from_most_used' => __( 'Alegere din cele mai utilizate', 'text_domain' ),
'popular_items' => __( 'Elemente Populare', 'text_domain' ),
'search_items' => __( 'Căutare Elemente', 'text_domain' ),
'not_found' => __( 'Negăsit', 'text_domain' ),
'no_terms' => __( 'Niciun element', 'text_domain' ),
'items_list' => __( 'Listă Elemente', 'text_domain' ),
'items_list_navigation' => __( 'Navigare Listă Elemente', 'text_domain' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => false, // Setat pe false, va elimina link-ul de vizualizare din backend și va redirecționa utilizatorul către homepage la accesarea link-ului de taxonomie.
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
);

Acesta este singurul răspuns corect. Pentru cei care doresc să filtreze taxonomiile existente, pot folosi filtrul register_taxonomy_args
.

În loc de public = false, adăugați o altă variabilă în array publicly_queryable = false care nu va afișa opțiunea de vizualizare, public= false va elimina întreaga opțiune din meniul din panoul de administrare.

Nu sunt sigur de motivul pentru care @chris-herbert a scris codul în acest fel, dar dacă adaugi acest cod în fișierul tău de funcții, va forța orice navigare către acea arhivă să redirecționeze către pagina ta de 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();
}
}

Pentru a vă asigura că taxonomia dumneavoastră nu este niciodată interogată în partea de frontend, o puteți elimina din toate interogările de frontend.
add_action(
'pre_get_posts',
function($qry) {
if (is_admin()) return;
$kill = 'genre'; // elimină această taxonomie
$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);
}
);
Utilizarea unei închideri ar trebui să facă callback-ul greu de eliminat.
Ați putea, de asemenea, să implementați redirecționarea așa cum ați speculat, dar acest lucru nu ar împiedica interogările secundare din șabloanele de pagină sau widget-uri să preia taxonomia sau ar putea cauza probleme dacă încercați să redirecționați târziu în încărcarea unei pagini.

Am votat în jos pentru a descuraja utilizarea acestei tehnici neelegante. Vezi răspunsul lui @chris-herbert mai jos, care este mai în spiritul WP (deși tot nu este ideal, dar asta e vina WP).
