Reguli de rescriere WordPress pentru tipuri personalizate de postări și taxonomii
Am găsit acest loc ca fiind o sursă bună de informații în trecut prin multe căutări Google pentru problemele întâlnite. Întrebarea mea se referă la regulile verbose de rescriere pe care WordPress le folosește.
Am configurat un tip personalizat de postare numit project și am înregistrat o taxonomie personalizată numită projects. Totul funcționează excelent, cu excepția opțiunilor de slug de rescriere, care ajung să intre în conflict - cel mai probabil din cauza regulilor de rescriere.
Practic, aceasta este structura pe care doresc să o obțin:
example.com/work/%taxonomy%/%post_name%/
(pentru postări)example.com/work/%taxonomy%/
(listare postări aparținând unui anumit termen de taxonomie)example.com/work/
(merge către page-work.php care include taxonomy.php pentru a lista toate postările asociate cu acea taxonomie)
Iată codul pe care îl am până acum, dar am nevoie de ajutor pentru a scrie regulile WP_Rewrite, deoarece aceasta este partea care mă blochează.
$labels = array(
'name' => _x('Proiecte', 'nume general tip postare'),
'singular_name' => _x('Proiect', 'nume singular tip postare'),
'add_new' => _x('Adaugă nou', 'element proiect'),
'add_new_item' => __('Adaugă proiect nou'),
'edit_item' => __('Editează proiect'),
'new_item' => __('Proiect nou'),
'view_item' => __('Vezi proiect'),
'search_items' => __('Caută proiecte'),
'not_found' => __('Nimic găsit'),
'not_found_in_trash' => __('Nimic găsit în coșul de gunoi'),
'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, // Este un tip de postare personalizat, nu încorporat!
'capability_type' => 'post',
'query_var' => "project", // Aceasta merge către schema WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type('project' , $args);
// Taxonomia pentru proiecte
register_taxonomy('projects', array('project'), array(
'public' => true,
'hierarchical' => true,
'label' => 'Categorii proiecte',
'singular_label' => 'Categorie proiect',
'query_var' => true,
'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
)
);
Mulțumesc mult pentru ajutor! :-)
Sper că acest lucru vă poate rezolva problema
function my_custom_post_type() {
$labels = array(
'name' => _x('Proiecte', 'nume general tip post'),
'singular_name' => _x('Proiect', 'nume singular tip post'),
'add_new' => _x('Adaugă nou', 'element proiect'),
'add_new_item' => __('Adaugă proiect nou'),
'edit_item' => __('Editează proiect'),
'new_item' => __('Proiect nou'),
'view_item' => __('Vezi proiect'),
'search_items' => __('Caută proiecte'),
'not_found' => __('Nu s-a găsit nimic'),
'not_found_in_trash' => __('Nu s-a găsit nimic în coșul de gunoi'),
'parent_item_colon' => '',
'menu_name' => 'Proiecte'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => false,
'has_archive' => true,
'rewrite' => array('slug'=>'proiecte', 'with_front'=>false),
'show_ui' => true,
'_builtin' => false, // Este un tip de post personalizat, nu built-in!
'capability_type' => 'post',
'query_var' => true, // Acest lucru merge în schema WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type( 'proiecte' , $args );
}
function my_custom_taxonomies() {
$labels = array(
'name' => __( 'Taxonomie', 'nume general taxonomie' ),
'singular_name' => __( 'Taxonomie', 'nume singular taxonomie' ),
'search_items' => __( 'Caută taxonomie' ),
'all_items' => __( 'Toate taxonomiile' ),
'parent_item' => __( 'Taxonomie părinte' ),
'parent_item_colon' => __( 'Taxonomie părinte:' ),
'edit_item' => __( 'Editează taxonomie' ),
'update_item' => __( 'Actualizează taxonomie' ),
'add_new_item' => __( 'Adaugă taxonomie nouă' ),
'new_item_name' => __( 'Nume taxonomie nouă' ),
'menu_name' => __( 'Taxonomie' ),
);
register_taxonomy( 'taxonomie', array('proiecte'), array (
'labels' => $labels,
'hierarchical' =>false,
'show_ui' => true,
'rewrite' => array( 'slug' => 'proiecte/taxonomie'),
'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);
ceea ce trebuie să creați este archive-proiecte.php (arhiva tipului de post) și taxonomy.php care va fi folosit pentru a afișa arhiva taxonomiei personalizate.

Am avut aceeași problemă și după multă luptă am ajuns la această soluție.
Doar adăugați acest cod
global $wp_rewrite;
$wp_rewrite->flush_rules();
function my_custom_post_type() {
$labels = array(
'name' => _x('Proiecte', 'nume general tip postare'),
'singular_name' => _x('Proiect', 'nume singular tip postare'),
'add_new' => _x('Adaugă nou', 'element proiect'),
'add_new_item' => __('Adaugă Proiect Nou'),
'edit_item' => __('Editează Proiect'),
'new_item' => __('Proiect Nou'),
'view_item' => __('Vezi Proiect'),
'search_items' => __('Caută Proiecte'),
'not_found' => __('Nimic găsit'),
'not_found_in_trash' => __('Nimic găsit în Coșul de Gunoi'),
'parent_item_colon' => '',
'menu_name' => 'Proiecte'
);
$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, // Este un tip de postare personalizat, nu unul built-in!
'capability_type' => 'post',
'query_var' => true, // Aceasta merge în schema 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(); // acest lucru ar trebui să ajute
}

$wp_rewrite->flush_rules() nu ar trebui rulat atât de des, ar trebui folosit doar în cazul hook-urilor de activare sau dezactivare sau cât mai rar posibil. Este menționat aici: http://codex.wordpress.org/Rewrite_API/flush_rules DE ASEMENEA, este practic aceeași funcție cu aceasta: http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

Pe de altă parte, așa am reușit să o implementez: http://pastebin.com/k7QvxKLi

@Jared Mulțumesc pentru observație, dar nu am reușit să găsesc o metodă de a realiza acest lucru atunci când este integrat în tema noastră (adică nu printr-un plugin). Te rog să sugerezi.

Codul ar fi plasat în functions.php
în acest caz. Codul pentru un plugin și pentru o temă este exact același, singura diferență este că în teme acesta merge întotdeauna în functions.php
sau într-un fișier inclus în functions.php

O explicație mai detaliată este într-un alt articol, dar iată părțile de bază pe care trebuie să le adăugați:
Înregistrați taxonomiile și tipurile de postare personalizate (CPT) așa cum faceți de obicei. Asigurați-vă că URL-ul de rescriere pentru taxonomie este "basename" și URL-ul de rescriere pentru CPT este "basename/%tax_name%".
Spuneți WordPress ce să facă cu "%tax_name%" astfel:
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); // vezi funcția personalizată definită mai jos } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2);
