Как создать структуру permalink с пользовательскими таксономиями и настраиваемыми типами сообщений, такими как base-name /parent-tax /child-tax /custom-post-type-name

Я расчесывал этот сайт и Google для ответа, и я пришел полностью пустым. В основном я хочу сделать то, что этот пост спрашивает, но мне нужно иерархическая таксономия. Ответ, приведенный в этом сообщении, отлично работает, но только с таксономией одного уровня. Можно ли делать то, что я хочу? Я пробовал миллион вещей, но никто не работает, в лучшем случае я могу получить правильные постоянные ссылки, но они появляются на 404.

Чтобы визуально проиллюстрировать, что я хочу:

/basename /- в идеале страница, но я думаю, что это приведет к столкновению постоянной ссылки
/basename /top-cat /- верхний родительский статистический архив таксономии
/basename /top-cat /child-cat /- детальная кошка
/basename /top-cat /child-cat /grandchild-cat /- авторский архив таксономии внука
/basename /top-cat /child-cat /grandchild-cat /post-name /- мой пользовательский пост post post

Вы можете сделать это хорошо со встроенными сообщениями и категориями, как вы это делаете с пользовательскими таксономиями и настраиваемыми типами сообщений? Я знаю, что вам нужно использовать 'rewrite' => array ('slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true), для получения иерархических слизней, которые отлично работают на страницах архива, но пользовательские сообщения типа post приходят вверх 404. Если я удалю 'hierarchical' => true, то сообщения работают, но я теряю иерархические URL-адреса (только /basename /grandchild-cat /post-name /works).

Итак, любые решения? Большое вам спасибо, это заставило меня закинуть около 3 недель.

52 голоса | спросил Jeff 20 Jam1000000amFri, 20 Jan 2012 04:37:40 +040012 2012, 04:37:40

2 ответа


63

Объединив кучу других ответов, я начал работать! Итак, вот решение для тех из вас, кто тоже борется с этим:

Этот пост и этот один помог мне в некоторых, поэтому благодаря эти ребята.

Обратите внимание, что весь этот код, а также ваш начальный пользовательский тип сообщения и код регистрации таксономии входят в ваш файл functions.php.

Сначала создайте свои пули правильно при определении ваших пользовательских типов сообщений и таксономии: для настраиваемого типа сообщения должно быть basename /% taxonomy_name%, а пул для вашей таксономии должен быть просто basename. Не забудьте также добавить 'hierarchical' => true в массив перезаписи таксономии, чтобы получить вложенные термины в вашем URL-адресе. Также убедитесь, что query_var установлен в true в обоих случаях.

Вам нужно добавить новое правило перезаписи, чтобы WordPress знал, как интерпретировать вашу структуру URL. В моем случае часть пользовательского сообщения типа uri всегда будет пятым сегментом uri, поэтому я правильно определил свое правило соответствия. Обратите внимание, что вам может потребоваться изменить это, если вы используете более или менее сегменты uri. Если у вас будет разный уровень вложенных терминов, вам нужно будет написать функцию, чтобы проверить, является ли последний сегмент uri настраиваемым типом сообщения или термином таксономии, чтобы узнать, какое правило добавить (спросите меня, нужна ли вам помощь по что).

add_filter ('rewrite_rules_array', 'mmp_rewrite_rules');
функция mmp_rewrite_rules ($ rules) {
    $ newRules = array ();
    $ newRules ['basename /(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php? custom_post_type_name = $ matches [4]'; //моя пользовательская структура всегда будет иметь имя сообщения как 5-й сегмент uri
    $ newRules ['basename /(.+)/?$'] = 'index.php? taxonomy_name = $ matches [1]';

    return array_merge ($ newRules, $ rules);
}

Затем вам нужно добавить этот код, чтобы заставить workpress обрабатывать % taxonomy_name% в структуре пользовательского типа перезаписи:

function filter_post_type_link ($ link, $ post)
{
    if ($ post- gt; post_type! = 'custom_post_type_name')
        return $ link;

    if ($ cats = get_the_terms ($ post-> ID, 'taxonomy_name'))
    {
        $ link = str_replace ('% taxonomy_name%', get_taxonomy_parents (array_pop ($ cats) -> term_id, 'taxonomy_name', false, '/', true), $ link); //см. пользовательскую функцию, определенную ниже
    }
    return $ link;
}
add_filter ('post_type_link', 'filter_post_type_link', 10, 2);

Я создал пользовательскую функцию на основе собственного get_category_parents Wordpress:

//моя собственная функция делать то, что get_category_parents делает для других таксономий
function get_taxonomy_parents ($ id, $ taxonomy, $ link = false, $ separator = '/', $ nicename = false, $ visited = array ()) {
    $ chain = '';
    $ parent = & get_term ($ id, $ taxonomy);

    if (is_wp_error ($ parent)) {
        return $ parent;
    }

    if ($ nicename)
        $ name = $ parent -> пробковый;
еще
        $ name = $ parent -> имя;

    if ($ parent -> parent & & ($ parent -> parent! = $ parent -> term_id) & &! in_array ($ parent -> parent, $ visited)) {
        $ visited [] = $ parent -> родитель;
        $ chain. = get_taxonomy_parents ($ parent -> parent, $ taxonomy, $ link, $ separator, $ nicename, $ visited);

    }

    if ($ link) {
        //ничего, не могу заставить это работать :(
    } else
        $ chain. = $ name. $ Разделитель;
    return $ chain;
}

Затем вам нужно сбросить свои постоянные ссылки (просто загрузите страницу настроек постоянных ссылок).

Теперь все «должно» работать надежно! Пойдите, сделайте кучу таксономических терминов и правильно вложите их в них, затем создайте персонализированные сообщения типа сообщения и правильно классифицируйте их. Вы также можете сделать страницу с помощью slug basename, и все должно работать так, как я указал в моем вопросе. Возможно, вам захочется создать некоторые пользовательские страницы архива таксономии, чтобы контролировать, как они выглядят, и добавить какой-то вид таксономии , чтобы показать свои вложенные категории на боковой панели.

Надеюсь, что тебе поможет!

ответил Jeff 23 Jpm1000000pmMon, 23 Jan 2012 22:31:57 +040012 2012, 22:31:57
2

Взгляните на этот плагин . Он предоставляет иерархические URL-адреса для категорий, но вы можете легко адаптироваться к любой таксономии.

Создание правила следует за рекурсивной функцией .

ответил vmassuchetto 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 17 Sep 2012 20:02:20 +0400 2012, 20:02:20

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132