ลบกระสุนชนิดโพสต์ที่กำหนดเองจาก URL


15

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

โดยพื้นฐานสมมติว่าเรามี "เหตุการณ์" CPT ฉันต้องการจะมีหน้าเหตุการณ์เดียวของมี URL ที่http://domain.com/single-event-nameและไม่http://domain.com/events/single-event-name มีความคิดเกี่ยวกับวิธีการเกี่ยวกับมันได้หรือไม่


อยากรู้เกี่ยวกับสิ่งนั้นเสมอไม่เคยคิดที่จะถามคำถาม ขอบคุณ!
fischi

@robbennet ในปี 2015 ยังไม่มีวิธีที่ถูกต้องในการทำสิ่งนี้อย่างมีสไตล์
Ben Racicot

คำตอบ:


9

นั่นเป็นวิธีที่คุณสามารถทำส่วนแรกของงาน - กำจัดบุ้ง CPT ในลิงค์โพสต์ (เช่นประเภทโพสต์ข่าว)

function df_custom_post_type_link( $post_link, $id = 0 ) {  

    $post = get_post($id);  

    if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )  
        return $post_link;  

    return home_url(user_trailingslashit( "$post->post_name" ));  
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );

ตอนนี้ควรไปกฎการเขียนใหม่สำหรับ 'ข่าว' เพราะคุณจะได้รับข้อผิดพลาด 404

เพิ่มกฎการเขียนซ้ำดังนี้:

function df_custom_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');

จากนั้นเราจะต้องล้างข้อมูลกฎการเขียนซ้ำดังนั้นไปที่การตั้งค่า - ลิงก์และบันทึกการเปลี่ยนแปลง


1
คุณไม่ควรเพิ่มกฎการเขียนซ้ำใน init คุณควรเพิ่มกฎของคุณในกฎปัจจุบัน
Chris_O

2
@Chris_O คุณสามารถทำอย่างละเอียด? เราจะเพิ่มกฎในกฎปัจจุบันได้อย่างไร
Desi

หลังจากเพิ่มรหัสนี้หน้าของฉันทั้งหมดที่มี URL เป็นexample.com/about-usหยุดทำงานหรือไม่ ทางออกใด ๆ สำหรับเรื่องนี้?
ราหุลกุปต้า

4

คุณสามารถลองใช้ปลั๊กอินนี้ ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) สำหรับการลบกระสุน แต่มันจะทำงานเฉพาะในกรณีที่โครงสร้าง Permalink เป็น "/% postname % /


ปลั๊กอินนี้ยอดเยี่ยมจริงๆ! ฉันเป็นผู้ใช้ที่มีประสบการณ์ของปลั๊กอินนี้และฉันแนะนำโดยสิ้นเชิง! นี่คือลิงค์ของเว็บไซต์ปลั๊กอินที่อธิบายในเชิงลึกultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

นี่เป็นปลั๊กอินที่ดีและมีคุณสมบัติที่ฉันต้องการอย่างแน่นอน @bartosz solution คือหนึ่ง CPT โดยเฉพาะแม้ว่าคุณจะได้รับแนวคิดทั่วไปจากมันเช่นกัน หลังจากขุดลงในปลั๊กอินนี้มันชัดเจนแล้วในตอนนี้ขอบคุณ!
fischi

0

คุณสามารถขอลงใน "parse_request" เพื่อทำการตรวจสอบเพื่อดูว่ามีประเภทที่กำหนดเองที่มีชื่อที่ร้องขอมีอยู่แล้วปรับเปลี่ยน query_vars อย่างเหมาะสม คุณจะต้องมีอะไรบางอย่างที่สอดคล้องกับคำตอบของ @ Bartosz เพื่อสร้างความคิดเห็นเพิ่มเติม:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wbobj)
 {
      $vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //we know your "event" entry exists so we now amend the query_vars
           //first unset the 'page' and 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename'];

           //now rebuild the query_vars
           $query_vars['post_type'] = "event"; //CPT name
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
      }
      else
      {
           //just return $wpobj since we know that there is no "event"
           return $wpobj;
      }
 }

สิ่งนี้ถือว่าอย่างไรก็ตามคุณจะไม่มีชื่อโพสต์ที่มีชื่อเหมือนกับชื่อโพสต์มิฉะนั้นโพสต์จะไม่ปรากฏเมื่อตรงกับประเภทเหตุการณ์ก่อน


0
function register_cpt_type() {
    register_post_type('cpt', array(
        'rewrite' => array("slug" => "/cpt", "with_front" => false),
    ));
}
add_action('init', 'register_cpt_type')

function cpt_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');

ล้างข้อมูล / รีไซเคิล url ที่เขียนใหม่แล้วแก้ไข. htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.