Спеціальна таксономія, характерна для типу користувальницької пошти


29

Я хочу створити власну таксономію, яка поводиться аналогічно типу публікації, оскільки категорія поводиться до публікацій за замовчуванням (на підставі /% категорії% /% прізвища% / постійна посилання), щоб публікації у спеціальних типах публікацій були відображається як www.example.com/custom-post-type/custom-taxonomy-name/post-name Також я хочу, щоб мета-вікно категорії з’являлося лише тоді, коли ми додаємо нову публікацію за замовчуванням, а не тоді, коли ми додаємо нову публікацію у звичайному режимі тип публікації та поле власної таксономії, яке відображатиметься лише тоді, коли ми додаємо нову публікацію до спеціального типу публікації, а не тоді, коли ми додаємо новий пост за замовчуванням

Відповіді:


46

Перш за все, якщо ви хочете показати метабокс таксономії лише для спеціального типу пошти, тоді зареєструйте таксономію лише до цього користувальницького типу повідомлення, передавши ім'я користувальницького типу публікації як аргумент у register_taxonomy. Здійснюючи це, метабокс таксономії відображається лише для спеціального типу публікації. Якщо ви не хочете показувати метабокс категорії у власному типі публікації, видаліть категорію терміна як аргумент під час реєстрації користувальницького типу пошти та замість цього включіть назву слизової таксономії на зразок цієї 'таксономії' => масив ('post_tag', 'your_taxonomy_name') . ось код, як я цього досяг. Я зареєстрував власну таксономію зі службовими темами_категорій у рамках спеціальних тем типу публікації


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

Потім для зміни постійної посилання я створив наступну функцію


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

Тоді я зареєстрував користувальницький тип публікації з темами слуг, як показано нижче


//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
}  

Є кілька речей, які ви повинні пам’ятати під час реєстрації користувацької публікації. змінити параметр has_archive на ім'я кулі типу користувальницького типу, а інший - змінити назву переписувати слівку як "slug" => 'custom_post_type_slug /% таксономія_slug%

Тепер, коли ви додасте новий тип публікації на сторінці типу публікації запису ..., ви побачите посилання як http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Якщо спеціальна таксономія для цієї публікації не обрана, постійна посилання залишатиметься http://www.example.com/wordpress/themes/%themes_categories%/post-name/, яка потім покаже поганий запит. Щоб виправити це, ми створюємо термін за замовчуванням у спеціальній систематиці. (те саме, що і без категорій у категоріях) Додайте це до функції.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 );

Тепер, коли спеціальна таксономія залишається порожньою, перманент автоматично стає http://www.example.com/wordpress/themes/other/post-name/ .

Нарешті, не забудьте очистити перезапис, натиснувши зберегти зміни в налаштуваннях постійної посилання в розділі адміністратора, інакше вас буде переспрямовано на помилку 404 Сподіваюся, це вам допоможе.


Гей, у мене виникла проблема ... коли ми виводили посилання на архів таксономії, використовуючи ехо get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); тоді посилання відображається як www.example.com/taxonomy-term, а не www.example.com/themes/taxonomy-term. Я думаю, нам потрібно написати правило HTACESS.
Saurabh Goel

+1, чудове пояснення, далі покроково, і це працює, протестовано на WordPress 3.4.2
Алекс Ванг

1
Мені було цікаво: чи потрібно додати користувальницьку систематику до масиву таксономій при реєстрації користувальницького типу пошти? Тому що, здається, працює, не додаючи його туди (якщо ви вже зареєстрували таксономію до спеціального типу пошти). Просто цікаво.
траїноз

Спробував це за допомогою плагіна CPT UI, використовуючи переписати для зміни URL-адреси. Все добре виглядає. URL-адреси всі правильні, і я скидаю постійні посилання, але фактичні дописи кидають 404. :( EDIT: ніколи не переймаюсь. Я пройшов і видалив ієрархічну з таксономії, а також переконався, що зберігати речі в належному порядку, і тепер публікації здається, працює. Ях!
Гарконіс

1

тобто зареєструвати власну таксономію MY_NEW_CARSSдля спеціальних типів публікацій:

$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
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.