Özel Gönderi türüne özgü özel Taksonomi


29

Bir gönderi tipine benzer olarak davranan özel bir taksonomi oluşturmak istiyorum. Bir kategori varsayılan gönderilere göre davranmaktadır (/% kategori% /% postname% / permalink yapısının temelinde). www.example.com/custom-post-type/custom-taxonomy-name/post-name olarak görüntüleniyor Ayrıca, kategori meta kutusunun yalnızca yeni varsayılan yazı eklediğimizde ve özelliğe yeni bir yazı eklediğimizde görünmesini istiyorum yazı tipi ve özel taksonomi kutusu yalnızca özel yazı türüne yeni bir yazı eklediğimizde görünür, varsayılan yazı eklediğimizde görünmez.

Yanıtlar:


46

Öncelikle, sadece özel yazı tipine taksonomi meta kutusunu göstermek istiyorsanız, özel yazı tipi ismini register_taxonomy değişkeninde argüman olarak ileterek taksonomiyi sadece bu özel yazı tipine kaydedin. Bunu yaparak taksonomi meta kutusu yalnızca özel yazı tipine görünür. Özel yazı türüne kategori meta kutusunu göstermek istemiyorsanız, özel yazı türünü kaydederken argüman olarak terim kategorisini kaldırın ve bunun yerine 'taksonomiler' => array ('post_tag', 'your_taxonomy_name') taksonomisi slug adını ekleyin. . İşte buna nasıl ulaştığım kod. Özel yazı tipi temaları altında, slug themes_categorileri ile özel bir taksonomi kaydettim.


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

Daha sonra aşağıdaki fonksiyonu oluşturduğum permalinki değiştirmek


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

Sonra slug temalarını içeren özel bir gönderi tipini aşağıdaki gibi kaydettim.


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

Özel gönderiyi kaydederken hatırlamanız gereken birkaç şey var. has_archive parametresini özel yazı tipi slug adı olarak değiştirdikten sonra bir başkası, yeniden yazma slug adını 'slug' => 'olarak değiştirir. custom_post_type_slug /% taxonomy_slug%

Şimdi yazılan yazı tipi sayfasına yeni bir yazı türü eklediğinizde ... kalıcı bağlantıyı http://www.example.com/wordpress/themes/%themes_category%/post-name/ olarak görürsünüz . Bu gönderi için özel taksonomi seçilmezse, kalıcı bağlantı http://www.example.com/wordpress/themes/%themes_category%/post-name/ olarak kalır ve bu kötü bir istek gösterir. Bunu düzeltmek için, özel taksonomide varsayılan bir terim oluşturuyoruz. (kategorilerde kategorize edilmemiş olanlar ile aynı)

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

Artık özel taksonomi boş bırakıldığında, permlaink otomatik olarak http://www.example.com/wordpress/themes/other/post-name/ olur .

Sonunda admin bölümündeki permalink ayarındaki değişiklikleri kaydet düğmesine tıklayarak yeniden yazmayı unutma, aksi halde 404 hatasına yönlendirileceksiniz. Umarım bu size yardımcı olur.


Hey, ben bir sorun yaşadım ... echo get_the_term_list ($ post-> ID, $ taxonomy, '', ',' ') kullanarak taksonomi arşivinin bağlantısını çıktığımızda; Daha sonra, bağlantı www.example.com/taxonomy-term olarak görünür ve www.example.com/themes/taxonomy-term olarak görünür. Bunun için bir HTACESS kuralı yazmamız gerektiğini düşünüyorum.
Saurabh Goel

+1, harika açıklama, adım adım izledi ve çalışıyor, WordPress 3.4.2'de test edildi
Alex Vang

1
Merak ediyordum: Özel bir yazı türü kaydederken taksonomi dizisine özel taksonomi eklemek zorunda mısınız? Çünkü oraya eklemeden de çalışıyor gibi görünüyor (zaten özel yazı tipine bir taksonomi kaydettiyseniz). Sadece merak.
trainoasis

URL’yi değiştirmek için yeniden yazınızı kullanırken hala CPT UI eklentisi ile denedim. Her şey iyi görünüyor. URL'lerin hepsi doğru ve kalıcı bağlantıları sıfırlıyorum, ancak asıl gönderiler bir 404 atıyor. :( EDIT: nevermind. iş gibi görünüyor Yah!
Garconis

1

yani MY_NEW_CARSS, özel yazı tipleri için özel bir taksonomi kaydetme :

$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
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.