Як створити структуру постійної посилання за допомогою спеціальних таксономій та спеціальних типів публікацій, таких як базове ім’я / податок батьків / податок на дитину / власне повідомлення


53

Я розчісував цей сайт і google для відповіді, і я вийшов абсолютно порожнім. В основному я хочу робити саме те, що запитує цей пост , але мені потрібна ієрархічна систематика. Відповідь, подана в цій публікації, чудово працює, але лише з однорівневою систематикою. Чи можна робити те, що я хочу? Я спробував мільйон речей, але нічого не вийшло, в кращому випадку я можу отримати потрібні постійні посилання, але вони виходять 404

Щоб наочно проілюструвати те, що я хочу:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

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

Отже, будь-які рішення? Дякую велике, це вже близько 3 тижнів мене заганяє.

Відповіді:


68

Поєднавши купу частин інших відповідей, я зрозумів, що це працює! Тож ось рішення для тих, хто бореться з цим:

Цей пост і цей допоміг мені дещо, тому дякую цим хлопцям.

Зауважте, весь цей код, а також ваш початковий спеціальний тип пошти та код реєстрації таксономії functions.phpзберігається у вашому файлі.

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

Вам потрібно додати нове правило перезапису, щоб WordPress знав, як інтерпретувати структуру вашої URL-адреси. У моєму випадку частина користувальницької частини типу uri завжди буде п'ятим сегментом урі, тому я відповідно визначив своє правило відповідності. Зауважте, що вам, можливо, доведеться це змінити, якщо ви використовуєте більш-менш сегменти урі. Якщо у вас є різні рівні вкладених термінів, вам потрібно буде написати функцію, щоб перевірити, чи є останній сегмент урі спеціальним типом пошти чи терміном таксономії, щоб знати, яке правило додати (запитайте, чи потрібна вам допомога по що).

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

Тоді вам потрібно додати цей код, щоб дозволити робочому натиснути, як поводитись %taxonomy_name%у вашому користувальницькому структурі типу перепишіння тексту pug :

function filter_post_type_link($link, $post)
{
    if ($post->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); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Я створив власну функцію на основі власного Wordpress get_category_parents:

// my own function to do what get_category_parents does for other taxonomies
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 -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

Тоді вам потрібно змити свої постійні посилання (просто завантажте сторінку налаштувань постійних посилань).

Тепер все "повинно" працювати сподіваюсь! Ідіть, зробіть купу термінів таксономії та вставте їх правильно, а потім створіть кілька спеціальних публікацій типу публікацій та правильно їх класифікуйте. Ви також можете зробити сторінку зі слизом basename, і все повинно працювати так, як я вказав у своєму запитанні. Ви можете створити деякі власні сторінки архіву систематики таксономії, щоб контролювати, як вони виглядають, і додати якийсь плагін віджетів таксономії, щоб показати вкладені категорії на бічній панелі.

Сподіваюся, що вам допоможе!


Виправлено - див. Питання. Джефф, дякую за ваше пояснення! Але чи можливо, ви зможете розмістити власну збірку посттипу / таксономії? Тож я бачу, що я роблю неправильно ? Був би справді вдячний!
Reitze Bos

Гей Джеф, дякую за вашу відповідь! Я майже там, після 4 годин боротьби з цим. Моя єдина проблема полягає в тому, що я отримую подвійну косу рису перед назвою посади (як це: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Чи можете ви мені допомогти?
Cmorales

1
@Cmorales, Не впевнений, не бачачи свого коду, але шукайте місце, де ви вручну визначите косу косу рису перед назвою вашої пошти, як, можливо, реєстрація cpt-реєстру або у функції filter_post_type? Якщо ви не можете відстежити, куди додаєте додаткову косу рису, ви можете просто позбавити останнього символу з поверненого значення функції get_taxonomy_parents, що називається filter_post_type_link, тому що це залишить вас з косою косою рисою, яка є першою з подвійний. Удачі.
Джефф

1
"Якщо у вас будуть різні рівні вкладених термінів, вам потрібно буде написати функцію, щоб перевірити, чи є останній сегмент урі спеціальним типом пошти або терміном таксономії, щоб знати, яке правило додати (запитайте, чи потрібна вам допомога про те) ... "Ну, чи можете ви мені допомогти, будь ласка? :)
Cmorales

2
^ це саме те, що мені було потрібно. хтось знає, як це зробити? дивіться моє запитання тут: wordpress.stackexchange.com/questions/102246/…
reikyoushin

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.