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