web-dev-qa-db-fra.com

Ajout de catégories au type de message personnalisé en permalien

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/subcategory/postname

Maintenant, j'ai le slug de customposttype/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 de l'administrateur.

Y a-t-il quelque chose qui me manque ou que j'ai besoin d'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,
    )
);
22
hash

Lorsque vous ajoutez des règles de réécriture de type de message personnalisées, vous devez couvrir 2 points d’attaque:

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. Où 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.

Ensuite, nous avons 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;
}

La chose principale à surveiller ici si vous décidez de jouer 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 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 dessus, il générera des règles de réécriture pour /%category%/%postname%/ ET /%category%/ qui correspondront à tout. Si cela se produit trop tôt, vous êtes foutu.

Permaliens

C'est la fonction qui analyse le type de message permaliens 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 moins claire 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é précédemment, 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.

La triche

J'ai écrit un plugin qui vous permet de définir des permastructure pour tous les types de post personnalisés, mais vous pouvez utiliser %category% dans la structure de permalien pour les posts, mon plugin supporte %custom_taxonomy_name% pour toutes les taxonomies personnalisées que vous avez également, 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.

http://wordpress.org/extend/plugins/wp-permastructure/

16
sanchothefat

J'ai trouvé une solution!!!

(Après d’innombrables recherches, je peux avoir CUSTOM POST TYPE permaliens comme:
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;
}
1
T.Todua

Vous avez la solution!

Pour avoir des liens permanents hiérarchiques pour le type de message personnalisé, installez le plug-in Custom Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Mettre à jour le type de message enregistré. J'ai le nom du type de poste comme 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');

Ceci est la ligne rend votre travail 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 permaliens du tableau de bord.

1
Varsha Dhadge