Taxonomie personalizată specifică unui tip de postare personalizat
Vreau să creez o taxonomie personalizată care să se comporte similar cu tipul de postare așa cum se comportă o categorie pentru postările implicite (pe baza structurii permalink /%category%/%postname%/) astfel încât postările din tipurile de postări personalizate să fie afișate ca www.example.com/custom-post-type/custom-taxonomy-name/post-name De asemenea, vreau ca caseta meta pentru categorii să apară doar când adăugăm o nouă postare implicită și nu când adăugăm o nouă postare în tipul de postare personalizat, iar caseta taxonomiei personalizate să apară doar când adăugăm o nouă postare în tipul de postare personalizat și nu când adăugăm o nouă postare implicită.

În primul rând, dacă doriți să afișați metabox-ul de taxonomie doar pentru tipul personalizat de postare, atunci înregistrați taxonomia doar pentru acel tip de postare personalizată, trecând numele tipului de postare personalizată ca argument în funcția register_taxonomy()
. Prin aceasta, metabox-ul de taxonomie va apărea doar pentru tipul personalizat de postare. Dacă nu doriți să afișați metabox-ul de categorie pentru tipul dvs. personalizat de postare, atunci eliminați termenul categorie ca argument în timpul înregistrării tipului dvs. personalizat de postare și includeți în schimb numele slug al taxonomiei, astfel: 'taxonomies' => array( 'post_tag', 'your_taxonomy_name')
. Iată codul cum am realizat acest lucru.
Am înregistrat o taxonomie personalizată cu slug-ul "themes_categories" sub tipul personalizat de postare themes:
function themes_taxonomy() {
register_taxonomy(
'themes_categories', // Numele taxonomiei. Numele trebuie să fie în formă de slug (nu trebuie să conțină litere mari sau spații).
'themes', // numele tipului de postare
array(
'hierarchical' => true,
'label' => 'Magazin teme', // numele afișat
'query_var' => true,
'rewrite' => array(
'slug' => 'themes', // Aceasta controlează slug-ul de bază care va fi afișat înaintea fiecărui termen
'with_front' => false // Nu afișa baza categoriei înainte
)
)
);
}
add_action( 'init', 'themes_taxonomy');
Apoi, pentru a schimba permalink-ul, am creat următoarea funcție:
function filter_post_type_link( $link, $post ) {
if ( $post->post_type !== 'themes' )
return $link;
if ( $cats = get_the_terms($post->ID, 'themes_categories') )
$link = str_replace('%themes_categories%', array_pop($cats)->slug, $link);
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Apoi am înregistrat un tip personalizat de postare cu slug-ul "themes" după cum urmează:
// Înregistrarea tipului personalizat de postare Themes
add_action( 'init', 'register_themepost', 20 );
function register_themepost() {
$labels = array(
'name' => _x( 'Teme', 'my_custom_post','custom' ),
'singular_name' => _x( 'Temă', 'my_custom_post', 'custom' ),
'add_new' => _x( 'Adaugă nou', 'my_custom_post', 'custom' ),
'add_new_item' => _x( 'Adaugă temă nouă', 'my_custom_post', 'custom' ),
'edit_item' => _x( 'Editează tema', 'my_custom_post', 'custom' ),
'new_item' => _x( 'Temă nouă', 'my_custom_post', 'custom' ),
'view_item' => _x( 'Vezi tema', 'my_custom_post', 'custom' ),
'search_items' => _x( 'Caută teme', 'my_custom_post', 'custom' ),
'not_found' => _x( 'Nu s-au găsit teme', 'my_custom_post', 'custom' ),
'not_found_in_trash' => _x( 'Nu s-au găsit teme în coșul de gunoi', 'my_custom_post', 'custom' ),
'parent_item_colon' => _x( 'Temă părinte:', 'my_custom_post', 'custom' ),
'menu_name' => _x( 'Postări teme', 'my_custom_post', 'custom' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'description' => 'Postări personalizate de teme',
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'post-formats', 'custom-fields' ),
'taxonomies' => array( 'post_tag','themes_categories'),
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 5,
'menu_icon' => get_stylesheet_directory_uri() . '/functions/panel/images/catchinternet-small.png',
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'query_var' => true,
'can_export' => true,
'rewrite' => array( 'slug' => 'themes/%themes_categories%', 'with_front' => FALSE ),
'public' => true,
'has_archive' => 'themes',
'capability_type' => 'post'
);
register_post_type( 'themes', $args ); // maxim 20 de caractere, nu poate conține litere mari și spații
}
Sunt câteva lucruri de reținut în timp ce înregistrați o postare personalizată. Schimbați parametrul "has_archive" în numele slug al tipului personalizat de postare și numele slug de rewrite ca 'slug' => 'custom_post_type_slug/%taxonomy_slug%
.
Acum, când adăugați un nou tip de postare în pagina corectă de tip de postare, veți vedea permalink-ul ca http://www.example.com/wordpress/themes/%themes_categories%/nume-postare/
. Dacă taxonomia personalizată pentru această postare nu este selectată, permalink-ul va rămâne http://www.example.com/wordpress/themes/%themes_categories%/nume-postare/
, ceea ce va afișa apoi o cerere incorectă.
Pentru a corecta acest lucru, creăm un termen implicit în taxonomia personalizată (la fel ca necategorizat în categorii).
Adăugați acest cod în functions.php:
function default_taxonomy_term( $post_id, $post ) {
if ( 'publish' === $post->post_status ) {
$defaults = array(
'themes_categories' => array('alte'),
);
$taxonomies = get_object_taxonomies( $post->post_type );
foreach ( (array) $taxonomies as $taxonomy ) {
$terms = wp_get_post_terms( $post_id, $taxonomy );
if ( empty($terms) && array_key_exists( $taxonomy, $defaults ) ) {
wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
}
}
}
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );
Acum, când taxonomia personalizată este lăsată goală, permalink-ul devine automat http://www.example.com/wordpress/themes/alte/nume-postare/
.
În final, nu uitați să resetați rewrite-ul făcând clic pe butonul "Salvează modificările" în setările de permalink din secțiunea de administrare WP, altfel veți fi redirecționați la eroarea 404. Sper că acest lucru vă este de ajutor.

Hei, am avut o problemă... când afișăm linkul către arhiva taxonomiei folosind echo get_the_term_list( $post->ID, $taxonomy, '', ', ', '' ); atunci linkul apare ca www.example.com/taxonomy-term și nu www.example.com/themes/taxonomy-term. Cred că trebuie să scriem o regulă HTACCESS pentru asta.

+1, explicație grozavă, am urmărit pas cu pas și funcționează, testat pe WordPress 3.4.2

Mă întrebam: trebuie să adaugi taxonomia personalizată în array-ul de taxonomii când înregistrezi un custom post type? Pentru că pare să funcționeze și fără să o adaugi acolo (dacă deja ai înregistrat taxonomia pentru acel custom post type). Doar curios.

Am încercat acest lucru cu plugin-ul CPT UI în timp ce încă foloseam rescrierea pentru a schimba URL-ul. Totul arată bine. URL-urile sunt corecte și am resetat permalinkurile, dar postările efective returnează eroarea 404. :( EDIT: nu mai contează. Am trecut prin proces și am eliminat opțiunea Hierarchical din taxonomie și, de asemenea, m-am asigurat că salvez lucrurile în ordinea corectă, iar acum postările par să funcționeze. Ura!

adică înregistrează o taxonomie personalizată MY_NEW_CARSS
pentru tipurile de postări personalizate:
$my_taxon_name = 'MY_NEW_CARSS';
$my_post_types = array('SUB_CAT_1','SUB_CAT_2','SUB_CAT_3');
//ÎNREGISTREAZĂ TAXONOMIE PERSONALIZATĂ (http://codex.wordpress.org/Function_Reference/register_taxonomy)
//Dacă intenționezi să înregistrezi un tip de postare HIERARHIC (cu părinte), citește acest avertisment: https://codex.wordpress.org/Function_Reference/register_post_type#hierarchical
add_action( 'init', 'my_f32' ); function my_f32() {
register_taxonomy( $GLOBALS['my_taxon_name'], array(),
array(
'label'=>$GLOBALS['my_taxon_name'], 'public'=>true, 'show_ui'=>true, 'show_admin_column'=>true, 'query_var'=>true,
'hierarchical'=>true, 'rewrite'=>array('with_front'=>true,'hierarchical'=>true),
));
}
//ÎNREGISTREAZĂ TIP DE POSTARE PERSONALIZAT (http://codex.wordpress.org/Function_Reference/register_post_type)
add_action( 'init', 'myf_63' );function myf_63() {
foreach ($GLOBALS['my_post_types'] as $each_Type) {
register_post_type( $each_Type,
array(
'label'=>$each_Type, 'labels' => array('name'=>$each_Type.' pagini', 'singular_name'=>$each_Type.' pagină'), 'public' => true, 'publicly_queryable'=> true, 'show_ui'=>true, 'capability_type' => 'post', 'has_archive' => true, 'query_var'=> true, 'can_export' => true, //'exclude_from_search' => false, 'show_in_nav_menus' => true, 'show_in_menu' => 'edit.php?post_type=page',//true, 'menu_position' => 5,
'hierarchical' =>true,
'supports' =>array( 'page-attributes', 'title', 'editor', 'thumbnail' ),
'rewrite' => array('with_front'=>true, ), // 'rewrite' => array("ep_mask"=>EP_PERMALINK ...) OR 'permalink_epmask'=>EP_PERMALINK,
));
register_taxonomy_for_object_type('category',$each_Type); //categorii standard
register_taxonomy_for_object_type($GLOBALS['my_taxon_name'] ,$each_Type); //Categorii personalizate
}
}
