Özel yazı tipi yeniden yazma kuralları eklediğinizde ele alınacak 2 saldırı noktası vardır:
Kuralları yeniden yaz
Yeniden yazma kuralları içinde üretiliyor ortaya çıkar wp-includes/rewrite.php
içinde WP_Rewrite::rewrite_rules()
. WordPress, yazılar, sayfalar ve çeşitli arşiv türleri gibi belirli öğeler için yeniden yazma kurallarını filtrelemenize izin verir. Gördüğünüz nerede parçası özel mesaj türünün adı olmalıdır. Alternatif olarak , filtreyi standart posta kurallarını da yok etmediğiniz sürece kullanabilirsiniz .posttype_rewrite_rules
posttype
post_rewrite_rules
Daha sonra, yeniden yazma kurallarını gerçekten oluşturma fonksiyonuna ihtiyacımız var:
// 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;
}
Oynamaya karar verirseniz, burada dikkat etmeniz gereken en önemli şey 'Walk dizinleri' olmaktır. Bir permastruct'ın her bölümü için yeniden yazma kuralları oluşturur ve yeniden yazma kuralı uyumsuzluklarına neden olabilir. Bir WordPress URL'si istendiğinde, yeniden yazma kuralları dizisi üstten alta kontrol edilir. Bir eşleşme bulunur bulunmaz karşılaştığı her şeyi yükler, örneğin permastructınızın açgözlü bir eşleşmesi varsa, örneğin; için /%category%/%postname%/
dizinleri ve yürüyüş her ikisi için çıkış yeniden yazma kuralları olacaktır üzerinde olduğu /%category%/%postname%/
VE /%category%/
hangi bir şey eşleşir. Bu çok erken olursa, sen berbat olursun.
Kalıcı
Bu, post tipini kalıcı olarak ayrıştırıp permastruct'ı (örneğin, '/% year% /% monthnum% /% postname% /') gerçek bir URL’ye dönüştüren işlevdir.
Bir sonraki kısım idealde bulunan get_permalink()
fonksiyonun bir versiyonunun ne olacağına dair basit bir örnektir wp-includes/link-template.php
. Özel post permalink'ler get_post_permalink()
çok sulanan bir versiyonu ile üretilir get_permalink()
. get_post_permalink()
filtrelendiğinden post_type_link
bunu özel bir permastructure yapmak için kullanıyoruz.
// 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;
}
Bu belirtildiği gibi, özel bir yeniden yazma kural kümesi ve kalıcı bağlantılar oluşturmak için çok basitleştirilmiş bir durumdur ve özellikle esnek değildir, ancak başlamanız için yeterli olmalıdır.
Hile
Herhangi bir özel gönderi türü için permastruct tanımlamanıza izin veren bir eklenti yazdım, ancak %category%
eklentilerim için permalink yapısında kullanabileceğiniz gibi, eklentim benim %custom_taxonomy_name%
taksonominizin custom_taxonomy_name
adının olduğu özel taksonomiler için desteklediğiniz herhangi bir özel taksonomide kullanılabiliyor . %club%
.
Hiyerarşik / hiyerarşik olmayan taksonomilerle beklediğiniz gibi çalışacaktır.
http://wordpress.org/extend/plugins/wp-permastructure/