Многие ко Многим Taxonomies или переписывают правила?

Я разрабатываю тему для каталога статьи, и я хотел бы связать некоторый путь taxonomies с taxonomies. У меня был пользовательский тип сообщения, названный "компанией" с 2 taxnomies

Taxonomy #1 is category with terms(shops,workshops,churchs,shoppings,etc)

Taxonomy #2 is location with terms(New York, New jersey,Miami, etc)

С таксономией № 1 я могу сделать

local.dev/category/shops/ to list all shops

С таксономией № 2 я могу сделать

local.dev/location/miami/ to list all companies in miami

В настоящее время я получал работу этим ответом MikeSchinkel следующее:

 local.dev/shops/

Который я могу использовать также как они для получения моих желаемых результатов:

local.dev/shops/?location=miami

НО я хотел бы сделать

local.dev/shops/miami or 
local.dev/shops/new-york to list shops in different locations 

Создание всех URL выглядит более хорошим. Действительно ли это возможно? Мои условия будут все уникальны, таким образом, я буду уверен, что они не столкнутся с тегами сообщений или краткими заголовками или чем-либо

Вероятно, лучшая вещь состоит в том, чтобы создать переписать право правила? Дайте мне некоторый свет на этом, я немного потерян.

1
13.04.2017, 15:37
3 ответа

С резервированием, уверенным, можно сделать то, что Вы хотите с этим кодом:

add_action('init', 'wpse_61376_rewrites');
function wpse_61376_rewrites() {
    add_rewrite_rule('^([^/]*)/([^/]*)/?$','index.php?category=$matches[1]&location=$matches[2]','top');
}

Затем перейдите к Настройкам → Постоянные ссылки в wp-администраторе и нажмите "Save Changes" для сбрасывания Вашего, переписывает, и активируйте это правило.

Резервирование

Проблема о не наличии префикса состоит в том, что любая постоянная ссылка с двумя "разделами" (site.com/section-1/section-2/) будет поймана этой постоянной ссылкой, и Вы будете время от времени заканчивать с нежелательным поведением. Например, запись с двумя страницами, site.com/about/2 или комментарии питаются для страницы, site.com/page/feed/. Короче говоря, это опрометчиво.

Предложенное решение

Если бы это был я, то я добавил бы статическую основу для безопасности. Вы сказали, что это было для каталога, так, чтобы казался хорошей основой:

add_action('init', 'wpse_61376_rewrites');
function wpse_61376_rewrites() {
    add_rewrite_rule('^directory/([^/]*)/([^/]*)/?$','index.php?category=$matches[1]&location=$matches[2]','top');
}

Ваши URL затем были бы, site.com/directory/shops/miami/, который так же интуитивен, как это безопасно.

1
19.02.2020, 22:45

Начиная с WordPress 3.1 можно запросить несколькими таксономию в URL из поля без любой разработки. Это только работает со строками запроса быть значением по умолчанию, и пользовательский переписывают правила, должен будет быть добавлен для создания этой работы симпатичным способом постоянной ссылки.

Из поля

local.dev/company/?category=shops&location=new-york

Это работает отлично и захватит любое сообщение типа 'компания', которая имеет shops категория и new-york местоположение. Очевидно, хотя, похоже, что Вы хотите, чтобы это функционировало с симпатичными постоянными ссылками, таким образом, мы должны будем создать, некоторые пользовательские переписывают правила.

Симпатичные постоянные ссылки

Первая вещь, которую мы должны сделать, ясно дают понять, что шаблон мы хотим для этого несколько структура постоянной ссылки таксономии. В Вашем вопросе Вы использовали /shop/new-york. Это могло работать, но существует много проблем с ним.

Основа таксономии

Важно понять, что все URL к фронтэнду WordPress "переписываются", и закончите как запросы к index.php. Не index.php в Вашей теме, скорее та в базовом приложении. Вещи как человеко-понятные урлы, названия категории, теги, и т.д. - они все отправляются, которые ДОБИРАЮТСЯ, запрашивают Вар. Переписать правила являются regex шаблонами тот поворот /foo/bar в index.php?foo=bar или независимо от того, что строка запроса то, что потребности, которые будут созданы.

Поскольку Ваши примеры не имеют никакой "основы таксономии", /shops столкнется с любым сообщением любого типа сообщения, который совместно использует краткий заголовок. Кроме того, так как мы не используем основы категории вообще, она была бы сложной к для переписать правил знать, когда определенный URL /<cat-term>/<location-term> или предполагаемый быть /<cat-term>/<post-slug>. Думайте об основаниях таксономии как о пространстве имен - если мы вместо этого использовали /category/shops/location/new-york, затем regex мог быть записан для поиска шаблона /category/<cat-term>/location/<location-term>, и сделайте так однозначно.

После этих слов даже при том, что Вы попросили /<cat-term>/<location-term>, Я собираюсь пройти это использование объяснения /category/<cat-term>/location/<location-term>.

Основа типа сообщения

Как с таксономией базируются, мои примеры предполагают, что Вы имеете company набор как краткий заголовок для Вашей "компании", пользовательский тип сообщения - и является, конечно, дополнительным, Вы можете, принял решение не использовать тот. Просто знайте, что, если та основа типа сообщения не присутствует затем, запрос не отфильтрует компанией типа сообщения, и получающийся архив покажет любые сообщения любого типа сообщения, которые соответствуют критериям таксономии.

Перепишите правила

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

function multiple_taxonomy_rewrite_rules( $rules ){

    /**
     * This is very strict. Only allows category first, 
     * and location must be second. 
     *
     * This is also an example of how to make this rule 
     * only work for the "company" post type. 
     * Notice the hard-coded "post_type=company" string
     * at the end.
     *
     * This will only work with the following structure...
     * * /company/category/<term>/location/<term>
     */
    $newrules['company/category/(.+)/location/(.+)/?$'] = 'index.php?=category=$matches[1]&location=$matches[2]&post_type=company';

    /**
     * This is a very flexible version. Allowing for 
     * almost any permutation of the structure. 
     * 
     * This will work with...
     * * /<any-post-type>/category/<term>/location/<term>
     * * /<any-post-type>/location/<term>/category/<term>
     * * /category/<term>/location/<term> (no post type base - meaning query doesnt filter by post type)
     * * /location/<term>/category/<term> (no post type base - meaning query doesnt filter by post type)
     */
    $newrules['(.+)?/?(category|location)/(.+)/(category|location)/(.+)/?$'] = 'index.php?=post_type=$matches[1]&$matches[2]=$matches[3]&$matches[4]=$matches[5]';

    return $newrules + $rules;
}
add_action('rewrite_rules_array', 'multiple_taxonomy_rewrite_rules');

Надо надеяться, это полезно.

Править:

Для разъяснения проблемами относительно таксономии или оснований типа сообщения не являются трудно технические ограничения, они - предостережения. Менее уникальные шаблоны в порядке в различных степенях, но чем менее уникальны, тем более случайный существует коллизии. Необходимо просто знать о последствиях какого-то конкретного шаблона.

Я объяснил в комментариях, что также будет возможно использовать уникальный краткий заголовок в качестве префикса для этого конкретного шаблона. Вы могли использовать...

'company/(.+)/(.+)/?$' = 'index.php?category=$matches[1]&location=$matches[2]&post_type=company';

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

3
19.02.2020, 22:45
  • 1
    Thaks переменной запроса для получения информации, я использую ответ @MikeSchinkel, отправленный в wordpress.stackexchange.com/questions/9419 / … для удаления основного краткого заголовка, потому что я уверен, что это не будет конфликтовать с другими. То, что я действительно хочу выполнить, является преобразованием local.dev/shops/? region=miami, который в настоящее время не работает в local.dev/shops/miami/.There никакой путь, должен добавить, что таксономия региона переписывает правило работать, когда магазины переписывают правило, применяется? –  chifliiiii 16.08.2012, 15:09
  • 2
    Позвольте мне разъясниться, Вы не должны использовать налоговую базу. Однако это приведет к большему количеству коллизий, если будут динамические регионы получения, которые не являются 'namespaced'. Смягчать Вас могло поместить все после уникального краткого заголовка, который идентифицирует URI как намерение быть для этого запроса мультитаксономии. пример был бы 'company/(.+)/(.+)/?$' = 'index.php?category=$matches[1]&location=$matches[2]$post_type=company; Это будет работать, потому что это означает, что Вы решили, что/company/резервируется для компании / <кошка> / <местоположение> / шаблон - это прекрасно, но что-либо еще, что запускается с 'компании'. –  eddiemoya 16.08.2012, 19:29
  • 3
    Вы могли, конечно, решить, что хотели использовать '(.+)/(.+)/?$' = 'index.php?category=$matches[1]&location=$matches[2]$post_type=company' но это получило бы все, что имеет два кратких заголовка, означая/page/page-slug,/category/term-slug, все вместо этого переписать к первого краткого заголовка быть термином categroty и вторым, чтобы быть местоположением. Это обычно - проблема для большинства веб-сайтов. –  eddiemoya 16.08.2012, 19:32
  • 4
    Наконец, Вы спрашиваете, можно ли переписать для нескольких taxonomies - категория и регион - то, что Вы сказали в своем комментарии. Ответ да, мой весь ответ объясняет, что, я использовал категорию и местоположение как два taxonomies, но регион может использоваться столь же легко. –  eddiemoya 16.08.2012, 19:33
  • 5
    я считал снова Ваше объяснение и в основном оно совпадает с Matthew, сказал. Я видел его crearly, когда он объяснил это так, я дал корректный ответ ему. Благодаря вам обоим –  chifliiiii 17.08.2012, 02:23

Основы

Просто используйте get_terms() в сочетании с get_site_url().

Многоузловой

Для добавления поддержки MU просто заглядывайте get_current_blog_id() получать идентификатор текущего блога. Это дает Вам $blog_id, который является единственным блогом в единственной установке сайта и поэтому работает также на установки non-MU.

Пример

Теперь, давайте создадим список.

echo '<ul>';
foreach ( get_terms( "shops" ) ) as $shop )
{
    $site_url = get_site_url( get_current_blog_id() );
    echo "<li><a href='{$site_url}shops/{$shop->slug}' title='{$shop->description}'>{$shop->name}</a></li>";
}
echo '</ul>';

Этот пример принимает, что у Вас есть просто свой URL сайта и свой добавленный краткий заголовок условий таксономии.

http://example.com/shops/miami
0
19.02.2020, 22:45
  • 1
    я просто отредактировал свой вопрос. Спасибо за справку так или иначе –  chifliiiii 09.08.2012, 21:32

Теги

Похожие вопросы