Reglas de Rewrite en WordPress para Custom Post Type y Taxonomía
He encontrado este lugar como una buena fuente de información en el pasado a través de muchas búsquedas en Google para los problemas que he tenido. Mi pregunta está relacionada con las reglas de rewrite que utiliza WordPress.
He configurado un custom post type llamado project, y he registrado una taxonomía personalizada llamada projects. Todo funciona bien excepto por las opciones de slug de rewrite ya que terminan entrando en conflicto - muy probablemente debido a las reglas de rewrite.
Básicamente esta es la estructura que estoy buscando lograr:
example.com/work/%taxonomy%/%post_name%/
(para posts)example.com/work/%taxonomy%/
(listar posts pertenecientes a un término de taxonomía específico)example.com/work/
(va a page-work.php que incluye taxonomy.php para listar todos los posts asociados con esa taxonomía)
Aquí está el código que tengo hasta ahora, pero necesito ayuda escribiendo las reglas WP_Rewrite ya que esta es la parte en la que estoy atascado.
$labels = array(
'name' => _x('Proyectos', 'nombre general del tipo de post'),
'singular_name' => _x('Proyecto', 'nombre singular del tipo de post'),
'add_new' => _x('Agregar Nuevo', 'ítem de proyecto'),
'add_new_item' => __('Agregar Nuevo Proyecto'),
'edit_item' => __('Editar Proyecto'),
'new_item' => __('Nuevo Proyecto'),
'view_item' => __('Ver Proyecto'),
'search_items' => __('Buscar Proyectos'),
'not_found' => __('No se encontró nada'),
'not_found_in_trash' => __('No se encontró nada en la Papelera'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => true,
'rewrite' => array('slug'=>'work', 'with_front'=>false),
'show_ui' => true,
'_builtin' => false, // ¡Es un custom post type, no está integrado!
'capability_type' => 'post',
'query_var' => "project", // Esto va al esquema de WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type('project' , $args);
// Taxonomía de Proyectos
register_taxonomy('projects', array('project'), array(
'public' => true,
'hierarchical' => true,
'label' => 'Categorías de Proyecto',
'singular_label' => 'Categoría de Proyecto',
'query_var' => true,
'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
)
);
¡Muchas gracias por tu ayuda! :-)
Espero que esto pueda resolver tu problema
function my_custom_post_type() {
$labels = array(
'name' => _x('Proyectos', 'nombre general del tipo de publicación'),
'singular_name' => _x('Proyecto', 'nombre singular del tipo de publicación'),
'add_new' => _x('Agregar Nuevo', 'ítem de proyecto'),
'add_new_item' => __('Agregar Nuevo Proyecto'),
'edit_item' => __('Editar Proyecto'),
'new_item' => __('Nuevo Proyecto'),
'view_item' => __('Ver Proyecto'),
'search_items' => __('Buscar Proyectos'),
'not_found' => __('Nada encontrado'),
'not_found_in_trash' => __('Nada encontrado en la Papelera'),
'parent_item_colon' => '',
'menu_name' => 'Proyectos'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => false,
'has_archive' => true,
'rewrite' => array('slug'=>'trabajo', 'with_front'=>false),
'show_ui' => true,
'_builtin' => false, // ¡Es un tipo de publicación personalizado, no incorporado!
'capability_type' => 'post',
'query_var' => true, // Esto va al esquema de WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type( 'work' , $args );
}
function my_custom_taxonomies() {
$labels = array(
'name' => __( 'Taxonomía', 'nombre general de taxonomía' ),
'singular_name' => __( 'Taxonomía', 'nombre singular de taxonomía' ),
'search_items' => __( 'Buscar Taxonomía' ),
'all_items' => __( 'Todas las Taxonomías' ),
'parent_item' => __( 'Taxonomía Padre' ),
'parent_item_colon' => __( 'Taxonomía Padre:' ),
'edit_item' => __( 'Editar Taxonomía' ),
'update_item' => __( 'Actualizar Taxonomía' ),
'add_new_item' => __( 'Agregar Nueva Taxonomía' ),
'new_item_name' => __( 'Nombre de Nueva Taxonomía' ),
'menu_name' => __( 'Taxonomía' ),
);
register_taxonomy( 'taxonomy', array('work'), array (
'labels' => $labels,
'hierarchical' =>false,
'show_ui' => true,
'rewrite' => array( 'slug' => 'trabajo/taxonomia'),
'query_var' => true,
'show_in_nav_menus' => true,
'public' => true,
));
}
add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);
Lo que necesitas crear es archive-work.php (el archivo de tu tipo de publicación) y taxonomy.php que se usará para mostrar el archivo de tu taxonomía personalizada.

Tuve el mismo problema y después de mucho esfuerzo terminé con esta solución.
Solo añade esto a tu código
global $wp_rewrite;
$wp_rewrite->flush_rules();
function my_custom_post_type() {
$labels = array(
'name' => _x('Proyectos', 'nombre general del tipo de publicación'),
'singular_name' => _x('Proyecto', 'nombre singular del tipo de publicación'),
'add_new' => _x('Añadir Nuevo', 'ítem de proyecto'),
'add_new_item' => __('Añadir Nuevo Proyecto'),
'edit_item' => __('Editar Proyecto'),
'new_item' => __('Nuevo Proyecto'),
'view_item' => __('Ver Proyecto'),
'search_items' => __('Buscar Proyectos'),
'not_found' => __('Nada encontrado'),
'not_found_in_trash' => __('Nada encontrado en la Papelera'),
'parent_item_colon' => '',
'menu_name' => 'Proyectos'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => false,
'has_archive' => true,
'rewrite' => array('slug'=>'work', 'with_front'=>false),
'show_ui' => true,
'_builtin' => false, // ¡Es un tipo de publicación personalizado, no incorporado!
'capability_type' => 'post',
'query_var' => true, // Esto va al esquema de WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type( 'work' , $args );
global $wp_rewrite;
$wp_rewrite->flush_rules(); // esto debería ayudar
}

$wp_rewrite->flush_rules() no debería ejecutarse tan frecuentemente, solo debería ejecutarse en los hooks de activación o desactivación o lo más esporádicamente posible. Lo dice aquí: http://codex.wordpress.org/Rewrite_API/flush_rules ADEMÁS es prácticamente la misma función que esta: http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

Por otro lado, así es como lo logré: http://pastebin.com/k7QvxKLi

@Jared Gracias por señalarlo, pero no pude encontrar la manera de lograrlo cuando esto está integrado en nuestro tema (es decir, no mediante un plugin). Por favor, sugiera.

El código iría en functions.php
en ese caso. El código para un plugin y un tema es exactamente el mismo, la única diferencia es que en los temas siempre va en functions.php
o en un archivo incluido en functions.php

Una explicación más detallada está en otra publicación, pero aquí están las partes básicas que necesitas agregar:
Registra tus taxonomías y CPT's como lo haces normalmente. Asegúrate de que el slug de rewrite para la taxonomía sea "basename" y el slug de rewrite para el CPT sea "basename/%tax_name%".
Indica a WordPress qué hacer con "%tax_name%" de la siguiente manera:
function filter_post_type_link($link, $post) { // Verifica si el tipo de publicación no es el CPT personalizado if ($post->post_type != 'custom_post_type_name') return $link; // Obtiene los términos de la taxonomía asociados al post if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { // Reemplaza el marcador %taxonomy_name% con el ID del término $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, $link); // ver función personalizada definida abajo } return $link; } // Añade el filtro para modificar los enlaces del tipo de publicación add_filter('post_type_link', 'filter_post_type_link', 10, 2);
