¿Cómo deshabilitar completamente una taxonomía en el frontend?

5 abr 2014, 16:12:15
Vistas: 21.4K
Votos: 8

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?

4
Comentarios

¿Qué argumentos? Explica "nada parece funcionar". ¿Qué efecto estás buscando lograr y qué ves en su lugar?

s_ha_dum s_ha_dum
5 abr 2014 16:14:55

Usando esa configuración no podrás consultar la taxonomía usando URLs... pero nada impide consultar la taxonomía usando una consulta personalizada (new WP_Query(...))

gmazzap gmazzap
5 abr 2014 16:26:21

Simplemente no quiero que las URLs funcionen para esa taxonomía... punto.

Michael Ecklund Michael Ecklund
5 abr 2014 16:27:45

@MichaelEcklund Entonces, lo que has hecho hasta ahora es suficiente.

gmazzap gmazzap
5 abr 2014 16:58:16
Todas las respuestas a la pregunta 4
4
18

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

        }

    );

}
30 nov 2015 00:36:39
Comentarios

Me gusta el set_404();. Buena idea.

Michael Ecklund Michael Ecklund
20 ene 2016 22:50:14

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

Sebastien Sebastien
21 oct 2016 10:30:08

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

Armstrongest Armstrongest
6 sept 2017 21:07:45

¿Pasaste un nombre de taxonomía cuando llamaste a kill_taxonomy_archive?

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

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.

Imagen descriptiva 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, 
);  
1 sept 2020 14:37:39
Comentarios

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

User User
2 may 2021 15:18:54

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.

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

Esto funciona PERO si alguien está usando Gutenberg, causará problemas como que el bloque núcleo wp:core/post-terms no podrá recuperar la taxonomía (por ejemplo, Mostrar) :|

Isu Isu
2 oct 2024 20:52:05
0

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

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.

5 abr 2014 17:20:05
Comentarios

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

Sebastien Sebastien
21 oct 2016 10:32:50

Estoy de acuerdo con Sebastien - el enfoque del 404 es mucho mejor y funciona bien.

Dan Smart Dan Smart
19 ene 2017 17:14:01