WordPress

Niestandardowa taksonomia na łączu bezpośrednim — WordPress Development Stack Exchange

  • 20 lutego, 2013
  • 5 min read
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:

  1. Stworzyłem niestandardową taksonomię – najpierw miasto.
  2. 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!!!!!
Warto przeczytać!  Opcja „Dodaj elementy menu” nie działa

Ten post ma następujący link: http: //mysite.ru/ moscow/shopping/postname

Ale potrzebuję linków, aby zawierały kategorię potomną.

  1. 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%/

Warto przeczytać!  Jak zablokować front-end Wordpress za pomocą loginu i hasła?

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),  


Źródło