เป็นไปได้ที่จะ redeclare / เปลี่ยนกระสุนของโพสต์แบบกำหนดเองที่มีอยู่ของปลั๊กอิน (โดยไม่ต้องแก้ไขปลั๊กอิน)?
นั่นคือถ้า Plugin X สร้างประเภทโพสต์ที่กำหนดเองด้วยกระสุน / uncookedtoast / เป็นไปได้หรือไม่ที่จะเพิ่มตัวกรองไปยัง functions.php
เป็นไปได้ที่จะ redeclare / เปลี่ยนกระสุนของโพสต์แบบกำหนดเองที่มีอยู่ของปลั๊กอิน (โดยไม่ต้องแก้ไขปลั๊กอิน)?
นั่นคือถ้า Plugin X สร้างประเภทโพสต์ที่กำหนดเองด้วยกระสุน / uncookedtoast / เป็นไปได้หรือไม่ที่จะเพิ่มตัวกรองไปยัง functions.php
คำตอบ:
ใช่มันเป็นไปได้ แต่ถ้าปลั๊กอินกำลังสร้างประเภทโพสต์ที่กำหนดเองโดยใช้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/
คู่ของพวกเขาทางเทคนิคแต่ทั้งหมดนี้ขึ้นอยู่กับสิ่งที่คุณพยายามทำ
$post
ในadd_custom_rewrite_rule()
การทำงาน แต่ก็โยนความผิดพลาดใน WP ธุรการบอกว่าพยายามที่จะได้รับทรัพย์สินที่ไม่ใช่วัตถุ ฉันจะได้รับ $ โพสต์เพื่อรับค่าเมตาได้อย่างไร
รหัสนี้ทำงานได้ดีสำหรับธีมลูกของฉัน จำเป็นต้องเปลี่ยน "โปรแกรม" กระสุนเป็น "สถานที่"
/*
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 );
$args['has_archive'] = false
และใช้งานได้