Menambahkan kategori ke jenis posting khusus di permalink

22

Saya tahu orang-orang telah menanyakan hal ini sebelumnya dan telah menambahkan jenis posting kustom, dan menulis ulang untuk permalink.

Masalahnya adalah saya memiliki 340 kategori yang ada yang ingin terus saya gunakan. Saya dulu bisa melihat / kategori / subkategori / postname

Sekarang saya memiliki siput customposttype / postname. Memilih kategori tidak lagi muncul di permalink ... Saya belum mengubah pengaturan permalink di admin menjadi sesuatu yang berbeda.

Apakah ada sesuatu yang saya lewatkan atau perlu tambahkan ke kode ini?

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,
    )
);
hash
sumber
2
ini mungkin pertanyaan yang konyol, tetapi apakah Anda sudah menyiram penulisan ulang?
kristina childs
Baru-baru ini, saya menghadapi masalah ini. Terpecahkan! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

Jawaban:

16

Ada 2 titik serangan yang harus dibahas ketika Anda menambahkan aturan penulisan ulang jenis posting khusus:

Aturan penulisan ulang

Ini terjadi ketika aturan penulisan ulang dibuat wp-includes/rewrite.phpdi WP_Rewrite::rewrite_rules(). WordPress memungkinkan Anda untuk memfilter aturan penulisan ulang untuk elemen tertentu seperti posting, halaman, dan berbagai jenis arsip. Di mana Anda melihat posttype_rewrite_rulesyang posttypebagian harus merupakan nama dari jenis posting kustom Anda. Atau Anda dapat menggunakan post_rewrite_rulesfilter selama Anda tidak melenyapkan aturan pos standar juga.

Selanjutnya kita membutuhkan fungsi untuk benar-benar menghasilkan aturan penulisan ulang:

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

Hal utama yang harus diperhatikan di sini jika Anda memutuskan untuk bermain-main adalah boolean 'Walk directories'. Ini menghasilkan aturan penulisan ulang untuk setiap segmen permastruct dan dapat menyebabkan ketidaksesuaian aturan penulisan ulang. Ketika URL WordPress diminta, susunan aturan penulisan ulang diperiksa dari atas ke bawah. Segera setelah ditemukan kecocokan, itu akan memuat apa pun yang telah ditemukan, jadi misalnya jika permastruct Anda memiliki kecocokan serakah misalnya. karena /%category%/%postname%/dan berjalan direktori ada di dalamnya akan menghasilkan aturan penulisan ulang untuk kedua /%category%/%postname%/DAN /%category%/yang akan cocok dengan apa pun. Jika itu terjadi terlalu dini, Anda kacau.

Permalinks

Ini adalah fungsi yang mem-parsing permalink jenis posting dan mengubah permastruct (misalnya '/% tahun% /% monthnum% /% postname% /') menjadi URL yang sebenarnya.

Bagian selanjutnya adalah contoh sederhana dari apa yang idealnya menjadi versi get_permalink()fungsi yang ditemukan di wp-includes/link-template.php. Permalinks pos kustom dibuat oleh get_post_permalink()yang merupakan versi yang banyak dipermudah get_permalink(). get_post_permalink()difilter oleh post_type_linkjadi kami menggunakannya untuk membuat permastruktur khusus.

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

Seperti yang disebutkan ini, kasus yang sangat sederhana untuk membuat aturan penulisan ulang dan permalink yang khusus, dan tidak terlalu fleksibel tetapi harus cukup untuk Anda mulai.

Curang

Saya menulis sebuah plugin yang memungkinkan Anda mendefinisikan permastructs untuk setiap jenis posting kustom, tetapi seperti Anda dapat menggunakan %category%dalam struktur permalink untuk posting plugin saya mendukung %custom_taxonomy_name%untuk setiap taksonomi kustom yang Anda miliki juga di mana custom_taxonomy_namenama taksonomi Anda misalnya. %club%.

Ini akan berfungsi seperti yang Anda harapkan dengan taksonomi hierarkis / non-hierarkis.

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

sanchothefat
sumber
1
pluginnya bagus, tetapi bisakah Anda menjelaskan cara memperbaiki masalah dalam pertanyaan tanpa plugin Anda?
Eugene Manuilov
Saya setuju bahwa ada plugin yang bagus untuk mengatasinya (saya telah membookmarknya dan itu yang pertama kali muncul di benak saya tentang Q ini), tetapi jawabannya akan mendapat manfaat dari ringkasan singkat tentang apa masalahnya dan bagaimana plugin menaklukkannya. :)
Rarst
@EugeneManuilov Baiklah, maaf itu jawaban yang panjang. Itu dengan saya menelanjangi ke dasar juga!
sanchothefat
Sepertinya yang pertama $permalink = home_url(...diganti oleh $permalink = user_trailingslashit(...dan tidak pernah digunakan. Atau apakah saya melewatkan sesuatu? $post_linkbahkan tidak didefinisikan. Apakah itu seharusnya $permalink = user_trailingslashit( $permalink, 'single' );?
Ian Dunn
Tangkapan yang bagus, seharusnya $permalinktidak $post_link. Cheers :)
sanchothefat
1

Dapatkan solusinya!

Untuk memiliki permalink hierarkis untuk jenis posting kustom, pasang Permalink Jenis Posting Kustom ( https://wordpress.org/plugins/custom-post-type-permalinks/ ) plugin.

Perbarui jenis posting terdaftar. Saya memiliki nama jenis posting sebagai pusat bantuan

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

Dan di sini adalah taksonomi terdaftar

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

Baris ini membuat permalink Anda berfungsi

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

Anda dapat menghapus %post_id%dan menyimpannya/%help_centre_category%/%postname%/"

Jangan lupa untuk membersihkan permalink dari dasbor.

Varsha Dhadge
sumber
+1 solusi paling sederhana adalah dengan menggunakan plugin ini: wordpress.org/plugins/custom-post-type-permalinks berfungsi dengan baik
Jules
Ya, tapi itu untuk jika Anda memiliki satu jenis posting khusus tetapi jika Anda memiliki beberapa jenis posting kustom dalam tema tunggal maka di atas adalah solusinya. Selain itu juga mengubah siput kategori Anda sama dengan siput tipe posting Anda.
Varsha Dhadge
1

Saya telah menemukan SOLUSI !!!

(Setelah penelitian tanpa akhir .. Saya dapat memiliki permalink TYPE POST CUSTOM seperti:
example.com/category/sub_category/my-post-name

di sini kode (dalam functions.php atau 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;
}
T.Todua
sumber
-2

Anda memiliki beberapa kesalahan dengan kode Anda. Saya membersihkan kode Anda yang sudah ada:

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

Ganti kode Anda dengan kode di atas dan lihat apakah itu berfungsi. Balas kembali jika Anda memiliki pertanyaan lebih lanjut dan saya akan mencoba membantu.

EDIT:

Saya perhatikan saya ditinggalkan 'has_archive' => true.

Jeremy Jared
sumber