Niestandardowa taksonomia na łączu bezpośrednim — WordPress Development Stack Exchange
Mam problem od dłuższego czasu i liczę na Waszą pomoc. Mam niestandardową taksonomię „miasta” (nie jest hierarchiczna jak tagi). Chciałbym tylko, aby moje adresy URL wyglądały tak:
/%city%/%category%/%postname%/
Więc to jest to, co lubię osiągnąć.
– Wyświetl wszystkie posty w taksonomii miasto-Moskwa.
– Wyświetl wszystkie posty w tej kategorii i wszystkie miasta.
/supermarket
– Wyświetl wszystkie posty w tej kategorii i wszystkie miasta.-Wyświetl wszystkie posty w tej kategorii w Moskwie.
supermarket/
– Wyświetl wszystkie posty w tej -dziecięcej kategorii w Moskwie.supermarket/postname
– Wyświetl post.
Zrobiłem co następuje:
- Stworzyłem niestandardową taksonomię – najpierw miasto.
- Dodałem kod w function.php
function add_custom_taxonomies_city() {
register_taxonomy('city', 'post', array(
'hierarchical' => false,
'labels' => array(
'name' => _x( 'City', 'taxonomy general name' ),
'search_items' => __( 'Search cities' ),
'all_items' => __( 'All cities' ),
'parent_item' => __( 'Parent Categories' ),
'parent_item_colon' => __( 'Parent Categories:' ),
'edit_item' => __( 'Edit city' ),
'update_item' => __( 'Update city' ),
'add_new_item' => __( 'Add city' ),
'new_item_name' => __( 'New city' ),
'menu_name' => __( 'cities' ),
);
),
'rewrite' => array(
'slug' => 'city',
'with_front' => false,
'hierarchical' => false
),
));
}
add_action( 'init', 'add_custom_taxonomies_city', 0 );
add_filter('post_link', 'town_permalink', 10, 3);
add_filter('post_type_link', 'town_permalink', 10, 3);
function town_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%city%') === FALSE) return $permalink;
// Get post
$post = get_post($post_id);
if (!$post) return $permalink;
// Get taxonomy terms
$terms = wp_get_object_terms($post->ID, 'city');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug;
else $taxonomy_slug = 'not-city';
return str_replace('%city%', $taxonomy_slug, $permalink);
}
Wynik:
– To działa
– To działa
/supermarket/
– To działa– To działa
supermarket/
– Nie ma!!!!!supermarket/postname
– Nie ma!!!!!
Ten post ma następujący link: http: //mysite.ru/ moscow/shopping/postname
Ale potrzebuję linków, aby zawierały kategorię potomną.
- Próbowałem rozwiązać zadanie za pomocą innej opcji: dodałem następujący kod do funkcji. php
function addRoutes() {
add_rewrite_tag('%city%', '(.+?)');
add_rewrite_rule('(.+?)/(.+?)/([^/]+)(/[0-9]+)?/?$', 'index.php?city=$matches[1]&category_name=$matches[2]&name=$matches[3]&page=$matches[4]', 'top');
add_rewrite_rule('(.?.+?)(/[0-9]+)?/?$', 'index.php?pagename=$matches[1]&page=$matches[2]', 'top');
flush_rewrite_rules();
}
add_action('init', 'addRoutes');
W rezultacie
– Nie znaleziono strony, błąd 404.
– Nie znaleziono strony, błąd 404..
/supermarket/
– Nie znaleziono strony, błąd 404..
supermarket/postname
–400 błąd
Wygląda na to, że sustem nie rozumie %city% Co jest nie tak? Czekam na twoją pomoc Czy ktoś może mi pomóc? Dziękuję bardzo!
Postanowiłem zmienić strukturę adresów URL na:
example.com/city/moscow/category/shopping/
-Wyświetl wszystkie posty w tej kategorii w Moskwie.example.com/city/moscow/category/shopping/supermarket/
– Wyświetl wszystkie posty w tej -dziecięcej kategorii w Moskwie.example.com/city/moscow/category/shopping/supermarket/postname
– Wyświetl post.
Kod:
//The rewrite rules function eg_add_query_vars( $query_vars ) { $new_vars = array( 'town' ); return array_merge( $new_vars, $query_vars ); } add_filter( 'query_vars', 'eg_add_query_vars' ); function eg_add_rewrite_rules() { global $wp_rewrite; $new_rules = array( 'city/(.+?)/category/(.+?)/?$' => 'index.php?city=' . $wp_rewrite->preg_index(1) . '&category_name=" . $wp_rewrite->preg_index(2), "city/(.+?)/category/(.+?)/(.+?)/?$' => 'index.php?city=' . $wp_rewrite->preg_index(1) . '&category_name=" . $wp_rewrite->preg_index(2) . "&category_name=". $wp_rewrite->preg_index(3), //"city/(.+?)/category/(.+?)/(.+?)/(.+?)/?$' => 'index.php?city=' . $wp_rewrite->preg_index(1) . '&category_name=" . $wp_rewrite->preg_index(2) . "&category_name=". $wp_rewrite->preg_index(3). "&page=". $wp_rewrite->preg_index(4),// This is me effort to write the rule for posts (doesn"t work) ); $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; } add_action( 'generate_rewrite_rules', 'eg_add_rewrite_rules' ); //creating the permalink: function city_permalink($permalink, $post_id, $leavename) { if (strpos($permalink, '%city%') === FALSE) return $permalink; // Get post $post = get_post($post_id); if (!$post) return $permalink; // Get taxonomy terms $terms = wp_get_object_terms($post->ID, 'town'); if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug; else $taxonomy_slug = 'not-city'; return str_replace('%town%', $taxonomy_slug, $permalink);} function wp_town_query( $query ) { if( isset( $query->query_vars['city'] ) ): if( $city = get_term_by( 'id', $query->query_vars['city'], 'city' ) ) $query->query_vars['town'] = $city->slug; endif; } add_action( 'parse_query', 'wp_city_query' );
Moje ustawienia na stronie administratora Permalink: city/%city%/category/%category%/%postname%/
w rezultacie mam: – example.com/city/moscow/category/shopping/
-Pracuje – example.com/city/moscow/category/shopping/supermarket/
– działa, ale nadal nie rozumiem, jak napisać regułę dla postów: – example.com/city/moscow/category/shopping/supermarket/postname
– nie. Paginacja też nie działa.
Chętnie udzielę wszelkich porad!
To jest praca:
'city/(.+?)/category/(.+?)/(.+?)/([^/]+)/?$' => 'index.php?city=' . $wp_rewrite->preg_index(1) . '&category_name=" . $wp_rewrite->preg_index(2). "&category_name=" . $wp_rewrite->preg_index(3). "&name=" . $wp_rewrite->preg_index(4), "city/(.+?)/category/(.+?)/page/?([0-9]{1,})/?$' => 'index.php?city=' . $wp_rewrite->preg_index(1) . '&category_name=" . $wp_rewrite->preg_index(2). "&paged=' . $wp_rewrite->preg_index(3), 'city/(.+?)/category/(.+?)/?$' => 'index.php?city=' . $wp_rewrite->preg_index(1) . '&category_name=" . $wp_rewrite->preg_index(2),