Cum să dezactivați complet o taxonomie în frontend?

5 apr. 2014, 16:12:15
Vizualizări: 21.4K
Voturi: 8

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?

4
Comentarii

Care argumente? Explică "nimic nu pare să funcționeze"? Ce efect încerci să obții și ce vezi în schimb?

s_ha_dum s_ha_dum
5 apr. 2014 16:14:55

Folosind acele setări, nu vei putea interoga taxonomia folosind URL-uri... dar nimic nu te împiedică să interoghezi taxonomia folosind o interogare personalizată (new WP_Query(...))

gmazzap gmazzap
5 apr. 2014 16:26:21

Pur și simplu nu vreau ca URL-urile să funcționeze pentru acea taxonomie... punct.

Michael Ecklund Michael Ecklund
5 apr. 2014 16:27:45

@MichaelEcklund Deci, ceea ce ai făcut până acum este suficient.

gmazzap gmazzap
5 apr. 2014 16:58:16
Toate răspunsurile la întrebare 4
4
18

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();
            }

        }

    );

}
30 nov. 2015 00:36:39
Comentarii

Îmi place set_404();. O idee ingenioasă.

Michael Ecklund Michael Ecklund
20 ian. 2016 22:50:14

+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...

Sebastien Sebastien
21 oct. 2016 10:30:08

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

Armstrongest Armstrongest
6 sept. 2017 21:07:45

Ai transmis un nume de taxonomie când ai apelat kill_taxonomy_archive?

Chris Herbert Chris Herbert
7 sept. 2017 00:19:34
3

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 de interfață pentru taxonomie

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, 
);  
1 sept. 2020 14:37:39
Comentarii

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

User User
2 mai 2021 15:18:54

Î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.

Ankit Prajapati Ankit Prajapati
3 nov. 2022 11:56:46

Aceasta funcționează DAR dacă cineva folosește Gutenberg va crea probleme, cum ar fi blocul core wp:core/post-terms care nu va putea prelua taxonomia (de exemplu Display) :|

Isu Isu
2 oct. 2024 20:52:05
0

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();
    }
}
3 iun. 2020 01:28:46
2
-2

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.

5 apr. 2014 17:20:05
Comentarii

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).

Sebastien Sebastien
21 oct. 2016 10:32:50

Sunt de acord cu Sebastien - abordarea prin 404 este mult mai bună și funcționează excelent.

Dan Smart Dan Smart
19 ian. 2017 17:14:01