Вам, здається, потрібні "часткові правила перезапису". Правила багатослівного перезапису означає, що всі сторінки розміщені вгорі, оскільки 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()
або відвідавши сторінку налаштувань "Постійні посилання".