Taksonomi Khusus khusus untuk jenis Pos Kustom

29

Saya ingin membuat taksonomi khusus yang berperilaku mirip dengan jenis posting sebagai kategori berperilaku dengan posting default (dengan alasan /% kategori% /% postname% / struktur permalink) sehingga posting dalam jenis posting kustom ditampilkan sebagai www.example.com/custom-post-type/custom-taxonomy-name/post-name Juga saya ingin kotak meta kategori hanya muncul ketika kita menambahkan posting default baru dan tidak ketika kita menambahkan posting baru di custom jenis posting dan kotak taksonomi khusus hanya muncul ketika kita menambahkan posting baru dalam jenis posting kustom dan tidak ketika kita menambahkan posting default baru.

Saurabh Goel
sumber

Jawaban:

46

Pertama-tama jika Anda ingin menunjukkan metabox taksonomi hanya untuk jenis pos kustom, maka daftarkan taksonomi hanya ke jenis pos kustom tersebut dengan meneruskan nama tipe pos kustom sebagai argumen dalam register_taxonomy. Dengan melakukan ini, taksonomi metabox hanya muncul untuk jenis pos kustom. Jika Anda tidak ingin menampilkan metabox kategori ke jenis posting khusus, maka hapus kategori istilah sebagai argumen saat mendaftarkan jenis posting kustom dan alih-alih sertakan nama siput taksonomi seperti 'taksonomi' ini => array ('post_tag', 'your_taxonomy_name') . di sini adalah kode bagaimana saya mencapai itu. Saya telah mendaftarkan taksonomi khusus dengan slug themes_categories di bawah tema tipe pos kustom


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

Kemudian untuk mengubah permalink saya telah membuat fungsi berikut


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

Kemudian saya mendaftarkan jenis posting khusus dengan tema siput seperti di bawah ini


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

Ada beberapa hal yang harus Anda ingat ketika mendaftarkan pos kustom. ubah parameter has_archive menjadi nama siput jenis posting kustom dan lainnya adalah ubah nama siput menulis ulang sebagai 'siput' => 'custom_post_type_slug /% taxonomy_slug%

Sekarang ketika Anda menambahkan jenis posting baru di halaman menulis jenis posting ... Anda akan melihat permalink sebagai http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Jika taksonomi khusus untuk posting ini tidak dipilih maka permalink akan tetap http://www.example.com/wordpress/themes/%themes_categories%/post-name/ yang kemudian akan menampilkan permintaan yang buruk. Untuk memperbaikinya, kami membuat istilah default dalam taksonomi khusus. (Sama seperti tanpa kategori dalam kategori) Tambahkan ini ke 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 );

Sekarang ketika taksonomi khusus dibiarkan kosong, permlaink menjadi http://www.example.com/wordpress/themes/other/post-name/ secara otomatis.

Akhirnya jangan lupa untuk menyiram penulisan ulang dengan mengklik simpan perubahan dalam pengaturan permalink di bagian admin jika tidak, Anda akan diarahkan ke 404 kesalahan. Semoga ini bisa membantu Anda.

Rabin shrestha
sumber
Hai, saya punya masalah ... ketika kami menampilkan tautan ke arsip taksonomi menggunakan echo get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ',' '); maka tautan tersebut muncul sebagai www.example.com/taxonomy-term dan bukan www.example.com/themes/taxonomy-term. Saya pikir kita perlu menulis aturan HTACESS untuk itu.
Saurabh Goel
+1, penjelasan luar biasa, diikuti langkah demi langkah dan berhasil, diuji di WordPress 3.4.2
Alex Vang
1
Saya bertanya-tanya: apakah Anda harus menambahkan taksonomi ubahsuaian ke susunan taksonomi saat mendaftarkan jenis pos kustom? Karena tampaknya berfungsi tanpa menambahkannya di sana juga (jika Anda sudah mendaftarkan taksonomi ke jenis pos kustom). Hanya penasaran.
trainoasis
Mencoba ini dengan plugin CPT UI saat masih menggunakan penulisan ulang Anda untuk mengubah URL. Semua terlihat bagus. URL-nya semuanya benar dan saya mereset permalink, tetapi postingan yang sebenarnya menghasilkan 404. :( EDIT: nevermind. Saya telah melewati dan menghapus Hierarchical dari taksonomi dan juga memastikan untuk menyimpan sesuatu dalam urutan yang tepat, dan sekarang posting tersebut sepertinya berhasil.Yah!
Garconis
1

yaitu mendaftarkan taksonomi MY_NEW_CARSSkhusus untuk jenis posting kustom:

$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
sumber