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

29

Je souhaite créer une taxonomie personnalisée qui se comporte de la même manière que le type de publication en tant que catégorie se comporte comme une publication par défaut (en raison de /% category% /% postname% / structure permalink) afin que les publications dans les types de publication personnalisés soient affiché comme www.example.com/custom-post-type/custom-taxonomy-name/post-name Aussi, je veux que la méta-boîte de catégorie n'apparaisse que lorsque nous ajoutons un nouveau message par défaut et non lorsque nous ajoutons un nouveau message dans la coutume le type de publication et la zone de taxonomie personnalisée n'apparaissent que lorsque nous ajoutons une nouvelle publication dans le type de publication personnalisé et non lorsque nous ajoutons une nouvelle publication par défaut.

Saurabh Goel
la source

Réponses:

46

Tout d'abord, si vous souhaitez afficher la métabox de taxonomie uniquement pour le type de publication personnalisé, enregistrez la taxonomie uniquement pour ce type de publication personnalisé en passant le nom du type de publication personnalisé comme argument dans register_taxonomy. En faisant cela, la métabox de taxonomie n'apparaît que pour le type de publication personnalisé. Si vous ne souhaitez pas afficher la métabox de catégorie dans le type de publication personnalisé, supprimez le terme catégorie comme argument lors de l'enregistrement du type de publication personnalisé et incluez plutôt le nom du slug de taxonomie comme ceci 'taxonomies' => tableau ('post_tag', 'your_taxonomy_name') . voici le code pour y parvenir. 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 changer le permalien, j'ai créé 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 de publication personnalisé avec des thèmes de limaces 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 dont vous devez vous souvenir lors de l'enregistrement d'une publication personnalisée. changer le paramètre has_archive en nom de slug de type de message personnalisé et un autre est de changer le nom du slug de réécriture comme 'slug' => 'custom_post_type_slug /% taxonomy_slug%

Maintenant, lorsque vous ajoutez un nouveau type de publication dans la page d'écriture du type de publication ... vous verrez le permalien comme http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Si la taxonomie personnalisée pour ce message n'est pas sélectionnée, le permalien restera http://www.example.com/wordpress/themes/%themes_categories%/post-name/ qui affichera alors une mauvaise demande. Pour corriger cela, nous créons un terme par défaut dans la taxonomie personnalisée. (Identique à non catégorisé 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 automatiquement http://www.example.com/wordpress/themes/other/post-name/ .

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

Rabin shrestha
la source
Hé, j'ai eu un problème ... lorsque nous avons généré le lien vers l'archive de taxonomie à l'aide de l'écho get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); le lien apparaît alors sous la forme www.example.com/taxonomy-term et non www.example.com/themes/taxonomy-term. Je pense que nous devons écrire une règle HTACESS pour cela.
Saurabh Goel
+1, grande explication, suivi étape par étape et ça marche, testé sur WordPress 3.4.2
Alex Vang
1
Je me demandais: devez-vous ajouter une taxonomie personnalisée à la gamme de taxonomies lors de l'enregistrement d'un type de publication personnalisé? Parce qu'il semble fonctionner sans l'ajouter là aussi (si vous enregistrez déjà une taxonomie au type de message personnalisé). Juste curieux.
trainoasis
J'ai essayé cela avec le plugin CPT UI tout en utilisant votre réécriture pour changer l'URL. Tout a l'air bien. les URL sont toutes correctes et j'ai réinitialisé les permaliens, mais les messages réels lancent un 404. :( EDIT: nevermind. J'ai parcouru et supprimé Hierarchical de la taxonomie et j'ai également veillé à enregistrer les choses dans le bon ordre, et maintenant les messages Yah!
Garconis
1

c'est-à-dire enregistrer une taxonomie MY_NEW_CARSSpersonnalisée 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
    }
}
T.Todua
la source