Página no encontrada en taxonomía de tipo de entrada personalizada
He creado un tipo de entrada personalizada con taxonomías y cuando voy a la página de taxonomía y veo una de las taxonomías obtengo un error de página no encontrada como si la taxonomía no se hubiera creado.
¿Alguna sugerencia?
/*Productos*/
$labels = array(
'name' => _x('Productos', 'nombre general del tipo de entrada'),
'singular_name' => _x('Producto', 'nombre singular del tipo de entrada'),
'add_new' => _x('Añadir Nuevo', 'Producto'),
'add_new_item' => __("Añadir Nuevo Producto"),
'edit_item' => __("Editar Producto"),
'new_item' => __("Nuevo Producto"),
'view_item' => __("Ver Producto"),
'search_items' => __("Buscar Producto"),
'not_found' => __('No se encontraron productos'),
'not_found_in_trash' => __('No se encontraron productos en la Papelera'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'singular_label' => __('Productos'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'query_var' => 'products',
'taxonomies' => array('products-cat'),
'supports' => array('title', 'editor', 'custom-fields', 'thumbnail', 'excerpt'),
'has_archive' => true,
);
register_post_type( 'products' , $args );
// Añadir a la función admin_init
add_filter('manage_edit-products_columns', 'add_new_products_columns');
function add_new_products_columns($columns) {
$columns = array(
'cb' => '<input type="checkbox" />',
'images' => 'Imágenes',
'title' => 'Nombre del Producto',
'author' => 'Autor',
'product-categories' => 'Categorías',
'tags' => 'Etiquetas',
'date' => 'Fecha',
);
return $columns;
}
add_action('manage_products_posts_custom_column', 'manage_products_columns', 10, 2);
function manage_products_columns($column_name, $id) {
global $wpdb;
switch ($column_name) {
case 'images':
//echo get_the_post_thumbnail( $page->ID, array(50,50) );
break;
case 'product-categories':
echo get_the_term_list($post->ID, 'products-cat', '', ', ','');
break;
default:
break;
}
}
add_action( 'init', 'products_create_taxonomies', 0 );
function products_create_taxonomies()
{
// Categorías de Fotos
register_taxonomy('products-cat',array('products'),array(
'hierarchical' => true,
'label' => 'Categorías de Productos',
'singular_name' => 'Categoría de Productos',
'show_ui' => true,
'query_var' => true,
'rewrite' => array('slug' => 'products' )
));
}
/*Fin Productos*/
Tengo esto en mi página de archivos
archive-products.php
<?php get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post();?>
<?php the_title(); ?>
<?php endwhile; endif; ?>

Prueba esta solución sugerida antes de hacer cualquier otra cosa. Básicamente funciona para mí siempre.

Después de investigar un poco, encontré un blog que en realidad tenía una respuesta a este problema.
Aquí está la función junto con la url del blog.
function taxonomy_slug_rewrite($wp_rewrite) {
$rules = array();
// obtener todas las taxonomías personalizadas
$taxonomies = get_taxonomies(array('_builtin' => false), 'objects');
// obtener todos los tipos de contenido personalizados
$post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects');
foreach ($post_types as $post_type) {
foreach ($taxonomies as $taxonomy) {
// revisar todos los tipos de contenido asignados a esta taxonomía
foreach ($taxonomy->object_type as $object_type) {
// verificar si la taxonomía está registrada para este tipo de contenido
if ($object_type == $post_type->rewrite['slug']) {
// obtener objetos de categoría
$terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0));
// crear reglas
foreach ($terms as $term) {
$rules[$object_type . '/' . $term->slug . '/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug;
}
}
}
}
}
// combinar con reglas globales
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite');

Recomendaría al menos dos cosas:
Cambia la prioridad para tu acción
products_create_taxonomies
al menos a 1, si no a 5 o más. (Creo que 0 no es válido para prioridades de acciones por alguna razón)Añade la creación de tu tipo de post dentro de una acción init, igual que hiciste con tus taxonomías, pero con una prioridad anterior a tu taxonomía (ya que las estás conectando mediante la taxonomía).
Si esos dos cambios no lo solucionan, intenta configurar ambos (sin enlazarlos mediante sus propias estructuras) y luego llama lo siguiente en una prioridad posterior (todavía durante init):
register_taxonomy_for_object_type( 'products-cat', 'products' );
Eso debería asegurar que estén completamente y correctamente enlazados.

Creo que tu principal problema aquí es la reescritura para tu taxonomía. Tal como está, tu reescritura para la taxonomía se ve así:
'rewrite' => array('slug' => 'products' )
Esto es exactamente lo que significa esta reescritura en tu tipo de contenido personalizado. Lo siguiente:
'rewrite' => true,
se traduce a esto en tu tipo de contenido personalizado:
'rewrite' => array('slug' => 'products' )
Por defecto, este conflicto en las reescrituras hará que las solicitudes de tu taxonomía devuelvan un error 404. Como solución, puedes cambiar la reescritura para tu taxonomía, o echar un vistazo a esta publicación que hice recientemente en este sitio sobre una mejor alternativa para esto.
Importante: Vacía tus enlaces permanentes después de cada actualización en tu código para reiniciar tus enlaces permanentes con la nueva estructura.

eso lo solucionó pero el nombre del slug cambió a la taxonomía registrada que es products-cat. ¿Cómo puedo mantener el rewrite en true mientras conservo el nombre del slug como products?

¿Has revisado el post enlazado? Los slugs de rewrite iguales para ambos custom post types y taxonomías personalizadas siempre son problemáticos para que funcionen. Si no me falla la memoria, el usuario que publicó la pregunta que respondí hizo un post sobre ese mismo problema. Solo revisa sus publicaciones también.

Ok revisé el post que recomendaste y cambié de usar guiones a guiones bajos y descargué el plugin de permalinks. Y después de hacer estos cambios me di cuenta que cambiar el rewrite en el código de lo que tengo a ponerlo en true no es lo mismo. Cuando lo pongo en true hace que la URL sea igual al nombre de la taxonomía registrada. La URL también muestra el nombre del custom post type y el nombre de la taxonomía registrada, por ejemplo products/products-cat/automotive/. ¿Alguna sugerencia?

Para ser honesto, esto es lo más que puedo ayudarte, desafortunadamente. Francamente, con las reescrituras, estamos en el mismo barco :-). Sé que tener las mismas URLs para páginas de taxonomía y archivos de tipos de contenido personalizados es posible con reglas de reescritura adicionales. Creo que con una regla de reescritura personalizada, puedes eliminar el nombre de la taxonomía en la estructura de URL del comentario anterior que publicaste. Desafortunadamente, no he investigado cómo hacer algo así yo mismo. Espero que resuelvas esto, y si lo haces, por favor publica tu solución y acepta tu propia respuesta. Esto será realmente útil para futuros usuarios.
