การเพิ่มหมวดหมู่ไปยังประเภทโพสต์ที่กำหนดเองใน Permalink


22

ฉันรู้ว่าผู้คนเคยถามสิ่งนี้มาก่อนและได้เพิ่มการเพิ่มประเภทโพสต์ที่กำหนดเองไปแล้วและเขียนทับความคิดเห็น

ปัญหาคือฉันมี 340 หมวดหมู่ที่มีอยู่ซึ่งฉันต้องการใช้ต่อไป ฉันเคยเห็น / category / subcategory / postname

ตอนนี้ฉันมีบุ้งของ customposttype / postname การเลือกหมวดหมู่ไม่แสดงในลิงก์ถาวรอีกต่อไป ... ฉันไม่ได้เปลี่ยนการตั้งค่าลิงก์ถาวรในผู้ดูแลระบบเป็นสิ่งอื่น

มีบางอย่างที่ฉันขาดหายไปหรือจำเป็นต้องเพิ่มรหัสนี้หรือไม่

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

2
นี่อาจเป็นคำถามที่งี่เง่า แต่คุณล้างการเขียนใหม่หรือไม่?
Kristina Childs

เมื่อเร็ว ๆ นี้ฉันประสบปัญหานี้ แก้ไข! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817//
maheshwaghmare

คำตอบ:


16

การโจมตีมี 2 จุดที่จะครอบคลุมเมื่อคุณเพิ่มกฎการเขียนชนิดโพสต์ที่กำหนดเอง:

เขียนกฎใหม่

นี้เกิดขึ้นเมื่อเขียนกฎที่ถูกสร้างขึ้นในในwp-includes/rewrite.php WP_Rewrite::rewrite_rules()WordPress อนุญาตให้คุณกรองกฎการเขียนซ้ำสำหรับองค์ประกอบเฉพาะเช่นโพสต์หน้าและการเก็บถาวรประเภทต่างๆ ที่คุณเห็นส่วนหนึ่งควรเป็นชื่อของประเภทโพสต์ที่คุณกำหนดเอง หรือคุณสามารถใช้ตัวกรองได้ตราบใดที่คุณไม่ลบล้างกฎการโพสต์มาตรฐานเช่นกันposttype_rewrite_rulesposttypepost_rewrite_rules

ต่อไปเราต้องการฟังก์ชันเพื่อสร้างกฎการเขียนซ้ำจริง ๆ :

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

สิ่งสำคัญที่ต้องระวังที่นี่ถ้าคุณตัดสินใจที่จะเล่นคือบูลีน 'Walk ไดเรกทอรี' มันสร้างกฎการเขียนซ้ำสำหรับแต่ละส่วนของ permastruct และอาจทำให้กฎการเขียนซ้ำไม่ตรงกัน เมื่อมีการร้องขอ URL ของ WordPress อาร์เรย์กฎการเขียนซ้ำจะถูกตรวจสอบจากบนลงล่าง ทันทีที่พบการแข่งขันมันจะโหลดทุกอย่างที่มันเจอตัวอย่างเช่นถ้าการเรียงโครงสร้างของคุณมีการแข่งขันโลภมากเช่น สำหรับ/%category%/%postname%/และไดเรกทอรีเดินอยู่บนมันจะส่งออกกฎการเขียนใหม่สำหรับทั้งสอง/%category%/%postname%/และ/%category%/ที่จะจับคู่อะไร หากเกิดขึ้นเร็วเกินไปคุณกำลังเมา

Permalinks

นี่คือฟังก์ชันที่แยกวิเคราะห์ประเภทการโพสต์ permalink และแปลง permastruct (เช่น '/% ปี% /% monthnum% /% ชื่อโพสต์% /') เป็น URL จริง

ส่วนต่อไปเป็นตัวอย่างง่ายๆของสิ่งที่นึกคิดจะเป็นรุ่นที่ฟังก์ชั่นที่พบในget_permalink() wp-includes/link-template.phpที่กำหนดเอง Permalinks โพสต์จะถูกสร้างโดยซึ่งเป็นรุ่นที่เลียนแบบมากget_post_permalink() ถูกกรองโดยดังนั้นเราจึงใช้มันเพื่อสร้างโครงสร้างที่กำหนดเองget_permalink()get_post_permalink()post_type_link

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

ดังที่ได้กล่าวมานี้เป็นกรณีที่ง่ายมากสำหรับการสร้าง ruleset rewrite ที่กำหนดเองและ permalinks และไม่ยืดหยุ่นโดยเฉพาะอย่างยิ่ง แต่มันก็เพียงพอที่จะให้คุณเริ่มต้น

การโกง

ฉันเขียนปลั๊กอินที่ให้คุณกำหนด permastructs สำหรับโพสต์แบบกำหนดเองใด ๆ ได้ แต่อย่างที่คุณสามารถใช้%category%ในโครงสร้างลิงก์ถาวรสำหรับโพสต์ปลั๊กอินของฉันรองรับ%custom_taxonomy_name%การ taxonomies แบบกำหนดเองใด ๆ ที่คุณมีcustom_taxonomy_nameเช่นกัน %club%.

มันจะทำงานได้ตามที่คุณคาดหวังกับ taxonomies ลำดับชั้น / ไม่ใช่ลำดับชั้น

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


1
ปลั๊กอินนั้นยอดเยี่ยม แต่คุณสามารถอธิบายวิธีแก้ไขปัญหาในคำถามโดยไม่ใช้ปลั๊กอินได้หรือไม่
Eugene Manuilov

ฉันยอมรับว่ามันยอดเยี่ยมมากที่มีปลั๊กอินสำหรับจัดการมัน (ฉันมีบุ๊กมาร์กไว้และเป็นสิ่งแรกที่มาถึงใจของฉันในคำถามนี้) แต่คำตอบจะได้รับประโยชน์จากการสรุปสั้น ๆ ว่าปัญหาคืออะไรและปลั๊กอินเอาชนะอย่างไร :)
Rarst

@EugeneManuilov เอาล่ะขอโทษนะมันเป็นคำตอบที่ยาวมาก นั่นคือกับฉันปอกลงไปที่พื้นฐานเกินไป!
sanchothefat

ดูเหมือนว่าคนแรก$permalink = home_url(...จะถูกแทนที่โดย$permalink = user_trailingslashit(...และไม่เคยใช้ หรือฉันกำลังพลาดอะไรอยู่? $post_linkไม่ได้กำหนดไว้ มันควรจะเป็น$permalink = user_trailingslashit( $permalink, 'single' );อย่างไร
Ian Dunn

ดีจับมันควรจะเป็นไม่ได้$permalink $post_linkไชโย :)
sanchothefat

1

เตรียมพร้อมทางออก!

หากต้องการให้ลิงก์ถาวรแบบลำดับชั้นสำหรับประเภทโพสต์ที่กำหนดเองติดตั้งประเภทโพสต์ที่กำหนดเอง Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ) ปลั๊กอิน

อัปเดตประเภทโพสต์ที่ลงทะเบียน ฉันมีชื่อโพสต์เป็นศูนย์ช่วยเหลือ

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

และนี่คืออนุกรมวิธานที่ลงทะเบียน

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

นี่คือบรรทัดที่ทำให้ลิงก์ของคุณทำงานได้

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

คุณสามารถลบ%post_id%และสามารถเก็บ/%help_centre_category%/%postname%/"

อย่าลืมล้างข้อมูลจากแดชบอร์ด


+1 ทางออกที่ง่ายที่สุดคือการใช้ปลั๊กอินนี้: wordpress.org/plugins/custom-post-type-permalinksทำงานได้อย่างสมบูรณ์แบบ
Jules

ใช่ แต่ใช้สำหรับหากคุณมีประเภทโพสต์ที่กำหนดเองเพียงอย่างเดียว แต่หากคุณมีประเภทโพสต์ที่กำหนดเองหลายรายการในธีมเดียวด้านบนเป็นวิธีแก้ปัญหา นอกจากนี้มันยังเปลี่ยนทากหมวดหมู่ของคุณเช่นเดียวกับทากประเภทโพสต์
Varsha Dhadge

1

ฉันได้พบวิธีแก้ไขปัญหา !!!

(หลังจากการวิจัยที่ไม่มีที่สิ้นสุด .. ฉันสามารถกำหนดประเภทลิงก์โพสต์ที่กำหนดเองเช่น:
example.com/category/sub_category/my-post-name

นี่คือรหัส (ใน functions.php หรือปลั๊กอิน):

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

-2

คุณมีข้อผิดพลาดหลายประการกับรหัสของคุณ ฉันล้างรหัสที่มีอยู่ของคุณ:

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

แทนที่รหัสของคุณด้วยรหัสด้านบนและดูว่ามันทำงานได้หรือไม่ ตอบกลับหากคุณมีคำถามเพิ่มเติมและฉันจะพยายามช่วย

แก้ไข:

ฉันสังเกตว่าฉันออก'has_archive' => trueไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.