нестандартна таксономія та сторінки переписують конфлікт слиз дає 404


9

Я використовую плагін користувальницького типу користувальницького типу для створення власних таксономій. У мене є портфоліо, яке складається з проектів (користувальницький тип пошти) з двома спеціальними таксономіями технологій та клієнтів. У таксономії клієнтів є користувацький переписувальний слуг portfolio/clients/, в той час як технологія має власну перезаписувальну слизькуportfolio/

Переписує:
portfolio/html <- сторінка відображає всі проекти за допомогою HTML
portfolio/clients/client-a<- на сторінці відображаються всі проекти для клієнта A

Тепер, коли я намагаюся зробити цільову сторінку для клієнтів, у яких є URL-адреса, /portfolio/clientsя отримую сторінку 404. Я майже впевнений, що це через суперечливі переписування URL-адрес технологій таксономії. Я здогадуюсь, коли він шукає його в систематиці технологій, її не існує, тоді вона виплющує сторінку 404. Тож як я змушую службу перезапису URL-адреси працювати так, що коли я натискаю /portfolio/clients, вона не повертає сторінку 404 і використовує правильний шаблон сторінки?

Відповіді:


16

Вам, здається, потрібні "часткові правила перезапису". Правила багатослівного перезапису означає, що всі сторінки розміщені вгорі, оскільки WordPress не може з'ясувати різницю між сторінкою та публікацією. Тут він вважає, що може, тому що всі URL-адреси форми portfolio/([^/]+)/походять з вашої portfolioтаксономії, крім цієї portfolio/clients/. Вам доведеться поставити це на вершину правил переписування, щоб він відповідав більш загальній систематиці портфоліо. Можливо, ви також можете змусити всі правила перезапису бути багатослівними, але це вплине на продуктивність, якщо у вас багато сторінок.

Ця відповідь написана з моїм щойно отриманим розумінням правил перезапису, тому я сподіваюся, що це вдалий спосіб зробити це, і приклад коду не містить занадто багато помилок.

Сторінка не генерує лише одне правило перезапису, вона генерує групу:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

Вам не потрібно їх створювати самостійно, ви можете повторно використовувати силу WP_Rewrite. Подивіться на його page_rewrite_rules()метод: якщо ми перебуваємо у багатослівному режимі, він отримує список усіх сторінок (через page_uri_index()) та їх вкладень, перезаписує %pagename%тег перезапису та генерує правила перезапису для цієї сторінки. Ми також можемо це зробити:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

Це дасть нам правила для сторінок, але ще не для вкладених файлів. Якщо ви також хочете їх, ви повторюєте крок для кожного вкладення, але з add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(див. page_rewrite_rules()Докладніше).

Добре, ми отримали правила, але тепер вам потрібно додати їх до повної структури перезапису. Ви можете зробити це за допомогою add_rewrite_rule(), але ви повинні викликати його для кожного правила, створеного в $page_rewrite_rulesмасиві. З цієї причини багато людей вклинитися в rewrite_rules_arrayфільтр , так як ви можете просто змінити масив там.

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

Після того як ви включили цей фільтр, ви повинні змити правила перезапису (один раз, не кожне завантаження кожної сторінки, оскільки це досить важко). Це можна зробити, зателефонувавши flush_rewrite_rules()або відвідавши сторінку налаштувань "Постійні посилання".


Відмінно! Дякую Яну! Це спрацювало. Кращого пояснення я не міг отримати.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.