Розуміння add_rewrite_rule


11

Я намагаюся add_rewrite_ruleпрацювати над тим, щоб витягнути параметр з URL і передати його на запит. Побачив декілька публікацій про це, але, здається, не працює.

Якщо URL починається з певного рядка, я хотів би вийняти його з URL-адреси і передати його як параметри запиту.

Приклад URL-адреси запиту:

http://domain.com/foo/my_page

Це перетвориться на

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

Якщо "foo" немає, він повинен просто перейти як звичайний запит. Ця логіка повинна застосовуватися до будь-якого URL-адреси сторінки або спеціального URL-адреси типу публікації на моєму сайті (в основному foo / *). Думаючи, це буде діяти як пропуск, якщо URL-адреса "foo" зняти його, а потім просто передати Wordpress, щоб це нормальна річ.

У мене вже є "парам", як дозволений query_vars.

Загалом, потрібно буде працювати над наступним:

  • / foo / my_page (Сторінка)
  • / foo / my_folder / my_page (підсторінка)
  • / foo / example_type (спеціальний архів публікацій)
  • / foo / example_type / example_post (Користувацька публікація Single)

будь-яка URL-адреса, тобто повідомлення, категорії, теги тощо, а не лише pageтип публікації чи будь-яка сторінка? як щодо батьків / дочірних сторінок в ієрархії?
Міло

@Milo Я вам це уточнив. Я використовую лише сторінки та спеціальні типи публікацій (архів та окремі сторінки).
Louis W

Відповіді:


8

Основне правило, яке працює для вашого прикладу:

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

Це займає все, що відбувається після, foo/і встановлює, що pagenameстосується запиту, а потім paramотримує статичне значення foo. Якщо вам потрібні різні шаблони URL-адрес, вам знадобляться додаткові правила для кожного унікального шаблону. Зверніться до WP_Queryдокументів для різних варіантів запитів, які можна встановити в правилах перезапису. Не забудьте спробувати переписати правила після додавання нових. Це можна зробити, відвідавши сторінку "Постійні посилання".

Зараз відвідаємо вашу прикладну URL-адресу:

http://domain.com/foo/my_page

завантажить правильну сторінку, але вона не буде вести себе так, як відвідувати:

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

тому що при використанні внутрішніх переписувань paramвстановлюється всередині $wp_queryоб’єкта запиту, а не $_GETнадглобального. Якщо вам потрібно працювати з кодом, який шукає значення $_GET, вам знадобиться додатковий крок, щоб встановити це значення:

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' );

Ще один метод, який слід враховувати, - це використання кінцевих точок, тому /foo/це буде в кінці URL-адрес, а не як префікса. Перевагою цього є те, що API add_rewrite_endpointспрощує додавання всіх потрібних правил, включаючи включення сторінки.


Дякуємо за наскрізне пояснення. Схоже, працює для сторінок, але дає мені помилку 404 для користувальницького архіву публікацій та окремих URL-адрес.
Луї Ш

ну так, як я вже сказав, вам потрібно додати додаткові правила, які відповідають кожному з цих шаблонів. Я не знаю, як виглядають ці URL-адреси у вашому налаштуванні.
Міло

У мене є власний тип сторінки під назвою "Проекти", який має архів та окремі сторінки. Чи можете ви навести приклад для цього, а я можу зробити всі інші.
Louis W

Крім того, схоже, це не працює для підсторінок.
Louis W

1
Відредагуйте своє запитання, щоб додати приклад кожного шаблону URL, який потребує правила. Мене не дуже турбує прийняття моєї відповіді. Іноді я можу обдурити людей у ​​відповіді на власні запитання, даючи їм щось почати.
Міло

6

Гаразд, я отримав робочі приклади для всіх 3 типів запитів. Потрібно було багато експериментів і возитися, щоб змусити їх працювати. Я думаю, Міло добре підштовхує людей до відповіді на власні запитання.

Після незліченних змін і оновлення постійних посилань я зрозумів, що набагато простіше з'ясувати URL-адреси поза add_rewrite_url, і як тільки вони попрацюють, то визначте перезапис. Приклад буття index.php?param=foo&post_type=example_type.

Ще одна очевидна річ, але додавання її сюди, щоб це могло допомогти комусь іншому. Ви повинні визначити власні правила публікації add_rewrite_rule правила, перш ніж визначити правила підстановки для вашої сторінки / підсторінки. Я витратив на це досить багато часу і думаю, що це головне, що змусило мене не розуміти, чому правила не працюють.

Ось 3 правила, які працюють у всіх моїх потребах. Правило "Сторінка / підсторінка" було об'єднано в єдине.

// 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'
    );

Крім того, що я зробив, це налаштувати цикл для додавання декількох спеціальних правил типу публікації. Пам'ятайте, що ви повинні визначити власні правила публікації типу add_rewrite_rule перед тим, як визначити правила підстановки для вашої сторінки / підсторінки.

$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'
        );

}

Перепишіть аналізатор , який Майло пройшов уздовж був вельми корисним при спробі краще зрозуміти , як Wordpress запитів для сторінок / повідомлень.


Пізно на шоу, але чи можу я надіслати вам ще один приклад? Майте на увазі, я абсолютно не розумію параметр $ tag add_rewrite_rule. Не майте поняття, що це означає. Я також не розумію прикладу, використовуючи pagename = $ match [1] '. HUH ??? У мене є така URL-адреса, як domain.com/detail?id=2&it=3. Я хочу, щоб сторінка була domain.com/detail/2-3/. Ви готові?
Деббі Курт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.