Règles de réécriture WordPress pour le type de publication personnalisé et la taxonomie

9

J'ai trouvé que cet endroit était une bonne source d'information dans le passé grâce à beaucoup de recherches sur Google pour les problèmes que j'ai rencontrés. Ma question concerne les règles de réécriture prolixes utilisées par WordPress.

J'ai configuré un type de message personnalisé appelé projet et j'ai enregistré une taxonomie personnalisée appelée projets . Tout fonctionne très bien, sauf pour les options de réécriture de slug car elles finissent par être en conflit - très probablement en raison des règles de réécriture.

Fondamentalement, c'est la structure que je cherche à réaliser:

  • example.com/work/%taxonomy%/%post_name%/ (pour les postes)
  • example.com/work/%taxonomy%/ (liste des articles appartenant à un terme de taxonomie particulier)
  • example.com/work/ (va à page-work.php qui inclut taxonomy.php pour lister toutes les publications associées à cette taxonomie)

Voici le code que j'ai jusqu'à présent, mais j'ai besoin d'aide pour écrire les règles WP_Rewrite car c'est le bit sur lequel je suis un peu perplexe.

$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)
    )
);

Merci beaucoup pour votre aide! :-)

matt_d_rat
la source
@ChristopherDavis Merci, je vais les examiner un peu plus et voir comment je m'en sors.
matt_d_rat
1
Je pense que cette question peut être répondue en regardant Mixer le type de message personnalisé et les structures de réécriture de la taxonomie? Si cette question ne vous aide pas, veuillez modifier cette question pour indiquer en quoi elle est différente.
Jan Fabry

Réponses:

1

J'espère que cela peut résoudre votre problème

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

ce que vous devez créer est archive-work.php (votre archive de type de publication) et taxonomy.php qui vous servira pour afficher votre archive de taxonomie personnalisée.

non-créativité
la source
n'oubliez pas de changer la "taxonomie" pour votre propre nom de taxonomie. N'utilisez pas la même valeur que votre post_type. essayez d'utiliser la catégorie pour le premier essai. work / category, register_taxonomy ('category, array (' work '), array (......
nonsensecreativity
1

J'ai eu le même problème et après beaucoup de difficultés, je me suis retrouvé avec cette solution.
Ajoutez simplement ceci à votre code

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
la source
5
$ wp_rewrite-> flush_rules () ne doit pas être exécuté aussi souvent, il ne doit être exécuté que sur des hooks d'activation ou de désactivation ou aussi modérément que possible. Il le dit ici: codex.wordpress.org/Rewrite_API/flush_rules AUSSI est à peu près la même fonction que celle-ci: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared
Sur une autre note, voici comment je l'ai accompli: pastebin.com/k7QvxKLi
Jared
@Jared Merci d'avoir pointé le doigt, mais je n'ai pas pu trouver un moyen d'accompagner cela lorsque cela est intégré dans notre thème (c'est-à-dire pas via un plugin). Veuillez suggérer.
Dipesh KC
Le code entrerait functions.phpdans ce cas. Le code d'un plugin et d'un thème est exactement le même, la seule différence est dans les thèmes dans lesquels il va toujours functions.phpou dans un fichier inclusfunctions.php
Jared
2
Je suggérerais d'utiliser le after_switch_themecrochet, c'est nouveau à 3.3 (IIRC).
Cristian
0

Une explication plus détaillée se trouve sur un autre post , mais voici les parties de base que vous devez ajouter:

  1. Enregistrez vos taxonomies et cpt comme vous le faites. Assurez-vous que votre slug de réécriture pour le taxo est "nom de base" et le slug de réécriture pour le cpt est "nom de base /% tax_name%".

  2. Dites à wordpress quoi faire avec "% tax_name%" comme ceci:

    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
la source