W przypadku dodawania niestandardowych reguł przepisywania typu postów należy uwzględnić 2 punkty ataku:
Przepisz reguły
Dzieje się tak, gdy reguły przepisywania są generowane wp-includes/rewrite.php
w WP_Rewrite::rewrite_rules()
. WordPress pozwala filtrować reguły przepisywania dla określonych elementów, takich jak posty, strony i różne typy archiwów. Gdzie można zobaczyć część powinna być nazwa typu custom post. Alternatywnie możesz użyć filtru, o ile nie zniszczysz również standardowych reguł postów.posttype_rewrite_rules
posttype
post_rewrite_rules
Następnie potrzebujemy funkcji, aby faktycznie wygenerować reguły przepisywania:
// 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;
}
Najważniejszą rzeczą, na którą należy zwrócić uwagę, jeśli zdecydujesz się na zabawę, jest boolean „Katalogi spacerowe”. Generuje reguły przepisywania dla każdego segmentu permastructwa i może powodować niedopasowania reguł przepisywania. Gdy żądany jest adres URL WordPress, tablica reguł przepisywania jest sprawdzana od góry do dołu. Jak tylko zostanie znalezione dopasowanie, załaduje to, co napotkało, więc na przykład, jeśli twój permastruct ma zachłanne dopasowanie, np. /%category%/%postname%/
katalogi for i walk są włączone, wyświetli reguły przepisywania dla obu /%category%/%postname%/
AND, /%category%/
które pasują do wszystkiego. Jeśli zdarzy się to zbyt wcześnie, to jesteś pieprzony.
Permalinks
Jest to funkcja, która analizuje łącza bezpośrednie typu post i konwertuje permastruct (np. „/% Year% /% monthnum% /% postname% /”) na rzeczywisty adres URL.
Następna część jest prostym przykładem tego, co byłoby idealną wersją get_permalink()
funkcji znalezionej w wp-includes/link-template.php
. Generowane są niestandardowe bezpośrednie łącza pocztowe, dzięki get_post_permalink()
którym jest znacznie rozwodniona wersja get_permalink()
. get_post_permalink()
jest filtrowane według, post_type_link
dlatego używamy go do tworzenia niestandardowej struktury permastruktury.
// 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;
}
Jak wspomniano, jest to bardzo uproszczony przypadek generowania niestandardowego zestawu reguł przepisywania i łączy bezpośrednich i nie jest on szczególnie elastyczny, ale powinien wystarczyć, aby zacząć.
Oszukiwanie
Napisałem wtyczkę, która pozwala zdefiniować permastructy dla dowolnych niestandardowych typów postów, ale podobnie jak możesz użyć %category%
w strukturze permalink dla postów, moja wtyczka obsługuje %custom_taxonomy_name%
dowolne niestandardowe taksonomie, które masz również gdzie custom_taxonomy_name
jest nazwa twojej taksonomii np. %club%
.
Będzie działać tak, jak można się spodziewać z hierarchicznymi / niehierarchicznymi taksonomiami.
http://wordpress.org/extend/plugins/wp-permastructure/