web-dev-qa-db-fra.com

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

Je souhaite créer une taxonomie personnalisée qui se comporte de la même manière que le type de publication, alors qu'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 les types de publication personnalisées soient affiché sous la forme www.example.com/custom-post-type/custom-taxonomy/name/post-name Je souhaite également que la catégorie méta-boîte 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 la zone de taxonomie personnalisée à afficher uniquement lorsque nous ajoutons un nouveau message dans le type de message personnalisé et non lorsque nous ajoutons un nouveau message par défaut.

28
Saurabh Goel

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 le 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 slogan de taxonomie comme ceci: 'taxonomies' => array ('post_tag', 'votre_nom_de_taxonomie') . 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 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 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 en mémoire lors de votre inscription. changez le paramètre has_archive en nom de slug de type post personnalisé et changez le nom de slug de réécriture en '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: http://www.example.com/wordpress/themes/%themes_categories%/nom_post/ . Si la taxonomie personnalisée de ce message n'est pas sélectionnée, le lien permanent restera http://www.example.com/wordpress/themes/%themes_categories%/nom-post/ , qui affichera alors une requête incorrecte. Pour corriger cela, nous créons un terme par défaut dans la taxonomie personnalisée. (identique à 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 );

Désormais, lorsque la taxonomie personnalisée est laissée vide, permlaink devient http://www.example.com/wordpress/themes/other/post-name/ automatiquement.

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

46
Rabin shrestha

c'est-à-dire 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
    }
}
1
T.Todua