Taxonomie personalizată specifică unui tip de postare personalizat

5 iul. 2012, 13:22:29
Vizualizări: 138K
Voturi: 36

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

0
Toate răspunsurile la întrebare 2
5
58

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

5 iul. 2012 17:52:03
Comentarii

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.

Saurabh Goel Saurabh Goel
6 iul. 2012 16:49:34

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

TechAurelian TechAurelian
23 oct. 2012 22:27:22

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.

trainoasis trainoasis
8 mar. 2017 09:52:43

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!

Garconis Garconis
17 mai 2018 22:53:26

Poate este util de menționat acum, funcția 'register_taxonomy' necesită ca argumentul 'show_in_rest' să fie TRUE pentru a putea utiliza noul editor de blocuri WordPress.

Lee Lee
8 mai 2024 18:30:24
0

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
    }
}
25 iul. 2015 21:32:38