Taxonomie personnalisée spécifique à un type de publication personnalisée

26

Je souhaite créer une taxonomie personnalisée qui se comporte de la même manière que le type de publication, car une catégorie se comporte de la même manière que les publications par défaut (sur la base de la structure /% category% /% postname% / permalink) afin que les publications dans la personnalisation les types de message sont affichés comme www.example.com/custom-post-type/custom-taxonomy-name/post-name De plus, je souhaite que la boîte à méta de catégorie apparaisse uniquement lorsque nous ajoutons un nouveau message par défaut, et non lorsque nous ajoutons un nouveau message dans le type de message personnalisé et que la boîte de taxonomie personnalisée ne s'affiche que lorsque nous ajoutons un nouveau message. dans le type de message personnalisé et non lorsque nous ajoutons un nouveau message par défaut.

    
posée Saurabh Goel 05.07.2012 - 12:22

2 réponses

45

Tout d'abord, si vous souhaitez afficher la taxonomie metabox uniquement dans le type de publication personnalisé, enregistrez la taxonomie dans ce type de publication uniquement en transmettant le nom du type de publication personnalisé en tant qu'argument dans register_taxonomy. En faisant cela, la taxonomie metabox apparaît uniquement dans le type de publication personnalisé. Si vous ne souhaitez pas afficher la catégorie metabox dans un type de publication personnalisé, supprimez le terme category en tant qu'argument lors de l'enregistrement du type de publication personnalisé et incluez plutôt le nom du slug de taxonomie comme ceci: 'taxonomies' = > array ('post_tag', 'votre_nom_de_personne'). voici le code comment j'ai réalisé cela. J'ai enregistré une taxonomie personnalisée avec slug themes_categories sous sous thèmes de type de message personnalisé


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

Ensuite, pour modifier le lien permanent que j’ai créé avec la fonction suivante


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

Ensuite, j'ai enregistré un type d'article personnalisé avec des thèmes slug comme ci-dessous


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

Il y a peu de choses que vous devez garder à l'esprit lors de l'enregistrement d'un message personnalisé. remplacez le paramètre has_archive par le nom de slug de type de publication personnalisé, puis changez le nom de slug de réécriture par 'slug' = > 'custom_post_type_slug /% taxonomy_slug%

Maintenant, lorsque vous ajoutez un nouveau type de message dans la page de type de message en écriture ... vous verrez le lien permanent comme suit: enlace . Si la taxonomie personnalisée de ce message n'est pas sélectionnée, le lien permanent reste enlace , ce qui indique une requête incorrecte. Pour corriger cela, nous créons un terme par défaut dans la taxonomie personnalisée. (idem non classé dans les catégories) Ajoutez ceci à 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 );

Maintenant, lorsque la taxonomie personnalisée est laissée en blanc, la permlaink devient enlace automatiquement.

Enfin, n'oubliez pas de vider la réécriture en cliquant sur enregistrer les modifications du paramètre de permalien dans la section admin. Dans le cas contraire, vous serez redirigé vers une erreur 404. J'espère que cela vous aide.

    
réponse donnée Rabin shrestha 05.07.2012 - 16:52
1

i.e. enregistrer une taxonomie personnalisée MY_NEW_CARSS pour les types de publication personnalisés:

$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
    }
}
    
réponse donnée T.Todua 25.07.2015 - 20:32

Lire d'autres questions sur les étiquettes