Ajout de catégories à un type de publication personnalisé en permalien

20

Je sais que des personnes ont déjà posé cette question et sont allées jusqu'à ajouter le type de publication personnalisé et réécrire pour permalink.

Le problème est que j'ai 340 catégories existantes que je voudrais continuer à utiliser. J'avais l'habitude de voir / category / subategory / postname

Maintenant, j'ai le slug custustosttype / postname. La sélection de la catégorie n’apparaît plus dans le permalien ... Je n’ai pas modifié le paramètre de permalien d’administrateur.

Y at-il quelque chose qui me manque ou que je dois ajouter à ce code?

function jcj_club_post_types() {
    register_post_type( 'jcj_club', array(
        'labels' => array(
            'name' => __( 'Jazz Clubs' ),
            'singular_name' => __( 'Jazz Club' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add New Jazz Club' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Jazz Clubs' ),
            'new_item' => __( 'New Jazz Club' ),
            'view' => __( 'View Jazz Club' ),
            'view_item' => __( 'View Jazz Club' ),
            'search_items' => __( 'Search Jazz Clubs' ),
            'not_found' => __( 'No jazz clubs found' ),
            'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
            'parent' => __( 'Parent Jazz Club' ),
        ),
        'public' => true,
        'show_ui' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'menu_position' => 5,
        'query_var' => true,
        'supports' => array( 
            'title',
            'editor',
            'comments',
            'revisions',
            'trackbacks',
            'author',
            'excerpt',
            'thumbnail',
            'custom-fields',
        ),
        'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
        'taxonomies' => array( 'category','post_tag'),
        'can_export' => true,
    )
);
    
posée hash 28.05.2012 - 17:33
la source

4 réponses

15

Vous devez couvrir 2 points d’attaque lorsque vous ajoutez des règles de réécriture de type de post personnalisées:

Réécrire les règles

Cela se produit lorsque les règles de réécriture sont générées dans wp-includes/rewrite.php dans WP_Rewrite::rewrite_rules() . WordPress vous permet de filtrer les règles de réécriture pour des éléments spécifiques tels que les publications, les pages et divers types d’archives. Si vous voyez posttype_rewrite_rules , la partie posttype devrait correspondre au nom de votre type de publication personnalisé. Vous pouvez également utiliser le filtre post_rewrite_rules tant que vous n'effacez pas non plus les règles de publication standard.

Nous avons ensuite besoin de la fonction pour générer les règles de réécriture:

// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );

function add_permastruct( $rules ) {
    global $wp_rewrite;

    // set your desired permalink structure here
    $struct = '/%category%/%year%/%monthnum%/%postname%/';

    // use the WP rewrite rule generating function
    $rules = $wp_rewrite->generate_rewrite_rules(
        $struct,       // the permalink structure
        EP_PERMALINK,  // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
        false,         // Paged: add rewrite rules for paging eg. for archives (not needed here)
        true,          // Feed: add rewrite rules for feed endpoints
        true,          // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
        false,         // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
        true           // Add custom endpoints
    );

    return $rules;
}

Si vous décidez de jouer, la principale chose à surveiller ici est le booléen 'Répertoires de marche'. Il génère des règles de réécriture pour chaque segment d'un permastruct et peut provoquer des incohérences de règles de réécriture. Lorsqu'une URL WordPress est demandée, le tableau de règles de réécriture est vérifié de haut en bas. Dès qu'une correspondance est trouvée, elle charge tout ce qu'elle a rencontré. Par exemple, si votre permastruct a une correspondance gourmande, par exemple. Pour /%category%/%postname%/ et les répertoires de marche sont activés, les règles de réécriture pour /%category%/%postname%/ ET /%category%/ seront affichées, ce qui correspond à tout. Si cela se produit trop tôt, vous êtes foutu.

Liens permanents

C’est la fonction qui analyse le type de lien permalien et convertit un permastruct (par exemple, '/% year% /% monthnum% /% postname% /') en une URL réelle.

La partie suivante est un exemple simple de ce qui serait idéalement une version de la fonction get_permalink() trouvée dans wp-includes/link-template.php . Les post-permaliens personnalisés sont générés par get_post_permalink() , qui est une version beaucoup plus diluée de get_permalink() . get_post_permalink() est filtré par post_type_link , nous l'utilisons donc pour créer une permastructure personnalisée.

// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );

function custom_post_permalink( $permalink, $post, $leavename, $sample ) {

    // only do our stuff if we're using pretty permalinks
    // and if it's our target post type
    if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {

        // remember our desired permalink structure here
        // we need to generate the equivalent with real data
        // to match the rewrite rules set up from before

        $struct = '/%category%/%year%/%monthnum%/%postname%/';

        $rewritecodes = array(
            '%category%',
            '%year%',
            '%monthnum%',
            '%postname%'
        );

        // setup data
        $terms = get_the_terms($post->ID, 'category');
        $unixtime = strtotime( $post->post_date );

        // this code is from get_permalink()
        $category = '';
        if ( strpos($permalink, '%category%') !== false ) {
            $cats = get_the_category($post->ID);
            if ( $cats ) {
                usort($cats, '_usort_terms_by_ID'); // order by ID
                $category = $cats[0]->slug;
                if ( $parent = $cats[0]->parent )
                    $category = get_category_parents($parent, false, '/', true) . $category;
            }
            // show default category in permalinks, without
            // having to assign it explicitly
            if ( empty($category) ) {
                $default_category = get_category( get_option( 'default_category' ) );
                $category = is_wp_error( $default_category ) ? '' : $default_category->slug;
            }
        }

        $replacements = array(
            $category,
            date( 'Y', $unixtime ),
            date( 'm', $unixtime ),
            $post->post_name
        );

        // finish off the permalink
        $permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
        $permalink = user_trailingslashit($permalink, 'single');
    }

    return $permalink;
}

Comme mentionné, il s’agit d’un cas très simplifié permettant de générer un ensemble de règles de réécriture personnalisé et des liens permanents, ce qui n’est pas particulièrement flexible, mais cela devrait suffire à vous aider à démarrer.

Tricher

J'ai écrit un plugin qui vous permet de définir des permastructs pour tout type de post personnalisé, mais comme vous pouvez utiliser %category% dans la structure de lien permanent pour les posts, mon plug-in prend en charge %custom_taxonomy_name% pour toutes les taxonomies personnalisées que vous avez là où custom_taxonomy_name est le nom de votre taxonomie, par exemple. %club% .

Cela fonctionnera comme prévu avec les taxonomies hiérarchiques / non hiérarchiques.

enlace

    
réponse donnée sanchothefat 20.12.2012 - 14:19
la source
1

J'ai trouvé une solution !!!

(Après des recherches sans fin, je peux avoir des types de messages personnalisés tels que:
example.com/category/sub_category/my-post-name

voici le code (dans functions.php ou plugin):

//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');



//===STEP 2  (create desired PERMALINKS)
add_filter('post_type_link',    'my_func88888', 6, 4 );
                        function my_func88888( $post_link, $post, $sdsd){
    if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {  
        $SLUGG = $post->post_name;
        $post_cats = get_the_category($id);     
        if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
            while(!empty($target_CAT->slug)){
                $SLUGG =  $target_CAT->slug .'/'.$SLUGG; 
                if  (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');}   else {break;}
            }
            $post_link= get_option('home').'/'. urldecode($SLUGG);
        }
    }
    return  $post_link;
}


// STEP 3  (by default, while accessing:  "EXAMPLE.COM/category/postname"     WP thinks, that a standard post is requested. So, we are adding CUSTOM POST TYPE into that query.
add_action('pre_get_posts', 'my_func4444',  12); 
                    function my_func4444($q){     
    if ($q->is_main_query() && !is_admin() && $q->is_single){
        $q->set( 'post_type',  array_merge(array('post'), $GLOBALS['my_post_typesss'] )   );
    }
    return $q;
}
    
réponse donnée T.Todua 26.07.2015 - 21:07
la source
1

Vous avez la solution!

Pour obtenir des permaliens hiérarchiques pour le type de post personnalisé, installez le plugin Custom Post Type Permalinks ( enlace ).

Mettez à jour le type de publication enregistrée. J'ai un nom de type de message en tant que centre d'aide

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');

Et voici la taxonomie enregistrée

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');

C’est la ligne qui fait fonctionner votre lien permanent

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",

vous pouvez supprimer %post_id% et conserver /%help_centre_category%/%postname%/"

N'oubliez pas de vider les liens permanents dans le tableau de bord.

    
réponse donnée Varsha Dhadge 20.07.2017 - 14:54
la source
-2

Vous avez plusieurs erreurs avec votre code. J'ai nettoyé votre code existant:

<?php
function jcj_club_post_types() {
  $labels = array(
    'name' => __( 'Jazz Clubs' ),
    'singular_name' => __( 'Jazz Club' ),
    'add_new' => __( 'Add New' ),
    'add_new_item' => __( 'Add New Jazz Club' ),
    'edit' => __( 'Edit' ),
    'edit_item' => __( 'Edit Jazz Clubs' ),
    'new_item' => __( 'New Jazz Club' ),
    'view' => __( 'View Jazz Club' ),
    'view_item' => __( 'View Jazz Club' ),
    'search_items' => __( 'Search Jazz Clubs' ),
    'not_found' => __( 'No jazz clubs found' ),
    'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
    'parent' => __( 'Parent Jazz Club' ),
    );
  $args = array(
    'public' => true,
    'show_ui' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'menu_position' => 5,
    'query_var' => true,
    'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ),
    'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
    'has_archive' => true
    );
  register_post_type( 'jcj_club', $args );
  }
add_action( 'init','jcj_club_post_types' );
?>

Remplacez votre code par le code ci-dessus et voyez si cela fonctionne. Répondez si vous avez d'autres questions et je vais essayer de vous aider.

EDIT:

J'ai remarqué que j'avais oublié 'has_archive' => true .

    
réponse donnée Jeremy Jared 30.05.2012 - 04:30
la source

Lire d'autres questions sur les étiquettes