Reglas de reescritura de WordPress para tipo de publicación personalizada y taxonomía

9

He encontrado que este lugar es una buena fuente de información en el pasado a través de buscar en Google muchos de los problemas con los que me he encontrado. Mi pregunta se refiere a las reglas detalladas de reescritura que usa WordPress.

He configurado un tipo de publicación personalizado llamado proyecto , y he registrado una taxonomía personalizada llamada proyectos . Todo funciona muy bien, excepto las opciones de reescritura de slug, ya que terminan en conflicto, probablemente debido a las reglas de reescritura.

Básicamente esta es la estructura que estoy buscando lograr:

  • example.com/work/%taxonomy%/%post_name%/ (para publicaciones)
  • example.com/work/%taxonomy%/ (enumere las publicaciones que pertenecen a un término de taxonomía particular)
  • example.com/work/ (va a page-work.php que incluye taxonomy.php para enumerar todas las publicaciones asociadas con esa taxonomía)

Aquí está el código que tengo hasta ahora, pero necesito ayuda para escribir las reglas WP_Rewrite ya que este es el bit en el que estoy un poco perplejo.

$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    '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, // It's a custom post type, not built in!
    'capability_type' => 'post',
    'query_var' => "project", // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Showcase Taxonomy
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Project Categories', 
    'singular_label' => 'Project Category',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

¡Muchas gracias por su ayuda! :-)

matt_d_rat
fuente
@ChristopherDavis Gracias, los examinaré un poco más y veré cómo me va.
matt_d_rat
1
Creo que esta pregunta puede responderse mirando Mezclar tipos de publicaciones personalizadas y estructuras de reescritura de taxonomía. Si esa pregunta no le ayuda, edítela para indicar en qué se diferencia.
Jan Fabry

Respuestas:

1

Espero que esto pueda resolver tu problema

function my_custom_post_type() {
$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => '',
    'menu_name' => 'Projects' 
);

$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, // It's a custom post type, not built in!
    'capability_type' => 'post',
        'query_var' => true, // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'work' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomy', 'taxonomy general name' ),
        'singular_name' => __( 'Taxonomy', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Taxonomy' ),
        'all_items' => __( 'All Taxonomy' ),
        'parent_item' => __( 'Parent Taxonomy' ),
        'parent_item_colon' => __( 'Parent Taxonomy:' ),
        'edit_item' => __( 'Edit Taxonomy' ), 
        'update_item' => __( 'Update Taxonomy' ),
        'add_new_item' => __( 'Add New Taxonomy' ),
        'new_item_name' => __( 'New Taxonomy Name' ),
        'menu_name' => __( 'Taxonomy' ),
    );  

    register_taxonomy( 'taxonomy', array('work'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'work/taxonomy'),
                    '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 necesita crear es archive-work.php (su archivo de tipo de publicación) y taxonomy.php que usará para mostrar su archivo de taxonomía personalizado.

sin sentidocreatividad
fuente
no olvide cambiar la "taxonomía" por su propio nombre de taxonomía. No use el mismo valor que su post_type. intenta usar la categoría para el primer intento. work / category, register_taxonomy ('category, array (' work '), array (......
nonsensecreativity
1

Tuve el mismo problema y después de muchas dificultades terminé con esta solución.
Solo agregue esto a su código

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Projects', 'post type general name'),
        'singular_name' => _x('Project', 'post type singular name'),
        'add_new' => _x('Add New', 'project item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Projects' 
    );

    $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, // It's a custom post type, not built in!
        'capability_type' => 'post',
            'query_var' => true, // This goes to the WP_Query schema
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // this should help 
}
Dipesh KC
fuente
55
$ wp_rewrite-> flush_rules () no debe ejecutarse con tanta frecuencia, solo debe ejecutarse en los ganchos de activación o desactivación o con la menor cantidad posible. Aquí lo dice: codex.wordpress.org/Rewrite_API/flush_rules TAMBIÉN es más o menos la misma función que esta: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared
En otra nota, así es como lo logré: pastebin.com/k7QvxKLi
Jared
@Jared Gracias por señalar, pero no pude encontrar una manera de lograr esto cuando está integrado en nuestro tema (es decir, no a través del complemento). Por favor recomiende.
Dipesh KC
El código entraría functions.phpen ese caso. El código para un complemento y un tema es exactamente el mismo, la única diferencia está en los temas en los que siempre va functions.phpo en un archivo incluidofunctions.php
Jared
2
Sugeriría usar el after_switch_themegancho, es nuevo en 3.3 (IIRC).
Cristian
0

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

  1. Registre sus taxonomías y cpt como lo hace. Asegúrese de que su ficha de reescritura para el taxo sea "basename" y que la ficha de reescritura para el cpt sea "basename /% tax_name%".

  2. Dile a wordpress qué hacer con "% tax_name%" de esta manera:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, link); // see custom function defined below
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Jeff
fuente