Існує 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;
}
Тут головне, на що слід звернути увагу, якщо ви вирішили пограти, - булівський "Каталог прогулянок". Він генерує правила перезапису для кожного сегмента пермаструктури і може викликати невідповідність правил перезапису. Коли запитується URL-адреса WordPress, масив правил перезапису перевіряється зверху вниз. Як тільки відповідність буде знайдена, вона завантажує все, що натрапило, наприклад, якщо у вашої пермаструктури є жадібна відповідність, наприклад. для /%category%/%postname%/
каталогів і прогулянок у ньому буде виведено переписати правила для обох /%category%/%postname%/
І, /%category%/
які будуть відповідати чому завгодно. Якщо це трапляється занадто рано, вас накрутили.
Постійні посилання
Це функція, яка аналізує постійні посилання типу публікації та перетворює permastruct (наприклад, '/% year% /% monthnum% /% postname% /') у фактичну URL-адресу.
Наступна частина - простий приклад того, що в ідеалі була б версія get_permalink()
функції, знайдена в wp-includes/link-template.php
. Користувальницькі постійні посилання створюються, за допомогою 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;
}
Як уже згадувалося, це дуже спрощений випадок для створення користувальницького набору правил перезапису та постійних посилань, і він не є особливо гнучким, але його має бути достатньо для початку роботи.
Обман
Я написав плагін, який дозволяє визначати permastructs для будь-яких спеціальних типів публікацій, але, як ви можете використовувати %category%
в структурі постійної посилання для публікацій, мій плагін підтримує %custom_taxonomy_name%
будь-які власні таксономії, у яких ви також є, де custom_taxonomy_name
називається ваша таксономія, наприклад. %club%
.
Він буде працювати, як ви очікували, з ієрархічними / неієрархічними таксономіями.
http://wordpress.org/extend/plugins/wp-permastructure/