✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Пользовательские правила перезаписи и шаблоны страниц в WordPress

32

WordPress Rewrite API — это надежный API, предполагающий, что вы знакомы с регулярными выражениями.

И, честно говоря, даже если это не так, такие инструменты, как PHP Live RegEx, позволяют очень легко протестировать ваш код перед тем, как добавить его в add_rewrite_ruleвызов API.

Пользовательские правила перезаписи и шаблоны страниц в WordPress

Однако бывают случаи, когда вы можете оказаться в ситуации, когда вам нужно работать с правилами перезаписи и шаблонами страниц. И когда это так, это не всегда так просто, как сделать простой вызов с одним регулярным выражением.

Причина? Если у вас есть несколько страниц, использующих один и тот же шаблон, вы не всегда будете располагать страницу в одном и том же индексе в запросе, который выполняется на каждой странице.

С этой целью нам придется обращаться с этим немного иначе, чем, скажем, с простым доступом к числовому индексу информации в глобальном запросе.

Переписать правила и шаблоны страниц

Во-первых, давайте предположим, что у нас есть два шаблона (в произвольном порядке):

  1. шаблон-alpha.php
  2. шаблон-beta.php

Затем, допустим, мы хотим настроить собственный URL-адрес для страниц, каждая из которых использует один из этих шаблонов.

Это будет разбито на следующие шаги:

  1. Перебрать сообщения в запросе,
  2. Сохраните сообщение, используя шаблон в соответствующем массиве,
  3. Настройте правила перезаписи для каждого сообщения с заданным запросом.

В этом примере я буду придерживаться довольно простых правил перезаписи. В конце концов, регулярные выражения могут быть достаточно сложными для понимания, поэтому попытки следовать им при работе с объектом 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'
        );
    }
}

Однако помните; это просто основано на демонстрационном коде, опубликованном в этом посте. Когда вы работаете над своим проектом, регулярные выражения, шаблоны и т. д. могут меняться.

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее