it-swarm.com.de

Benutzerdefinierte Taxonomie, die für einen eigenen Beitragstyp spezifisch ist

Ich möchte eine benutzerdefinierte Taxonomie erstellen, die sich ähnlich wie der Beitragstyp verhält, wie sich eine Kategorie gegenüber den Standardbeiträgen verhält (aufgrund der /% category% /% postname%/permalink-Struktur), sodass die Beiträge in den benutzerdefinierten Beitragstypen sind angezeigt als www.example.com/custom-post-type/custom-taxonomy-name/post-name Außerdem möchte ich, dass das Kategorie-Meta-Feld nur angezeigt wird, wenn wir einen neuen Standardbeitrag hinzufügen und nicht, wenn Wir fügen dem benutzerdefinierten Beitragstyp und dem benutzerdefinierten Taxonomiefeld einen neuen Beitrag hinzu, der nur angezeigt wird, wenn wir dem benutzerdefinierten Beitragstyp einen neuen Beitrag hinzufügen, und nicht, wenn wir einen neuen Standardbeitrag hinzufügen.

28
Saurabh Goel

Wenn Sie Taxonomie-Metabox nur für benutzerdefinierten Beitragstyp anzeigen möchten, registrieren Sie die Taxonomie nur für diesen benutzerdefinierten Beitragstyp, indem Sie den Namen des benutzerdefinierten Beitragstyps als Argument in register_taxonomy übergeben. Auf diese Weise wird die Taxonomie-Metabox nur für benutzerdefinierte Beitragstypen angezeigt. Wenn Sie die Kategoriemetabox nicht für einen benutzerdefinierten Beitragstyp anzeigen möchten, entfernen Sie den Begriff category als Argument, während Sie den benutzerdefinierten Beitragstyp registrieren, und geben Sie stattdessen den Namen des Taxonomie-Slugs wie folgt an: 'taxonomies' => array ('post_tag', 'your_taxonomy_name') . Hier ist der Code, wie ich das erreicht habe. Ich habe eine benutzerdefinierte Taxonomie mit slug themes_categories unter "Benutzerdefinierte Themen für Beitragstypen" registriert


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

Dann, um den Permalink zu ändern, habe ich folgende Funktion erstellt


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

Dann habe ich einen benutzerdefinierten Beitragstyp mit Schneckenthemen wie folgt registriert


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

Es gibt einige Dinge, die Sie bei der Registrierung eines benutzerdefinierten Posts beachten müssen. Ändern Sie den Parameter has_archive in einen benutzerdefinierten Slug-Namen für den Beitragstyp und ändern Sie den Slug-Namen zum Umschreiben in 'slug' => 'custom_post_type_slug /% taxonomy_slug%

Wenn Sie nun auf der Seite zum Schreiben von Beiträgen einen neuen Beitragstyp hinzufügen, wird der Permalink als http://www.example.com/wordpress/themes/%themes_categories%/post-name/ angezeigt. Wenn die benutzerdefinierte Taxonomie für diesen Beitrag nicht ausgewählt ist, bleibt der Permalink http://www.example.com/wordpress/themes/%themes_categories%/post-name/ bestehen, der dann eine ungültige Anfrage anzeigt. Um dies zu korrigieren, erstellen wir einen Standardbegriff in der benutzerdefinierten Taxonomie. (wie in Kategorien nicht kategorisiert) Füge dies zu functions.php hinzu

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

Wenn die benutzerdefinierte Taxonomie leer gelassen wird, wird der Permlaink automatisch zu http://www.example.com/wordpress/themes/other/post-name/ .

Vergessen Sie nicht, das Neuschreiben zu löschen, indem Sie auf Änderungen in der Permalink-Einstellung im Admin-Bereich speichern klicken. Andernfalls werden Sie zum 404-Fehler weitergeleitet. Hoffe das hilft dir.

46
Rabin shrestha

d.h. registrieren Sie eine benutzerdefinierte Taxonomie MY_NEW_CARSS für benutzerdefinierte Beitragstypen:

$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
    }
}
1
T.Todua