Спеціальні правила перезапису та шаблони сторінок у WordPress
API WordPress Rewrite — надійний API, якщо припустити, що ви добре знаєте регулярні вирази.
І, чесно кажучи, навіть якщо ви ні, такі інструменти, як PHP Live RegEx, дозволяють дуже легко перевірити ваш код перед тим, як вставити його у add_rewrite_ruleвиклик API.
Однак бувають випадки, коли ви можете опинитися в ситуації, коли вам потрібно працювати з правилами перезапису та шаблонами сторінок. І коли це так, це не завжди так просто, як зробити простий виклик за допомогою одного регулярного виразу.
Причина? Якщо у вас є кілька сторінок, які використовують один і той самий шаблон, ви не завжди матимете сторінку в одному індексі в запиті, який виконується на кожній сторінці.
З цією метою нам доведеться обробляти це дещо іншим способом, ніж, скажімо, простий доступ до числового індексу інформації в глобальному запиті.
Перепишіть правила та шаблони сторінок
По-перше, давайте припустимо, що у нас є два шаблони (які не в певному порядку):
- template-alpha.php
- template-beta.php
І тоді, скажімо, ми хочемо налаштувати спеціальну URL-адресу для сторінок, кожна з яких використовує один із цих шаблонів.
Це буде розділено на такі кроки:
- Переглядайте повідомлення в запиті,
- Зберігайте публікацію за допомогою шаблону у відповідному масиві,
- Встановіть правила перезапису для кожної публікації, що містить заданий запит.
Для цього прикладу я збережу правила перезапису досить простими. Зрештою, регулярні вирази можуть бути досить складними для дотримання, тому спроби слідувати їм під час роботи з об’єктом запиту, кількома масивами та обробкою правил можуть бути занадто важкими.
З огляду на це, ось зразок коду, розбитий на основі наведених вище кроків. Наприкінці публікації я поділюся фрагментом, який поєднує все разом у кілька окремих функцій, щоб ви могли бачити, як усе це поєднується.
З огляду на це, ось як впоратися з усім вищезазначеним.
1 Додавання правил перезапису
По-перше, нам потрібно прочитати деяку інформацію з глобального об’єкта запиту WordPress, щоб знайти всі сторінки, до яких застосовано шаблони.
Для цього ми можемо прочитати інформацію з глобального об’єкта запиту в локальну змінну. Це дозволяє легко уникнути решти коду, якщо немає з чим працювати.
<?php
$query = $this->query->query([
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);
if (!$query) {
return;
}
// More to come...
2 Зберігайте релевантну інформацію в масиві
Якщо припустити, що є сторінки з шаблонами, то ми продовжимо зберігати кожну зі сторінок у масивах, щоб ми могли легко керувати відповідними правилами перезапису.
<?php
foreach ($query as $post) {
$slug = get_page_template_slug($post->ID);
if ('template-alpha.php' === $slug) {
$this->alphaPages[] = $post;
}
if ('template-find-a-camp.php' === $slug) {
$this->betaPages[] = $post;
}
}
Зауважте, що вище я посилаюся на глобальний масив. Припустімо, що це просто ініціалізовано як порожній масив у конструкторі класу.
3 Налаштуйте правила перезапису
Тепер, коли у нас є два масиви – по одному для кожного шаблону та сторінок, які його містять – ми можемо переглядати їх і призначати правила перезапису для кожної з цих сторінок.
Наприклад, припустимо, що для одного шаблону, скажімо, альфа, ми хочемо налаштувати правила перезапису для США та штатів.
Ось код дляtemplate-alpha.php:
<?php
add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');
foreach ($this->alphaPages as $post) {
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
'top'
);
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]',
'top'
);
}
І ось код для template-beta.php:
<?php
add_rewrite_tag('%acme-id%', '([^&]+)');
foreach ($this->betaPages as $post) {
add_rewrite_rule(
'^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
'top'
);
}
Звичайно, регулярні вирази, які використовуються в коді вище, призначені лише для демонстрації. Вашим буде все, що потрібно для вашого проекту.
4 Зараз усі разом
Важливо розбити всю цю функціональність на власні методи, щоб у разі потреби їх можна було легко інкапсулювати та протестувати.
Для цього ось як виглядатиме повний код:
<?php
public function addRewriteRules()
{
$query = $this->query->query([
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);
if (!$query) {
return;
}
$this->setPageTypes($query);
$this->setAlphaRewriteRules();
$this->setBetaRewriteRules();
}
private function setPageTypes($query)
{
foreach ($query as $post) {
$slug = get_page_template_slug($post->ID);
if ('template-alpha.php' === $slug) {
$this->alphaPages[] = $post;
}
if ('template-find-a-camp.php' === $slug) {
$this->betaPages[] = $post;
}
}
}
private function setAlphaRewriteRules()
{
add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');
foreach ($this->alphaRules as $post) {
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
'top'
);
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]',
'top'
);
}
}
private function setBetaRewriteRules()
{
add_rewrite_tag('%acme-id%', '([^&]+)');
foreach ($this->betaPages as $post) {
add_rewrite_rule(
'^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
'top'
);
}
}
Однак пам’ятайте; це лише на основі демонстраційного коду, поширеного в цій публікації. Коли ви працюєте над своїм проектом, регулярні вирази, шаблони тощо змінюватимуться.
