Niestandardowa taksonomia specyficzna dla typu niestandardowego postu

29

Chcę utworzyć niestandardową systematykę, która zachowuje się podobnie do typu postu, ponieważ kategoria zachowuje się do domyślnych postów (na podstawie struktury /% category% /% postname% / permalink), aby wpisy w niestandardowych typach postów były wyświetlany jako www.example.com/typ niestandardowy- post / nazwa niestandardowa-nazwa / nazwa postu Chcę też, aby meta-kategoria pojawiała się tylko wtedy, gdy dodamy nowy domyślny post, a nie kiedy dodamy nowy post w niestandardowym typ wpisu i niestandardowe pole systematyki, które pojawiają się tylko wtedy, gdy dodamy nowy post w niestandardowym typie postu, a nie gdy dodamy nowy post domyślny.

Saurabh Goel
źródło

Odpowiedzi:

46

Po pierwsze, jeśli chcesz wyświetlić metaboks taksonomii tylko dla niestandardowego typu postu, zarejestruj taksonomię tylko dla tego niestandardowego typu postu, przekazując nazwę niestandardowego typu postu jako argument w register_taxonomy. W ten sposób metaboks taksonomii pojawia się tylko dla niestandardowego typu postu. Jeśli nie chcesz wyświetlać metaboksu kategorii na niestandardowym typie postu, usuń kategorię terminu jako argument podczas rejestrowania niestandardowego typu postu i zamiast tego dołącz nazwę informacji o taksonomii, taką jak ta „taksonomie” => tablica („tag_tag”, „twoja_taksonomia”) . oto kod jak to osiągnąłem. Zarejestrowałem niestandardową systematykę z informacjami o ślimakach motywy_kategorie w ramach niestandardowych motywów typu post


function themes_taxonomy() {  
    register_taxonomy(  
        'themes_categories',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
        'themes',        //post type name
        array(  
            'hierarchical' => true,  
            'label' => 'Themes store',  //Display name
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'themes', // This controls the base slug that will display before each term
                'with_front' => false // Don't display the category base before 
            )
        )  
    );  
}  
add_action( 'init', 'themes_taxonomy');

Następnie, aby zmienić bezpośredni link, utworzyłem następującą funkcję


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

Następnie zarejestrowałem niestandardowy typ postu z motywami ślimaków, jak poniżej


//Registering Custom Post Type Themes
add_action( 'init', 'register_themepost', 20 );
function register_themepost() {
    $labels = array(
        'name' => _x( 'Themes', 'my_custom_post','custom' ),
        'singular_name' => _x( 'Theme', 'my_custom_post', 'custom' ),
        'add_new' => _x( 'Add New', 'my_custom_post', 'custom' ),
        'add_new_item' => _x( 'Add New ThemePost', 'my_custom_post', 'custom' ),
        'edit_item' => _x( 'Edit ThemePost', 'my_custom_post', 'custom' ),
        'new_item' => _x( 'New ThemePost', 'my_custom_post', 'custom' ),
        'view_item' => _x( 'View ThemePost', 'my_custom_post', 'custom' ),
        'search_items' => _x( 'Search ThemePosts', 'my_custom_post', 'custom' ),
        'not_found' => _x( 'No ThemePosts found', 'my_custom_post', 'custom' ),
        'not_found_in_trash' => _x( 'No ThemePosts found in Trash', 'my_custom_post', 'custom' ),
        'parent_item_colon' => _x( 'Parent ThemePost:', 'my_custom_post', 'custom' ),
        'menu_name' => _x( 'Themes Posts', 'my_custom_post', 'custom' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Custom Theme Posts',
        '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 );//max 20 charachter cannot contain capital letters and spaces
}  

Jest kilka rzeczy, o których musisz pamiętać, rejestrując własny post. zmień parametr has_archive na niestandardową nazwę informacji o typie postu, a inną jest zmiana przepisanej nazwy informacji o pracy jako „slug” => „custom_post_type_slug /% taxonomy_slug%

Teraz, gdy dodasz nowy typ postu na stronie zapisu postów ... zobaczysz link bezpośredni jako http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Jeśli niestandardowa taksonomia dla tego postu nie zostanie wybrana, link bezpośredni pozostanie http://www.example.com/wordpress/themes/%themes_categories%/post-name/, co spowoduje wyświetlenie złej prośby. Aby to naprawić, tworzymy domyślny termin w niestandardowej taksonomii. (to samo, co niesklasyfikowane w kategoriach) Dodaj to do functions.php

function default_taxonomy_term( $post_id, $post ) {
    if ( 'publish' === $post->post_status ) {
        $defaults = array(
            'themes_categories' => array( 'other'),   //

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

Teraz, gdy niestandardowa taksonomia pozostanie pusta, permlaink automatycznie staje się http://www.example.com/wordpress/themes/other/post-name/ .

W końcu nie zapomnij opróżnić przepisywania, klikając Zapisz zmiany w ustawieniach permalink w sekcji admin, w przeciwnym razie zostaniesz przekierowany do błędu 404. Mam nadzieję, że to ci pomoże.

Rabin Shrestha
źródło
Hej, miałem problem ... kiedy wysyłamy link do archiwum taksonomii za pomocą echa get_the_term_list ($ post-> ID, $ taksonomy, '', ',', ''); wtedy link pojawia się jako www.example.com/taxonomy-term, a nie www.example.com/themes/taxonomy-term. Myślę, że musimy do tego napisać regułę HTACESS.
Saurabh Goel
+1, świetne wyjaśnienie, krok po kroku i działa, przetestowane na WordPress 3.4.2
Alex Vang
1
Zastanawiałem się: czy musisz dodać niestandardową taksonomię do szeregu taksonomii podczas rejestrowania niestandardowego typu postu? Ponieważ wydaje się, że działa bez dodawania go również (jeśli już zarejestrujesz taksonomię do niestandardowego typu postu). Po prostu ciekawy.
trainoasis
Próbowałem tego z wtyczką CPT UI, wciąż używając przepisywania do zmiany adresu URL. Wszystko wygląda dobrze. wszystkie adresy URL są poprawne i resetuję linki bezpośrednie, ale rzeczywiste posty generują 404. :( EDYCJA: nieważne. Przeszedłem i usunąłem hierarchię z taksonomii, a także upewniłem się, że zapisałem rzeczy we właściwej kolejności, a teraz posty wydaje się działać. Tak!
Garconis
1

tj. zarejestruj niestandardową taksonomię MY_NEW_CARSSdla niestandardowych typów postów:

$my_taxon_name  = 'MY_NEW_CARSS';
$my_post_types  = array('SUB_CAT_1','SUB_CAT_2','SUB_CAT_3');


//REGISTER CUSTOM TAXONOMY ( http://codex.wordpress.org/Function_Reference/register_taxonomy )
//If you aim to register HIERARCHICAL(Parent-ed) post type, read this warning: 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),  
             ));
}

//REGISTER CUSTOM POST TYPE ( 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.' pagess', 'singular_name'=>$each_Type.' page'),        '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);       //standard categories
            register_taxonomy_for_object_type($GLOBALS['my_taxon_name'] ,$each_Type);   //Custom categories
    }
}
T.Todua
źródło