Jak utworzyć niestandardowe trasy URL?

50

Mam bardzo szczególny wymóg, mam nadzieję, że mogę to wyjaśnić, nie będąc zbyt zagmatwanym. Utworzyłem szablon strony, w którym wymieniłem niektóre właściwości, które otrzymuję z zewnętrznego pliku XML, do tej pory żadnych problemów, powiedzmy, że adres URL wygląda następująco:

http://www.example.com/properties/

Każda właściwość ma link, który powinien przekierować użytkownika do strony „Pojedyncza właściwość”, która wyświetla więcej informacji na jej temat. Zastanawiałem się, czy istnieje sposób na utworzenie takiego linku:

http://www.example.com/properties/123

Gdzie 123byłby identyfikator nieruchomości. Więc jeśli mam taki adres URL, properties/some_idże chcę móc załadować plik widoku (taki jak pliki single.phplub page.php), ale specyficzny dla tego warunku adresu URL.

czy to możliwe?

Javier Villanueva
źródło

Odpowiedzi:

57

Dodaj to do pliku functions.php swojego motywu lub umieść we wtyczce .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Dodaje to regułę przepisywania, która kieruje żądania do /properties/dowolnej kombinacji liczb następujących po nazwie strony properties, z property_idustawionym zmiennym zapytania . Pamiętaj tylko, aby odwiedzić stronę ustawień permalinks i zapisać reguły do ​​przepisywania na nowo, aby ta nowa reguła została uwzględniona.

W page-properties.phpszablonie get_query_var('property_id')zwróci identyfikator właściwości, jeśli został ustawiony, jeśli nie, pokaż domyślną stronę właściwości.

Milo
źródło
4
To było dla mnie ZAMKNIĘTE, ale musiałem dodać: add_filter ('init', 'flushRules'); funkcja flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel,
19
@tooshel zdecydowanie nie chcesz opróżniać reguł przy każdym żądaniu, jest to kosztowna operacja i spowolni indeksowanie witryny. wystarczy opróżnić reguły tylko raz, po aktywacji wtyczki lub po prostu odwiedzając stronę ustawień permalinks.
Milo,
Tak, rozumiem. . . ale kiedy testujesz, fajnie, że tam jest!
tooshel
3
Może być mądrzejsza regexp adresu URL ^properties/([0-9]+)/?. W przeciwnym razie pasowałoby do czegoś takiegoexample/properties/1
Ryan Taylor,
@RyanTaylor jesteś tego pewien? nie przechwytuje example/properties/1podczas testowania.
Milo,
9

Innym sposobem na to:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Kodeks Rewrite API / dodaj regułę przepisywania

Kodeks Rewrite API / dodaj tag przepisywania

Christian Lescuyer
źródło
2
Przyjęta odpowiedź działa z wersją 4.7 (i 4.8), nie jestem pewien, dlaczego tak uważasz. Twój kod robi to samo, add_rewrite_tagdodaje zapytanie var do tej samej tablicy co query_varsfiltr.
Milo,
@Milo prawdopodobnie nie działało dla mnie, ale nie mam już przydatnego 4.7, więc nie mogę sprawdzić. Zmienię swoją odpowiedź.
Christian Lescuyer,
@Milo Chociaż osobiście wolę przepisać tag, ale nadal testowałem zaakceptowaną odpowiedź i działa. Ale tylko kilka osobistych upodobań.
Jack Johansson
1
@JackJohansson tagi przepisywania są konieczne, gdy używasz go w permastructrze . To tylko dodatkowy kawałek danych, których WordPress nigdy nie używa w tym przypadku.
Milo
obie reguły mogą być dodawane do tej samej metody, kończący się w czystszym i bardziej użytecznych funkcji, aby wrócić do i dowiedzieć się, czy robi prace konserwacyjne
eballeste