Reglas de Rewrite en WordPress para Custom Post Type y Taxonomía

16 jun 2011, 22:51:52
Vistas: 6.58K
Votos: 9

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! :-)

3
Comentarios

@ChristopherDavis Gracias, voy a investigar un poco más sobre eso y ver cómo me va.

matt_d_rat matt_d_rat
20 jun 2011 03:19:43

Creo que esta pregunta puede ser respondida mirando ¿Mezclando estructuras de rewrite de tipos de post personalizados y taxonomías? Si esa pregunta no te ayuda, por favor edita esta pregunta para indicar en qué es diferente.

Jan Fabry Jan Fabry
9 jul 2011 16:18:09
Todas las respuestas a la pregunta 3
1

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.

18 dic 2011 19:04:07
Comentarios

no olvides cambiar "taxonomy" por el nombre de tu propia taxonomía. No uses el mismo valor que tu post_type. Intenta usar category para el primer intento. work/category , register_taxonomy('category', array('work'), array( ......

nonsensecreativity nonsensecreativity
18 dic 2011 19:07:37
5

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 
}
2 ene 2012 11:17:49
Comentarios

$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

Jared Jared
14 ene 2012 00:09:56

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

Jared Jared
14 ene 2012 00:19:10

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

Dipesh KC Dipesh KC
17 ene 2012 07:37:39

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

Jared Jared
17 ene 2012 11:05:44

Yo sugeriría usar el hook after_switch_theme, es nuevo desde la versión 3.3 (si no recuerdo mal).

Cristian Cristian
1 feb 2012 19:18:00
0

Una explicación más detallada está en otra publicación, pero aquí están las partes básicas que necesitas agregar:

  1. 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%".

  2. 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);
    
17 feb 2012 00:11:21