Пользовательские правила перезаписи и шаблоны страниц в WordPress
WordPress Rewrite API — это надежный API, предполагающий, что вы знакомы с регулярными выражениями.
И, честно говоря, даже если это не так, такие инструменты, как PHP Live RegEx, позволяют очень легко протестировать ваш код перед тем, как добавить его в add_rewrite_ruleвызов API.
Однако бывают случаи, когда вы можете оказаться в ситуации, когда вам нужно работать с правилами перезаписи и шаблонами страниц. И когда это так, это не всегда так просто, как сделать простой вызов с одним регулярным выражением.
Причина? Если у вас есть несколько страниц, использующих один и тот же шаблон, вы не всегда будете располагать страницу в одном и том же индексе в запросе, который выполняется на каждой странице.
С этой целью нам придется обращаться с этим немного иначе, чем, скажем, с простым доступом к числовому индексу информации в глобальном запросе.
Переписать правила и шаблоны страниц
Во-первых, давайте предположим, что у нас есть два шаблона (в произвольном порядке):
- шаблон-alpha.php
- шаблон-beta.php
Затем, допустим, мы хотим настроить собственный URL-адрес для страниц, каждая из которых использует один из этих шаблонов.
Это будет разбито на следующие шаги:
- Перебрать сообщения в запросе,
- Сохраните сообщение, используя шаблон в соответствующем массиве,
- Настройте правила перезаписи для каждого сообщения с заданным запросом.
В этом примере я буду придерживаться довольно простых правил перезаписи. В конце концов, регулярные выражения могут быть достаточно сложными для понимания, поэтому попытки следовать им при работе с объектом Query, несколькими массивами и обработкой правил могут оказаться слишком сложными.
С учетом сказанного, вот пример кода, который разбит на основе описанных выше шагов. В конце поста я поделюсь фрагментом, который объединяет все в несколько отдельных функций, чтобы вы могли увидеть, как все это сочетается друг с другом.
С учетом сказанного, вот как справиться со всем вышеперечисленным.
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'
);
}
}
Однако помните; это просто основано на демонстрационном коде, опубликованном в этом посте. Когда вы работаете над своим проектом, регулярные выражения, шаблоны и т. д. могут меняться.
