Redeclare / Change Slug ของประเภทการโพสต์ที่กำหนดเองของปลั๊กอิน


28

เป็นไปได้ที่จะ redeclare / เปลี่ยนกระสุนของโพสต์แบบกำหนดเองที่มีอยู่ของปลั๊กอิน (โดยไม่ต้องแก้ไขปลั๊กอิน)?

นั่นคือถ้า Plugin X สร้างประเภทโพสต์ที่กำหนดเองด้วยกระสุน / uncookedtoast / เป็นไปได้หรือไม่ที่จะเพิ่มตัวกรองไปยัง functions.php


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

คำตอบ:


24

ใช่มันเป็นไปได้ แต่ถ้าปลั๊กอินกำลังสร้างประเภทโพสต์ที่กำหนดเองโดยใช้rewrite => array('slug' => 'post_type')พารามิเตอร์ก็ไม่น่าที่คุณจะสามารถแทนที่กระสุนได้

เมื่อใดก็ตามที่มีการสร้างประเภทโพสต์ที่กำหนดเองกฎการเขียน URL ซ้ำจะถูกเขียนไปยังฐานข้อมูล ขึ้นอยู่กับการกระทำที่ก่อให้เกิดการสร้างประเภทโพสต์ที่กำหนดเอง (เช่นการกระทำinit ), WordPress จะล้างกฎการเขียนซ้ำและคืนค่าตัวบุ้งของโพสต์แบบกำหนดเองโดยไม่คำนึงถึงการเปลี่ยนแปลงที่คุณพยายามทำ

ที่กล่าวว่าคุณสามารถให้กระสุนที่กำหนดเองสำหรับประเภทโพสต์ที่กำหนดเอง ตัวอย่างต่อไปนี้สมมติว่าคุณมีประเภทโพสต์ที่กำหนดเองmoviesและการที่คุณกำลังพยายามที่จะเปลี่ยนกระสุนไป/movies//films/

ให้เสร็จสมบูรณ์นี่คือฟังก์ชันพื้นฐานที่ใช้เพื่อกำหนดmoviesประเภทโพสต์ที่กำหนดเอง ปลั๊กอินที่คุณอ้างอิงควรทำสิ่งนี้:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

คุณสามารถปรับเปลี่ยนตารางตัวเลือกได้โดยระบุกฎที่คุณกำหนดเองตามประเภทการโพสต์ที่มีอยู่

โดยพื้นฐานแล้วเราจะทำสิ่งนี้:

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

นี่คือวิธีที่คุณสามารถทำได้:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

ตอนนี้คุณมีสองวิธีในการเข้าถึงภาพยนตร์ของคุณ:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

โปรดทราบว่าฉันไม่แนะนำให้add_custom_rewrite_ruleเข้าไปเกี่ยวกับinitการกระทำเพราะมันจะยิงบ่อยเกินไป นี่เป็นเพียงตัวอย่าง สถานที่ที่ดีกว่าในการใช้ฟังก์ชั่นนี้คือการเปิดใช้งานธีมการเปิดใช้งานปลั๊กอินการกระทำของ save_post ฯลฯ โดยขึ้นอยู่กับสิ่งที่คุณต้องทำคุณอาจต้องทำการเปิดใช้เพียงครั้งเดียวหรือสองสามครั้ง

ณ จุดนี้คุณอาจต้องการพิจารณาอัปเดตลิงก์สำหรับประเภทโพสต์ที่กำหนดเองเพื่อใช้งาน ' /movies/กระสุน ตัวอย่างเช่นหากคุณนำทาง/films/คุณจะเห็นรายชื่อภาพยนตร์ทั้งหมดของคุณ แต่การโฮเวอร์เหนือชื่อเรื่องจะเปิดเผยว่า/movies/กระสุนยังคงถูกใช้อยู่

หากต้องการไปอีกขั้นหนึ่งคุณสามารถติดตั้งการเปลี่ยนเส้นทาง 301 เพื่อจับลิงก์ทั้งหมดไป/movies/ยังการเปลี่ยนเส้นทางไปยัง/films/คู่ของพวกเขาทางเทคนิคแต่ทั้งหมดนี้ขึ้นอยู่กับสิ่งที่คุณพยายามทำ


ทำงานได้อย่างสวยงาม! คุณสามารถชี้ฉันในทิศทางที่ถูกต้องสำหรับการอัพเดทลิงก์หรือไม่
Edbury

1
คุณสามารถทำได้ในระดับแม่แบบทั้งนี้ขึ้นอยู่กับธีมของคุณ เมื่อคุณเห็นการเรียกไปที่ 'the_title ()' คุณสามารถแทนที่ด้วย $ title = get_the_title () จากนั้นสตริงจะแทนที่ '/ ภาพยนตร์ /' ใน $ title ด้วย '/ films /'
ทอม

จะเกิดอะไรขึ้นถ้ากระสุนที่คุณต้องการเปลี่ยนนั้นถูกสร้างขึ้นแบบไดนามิกด้วยค่าเมตาของโพสต์ปัจจุบัน ฉันจะต้องสามารถที่จะใช้$postในadd_custom_rewrite_rule()การทำงาน แต่ก็โยนความผิดพลาดใน WP ธุรการบอกว่าพยายามที่จะได้รับทรัพย์สินที่ไม่ใช่วัตถุ ฉันจะได้รับ $ โพสต์เพื่อรับค่าเมตาได้อย่างไร
Lee

6

รหัสนี้ทำงานได้ดีสำหรับธีมลูกของฉัน จำเป็นต้องเปลี่ยน "โปรแกรม" กระสุนเป็น "สถานที่"

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

มันทำงานได้อย่างสมบูรณ์ฉันยังใช้มันสำหรับแท็กที่เพิ่มกฎที่เกี่ยวข้องมีความจำเป็นต้องปรับปรุงลิงก์ถาวรโดยดำเนินการบันทึกจากหน้าการตั้งค่า> ลิงก์ถาวร ขอขอบคุณ!
Lorenzo Magon

ทำงานได้อย่างสมบูรณ์เพื่อเปลี่ยนชิ้นส่วนอื่น ๆ เช่นกันฉันต้องตั้งค่า$args['has_archive'] = falseและใช้งานได้
การพัฒนาเพียง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.