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

29

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 einen neuen Beitrag in den benutzerdefinierten hinzufügen Beitragstyp und das benutzerdefinierte Taxonomiefeld werden nur angezeigt, wenn wir einen neuen Beitrag zum benutzerdefinierten Beitragstyp hinzufügen, und nicht, wenn wir einen neuen Standardbeitrag hinzufügen.

Saurabh Goel
quelle

Antworten:

46

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 Kategorie-Metabox 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 Beitrags beachten müssen. Ändern Sie den has_archive-Parameter 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/ und zeigt eine ungültige Anfrage an. 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 Sie die benutzerdefinierte Taxonomie leer lassen, 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.

Rabin Shrestha
quelle
Hey, ich hatte ein Problem ... als wir den Link zum Taxonomie-Archiv mit dem Echo get_the_term_list ausgaben ($ post-> ID, $ taxonomy, '', ',', ''); Dann wird der Link als www.example.com/taxonomy-term und nicht als www.example.com/themes/taxonomy-term angezeigt. Ich denke, wir müssen eine HTACESS-Regel dafür schreiben.
Saurabh Goel
+1, tolle Erklärung, Schritt für Schritt gefolgt und es funktioniert, getestet auf WordPress 3.4.2
Alex Vang
1
Ich habe mich gefragt: Müssen Sie beim Registrieren eines benutzerdefinierten Beitragstyps eine benutzerdefinierte Taxonomie zu den Taxonomien hinzufügen? Weil es zu funktionieren scheint, ohne es dort auch hinzuzufügen (wenn Sie bereits eine Taxonomie für den benutzerdefinierten Beitragstyp registrieren). Nur neugierig.
trainoasis
Versuchte dies mit dem CPT-UI-Plug-in, während Sie weiterhin Ihre Umschreibung zum Ändern der URL verwendeten. Alles sieht gut aus. Die URLs sind alle korrekt und ich habe die Permalinks zurückgesetzt, aber die tatsächlichen Posts werfen eine 404. :( BEARBEITEN: egal. Ich habe Hierarchisch aus der Taxonomie entfernt und auch darauf geachtet, die Dinge in der richtigen Reihenfolge und jetzt die Posts zu speichern scheint zu funktionieren Yah!
Garconis
1

dh registrieren Sie eine benutzerdefinierte Taxonomie MY_NEW_CARSSfü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
    }
}
T.Todua
quelle