Zrozumieć add_rewrite_rule

11

Próbuję rozpocząć add_rewrite_rulepracę, aby wyodrębnić parametr z adresu URL i przekazać go do żądania. Widziałem wiele postów na ten temat, ale wydaje się, że nie działa.

Jeśli adres URL zaczyna się od określonego ciągu, chciałbym go usunąć z adresu URL i przekazać jako parametry zapytania.

Przykładowy adres URL żądania:

http://domain.com/foo/my_page

Zostałoby to przekształcone w

http://domain.com/my_page?param=foo

Jeśli „foo” nie jest obecne, powinno po prostu przejść przez normalne żądanie. Ta logika powinna mieć zastosowanie do dowolnego adresu URL strony lub adresu URL niestandardowego typu posta w mojej witrynie (w zasadzie foo / *). Myślenie, że działałoby to jak przejście, jeśli URL ma „foo”, usuń go, a następnie przekaż Wordpressowi do normalnej sytuacji.

Mam już parametr „param” jako dozwoloną zmienną query_vars.

W sumie musiałby działać dla następujących elementów:

  • / foo / my_page (Strona)
  • / foo / my_folder / my_page (podstrona)
  • / foo / example_type (niestandardowe archiwum postów)
  • / foo / example_type / example_post (niestandardowy pojedynczy post)
Louis W.
źródło
dowolny adres URL, oznaczający posty, kategorie, tagi itp., a nie tylko pagetyp postu lub po prostu dowolna strona? co ze stronami nadrzędnymi / podrzędnymi w hierarchii?
Milo
@Milo Wyjaśniłem to dla ciebie. Używam tylko stron i niestandardowych typów postów (archiwum i pojedyncze strony).
Louis W

Odpowiedzi:

8

Podstawowa zasada, która działałaby w twoim przykładzie:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Pobiera to, co nastąpi później foo/i ustawia to jak pagenamedla zapytania, a następnie paramotrzymuje wartość statyczną foo. Jeśli potrzebujesz różnych wzorców adresów URL, będziesz potrzebować dodatkowych reguł dla każdego unikalnego wzorca. Zapoznaj się z WP_Querydokumentacją różnych zmiennych zapytań, które można ustawić w ramach reguł przepisywania. Nie zapomnij opróżnić reguł przepisywania po dodaniu nowych. Można to zrobić, odwiedzając stronę Ustawienia Permalinks.

Teraz odwiedzasz przykładowy adres URL:

http://domain.com/foo/my_page

załaduje prawidłową stronę, ale nie będzie się zachowywać dokładnie tak jak odwiedzanie:

http://domain.com/my_page?param=foo

ponieważ podczas korzystania z wewnętrznych przepisywania paramjest ustawiane w $wp_queryobiekcie zapytania, a nie w $_GETsuperglobie. Jeśli chcesz pracować z kodem, który szuka wartości $_GET, potrzebujesz dodatkowego kroku, aby ustawić tę wartość:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Inną metodą, którą należy wziąć pod uwagę, jest użycie punktów końcowych, więc /foo/byłoby to na końcu adresów URL, a nie jako przedrostek. Zaletą tego jest to, że interfejs API add_rewrite_endpointupraszcza dodawanie wszystkich potrzebnych reguł, w tym włączanie stronicowania.

Milo
źródło
Dzięki za wyjaśnienie. Wydaje się blisko, działa na stronach, ale daje mi błąd 404 dla niestandardowego archiwum postów i pojedynczych adresów URL.
Louis W
no tak, jak powiedziałem, musisz dodać dodatkowe reguły, które pasują do każdego z tych wzorów. Nie wiem, jak te adresy URL wyglądają w Twojej konfiguracji.
Milo,
Mam niestandardowy typ strony o nazwie „projekty”, który ma archiwum i pojedyncze strony. Czy możesz podać przykład, a ja mogę zrobić wszystkie pozostałe.
Louis W
Poza tym nie działa na podstronach.
Louis W
1
Edytuj swoje pytanie, aby dodać przykład każdego wzorca adresu URL, który wymaga reguły. Naprawdę nie martwię się, że moja odpowiedź zostanie zaakceptowana, czasami mogę oszukać ludzi, aby odpowiedzieli na własne pytania, dając im coś na początek.
Milo,
6

Ok, dostałem przykłady działania dla wszystkich 3 typów żądań. Wymagało to mnóstwa eksperymentów i bałaganu, aby je uruchomić. Myślę, że Milo jest dobry w zachęcaniu ludzi do odpowiadania na ich własne pytania.

Po niezliczonych zmianach i odświeżeniu permalinków zdałem sobie sprawę, że o wiele łatwiej jest rozgryźć adresy URL poza add_rewrite_url i kiedy już zadziałały, zdefiniuj przepisywanie. Przykładem jest index.php?param=foo&post_type=example_type.

Kolejna oczywista rzecz, ale dodanie jej tutaj, aby mogło pomóc komuś innemu. Musisz zdefiniować niestandardowy typ postu reguły add_rewrite_rule PRZED zdefiniowaniem reguł wieloznacznych strony / podstrony. Zmarnowałem trochę czasu z tym i myślę, że to główna rzecz sprawiła, że ​​nie zrozumiałem, dlaczego reguły nie zadziałały.

Oto 3 zasady, które działają we wszystkich moich potrzebach. Reguła strona / podstrona została połączona w jedną.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Dodatkowo skonfigurowałem pętlę, aby dodać wiele niestandardowych reguł typów postów. Pamiętaj, że musisz zdefiniować niestandardowy typ postu reguły add_rewrite_rule PRZED zdefiniowaniem reguł wieloznacznych strony / podstrony.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Przepisz Analyzer , które przeszły wzdłuż Milo było bardzo pomocne, gdy próbuje lepiej zrozumieć, jak Wordpress zapytań do stron / stanowisk.

Louis W.
źródło
Późno na koncert, ale czy mogę pingować cię na inny przykład? Pamiętaj, że całkowicie nie rozumiem parametru $ tag parametru add_rewrite_rule. Nie mam pojęcia, co to znaczy. Nie rozumiem też przykładu użycia pagename = $ dopasowania [1] '. Hę? Mam adres URL taki jak domain.com/detail?id=2&it=3. Chcę, aby strona była domeną.com/detail/2-3/. Czy jesteś chętny?
Debbie Kurth,