Не повинно це бути просто ?! Постійна посилання спеціального типу / спеціальна таксономія


11

Тож це мене дуже божевільно. Я витрачав дні, намагаючись виправити це, і не можу розібратися, чому це так складно, оскільки, безумовно, це дуже поширена структура постійної посилання!

Я переглянув сотні відповідей і дописів, і жоден з них, здається, не вирішує проблему.

Я просто хочу цю структуру:

mysite.com/custom-post-type/custom-taxonomy-term/post-name

Тож я досягаю наступного:

mysite.com/literature - all literature posts
mysite.com/literature/fiction - all literature posts with 'fiction' term
mysite.com/literature/fiction/mybook - the post

Кожен раз, коли я щось пробую, я отримую 404 помилки або панінізація не працює.

Я не розумію, чому це так важко!

Будь-яка допомога дуже цінується!

Дякую

===================================================== ==== ================== ДОДАТКОВА ІНФОРМАЦІЯ ==================

На даний момент я реєструю тип посади та систематику так:

register_post_type('literature',$args);
'rewrite' => array('slug' => 'literature/books','with_front' => false),

register_taxonomy('literature_category',array('literature'), array(
'rewrite' => array( 'slug' => 'literature','with_front' => false ),

Якщо я реєструю обидва як "літературу", я отримую 404 на сторінці mysite.com/literature, але це відображає мою постійну посилання як: mysite.com/literature/books/mybook

Дотримуючись поради з цього питання - Спеціальні типи публікацій, таксономії та постійні посилання

Я додав це до своїх функцій:

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

    if ($cats = get_the_terms($post->ID, 'literature_category'))
        $link = str_replace('%literature_category%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

І змінив тип моєї посади на 'slug' => 'literature/%literature_category%' І змінив свою таксономію на'slug' => 'literature'

Це чудово працює, за винятком того, що при використанні mysite.com/literatureсторінки не працює, тому я отримую помилку 404 у наступному URL-адресі:

mysite.com/literature/page/2/


З цікавості, що ви пробували досі?
Меттью Бойнес

Ця відповідь дістала мене найближчим чином - wordpress.stackexchange.com/questions/5308/… - але тоді вона не працювала з пагінацією, і запропонований плагін також не працював
fxfuture

Класно, радий, що я запитав, що врятувало мене деякий час!
Меттью Бойнес

Відповіді:


6

Дотримуйтесь порад щодо цього питання, як ви вже робили, але додайте це у свій код:

add_action( 'generate_rewrite_rules', 'fix_literature_category_pagination' );
function fix_literature_category_pagination( $wp_rewrite ) {
    unset($wp_rewrite->rules['literature/([^/]+)/page/?([0-9]{1,})/?$']);
    $wp_rewrite->rules = array(
        'literature/?$' => $wp_rewrite->index . '?post_type=literature',
        'literature/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=literature&paged=' . $wp_rewrite->preg_index( 1 ),
        'literature/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?literature_category=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
    ) + $wp_rewrite->rules;
}

Нарешті, перейдіть у Налаштування> Постійні посилання та натисніть Зберегти. Якщо це все ще не працює, збережіть свої постійні посилання знову. Іноді я відчуваю, що вам потрібно їх врятувати двічі, але хто знає. У будь-якому випадку, дайте мені знати, як ви розбираєтесь. Зауважте, що застосовується стандартний відповідь з інформатики №1: це працює для мене ... ;-)

З краю ТМІ ...

Для довідки, причина, по якій сторінки не працюють за замовчуванням, полягає в тому, що WordPress встановлює правило перезапису для літератури /% literature_category% /% book% /% page%, що має повний сенс, якщо ви задумаєтесь про це. Таким чином, постійні посилання за замовчуванням мають такі конкуруючі правила у такому порядку:

[literature/([^/]+)/([^/]+)(/[0-9]+)?/?$] => index.php?literature_category=$matches[1]&book=$matches[2]&page=$matches[3]
[literature/([^/]+)/page/?([0-9]{1,})/?$] => index.php?literature_category=$matches[1]&paged=$matches[2]

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

Факт забави: Якщо у вас коли-небудь є "книга" під назвою "сторінка" і вона має кілька сторінок, це замовлення буде конфліктним, і його наступні сторінки не працюватимуть!


Боже, мені просто спало на думку, що мій синтаксис тут неправильний. Досить смішно, це працює для мене, і коли я це виправляю, це не працює. Я буду продовжувати це і оновити свою відповідь, коли я
зрозумію

Дякую за допомогу Метью. Я спробував це, і, на жаль, не вийшло. Я додав більше інформації до свого питання, яке, сподіваємось, пояснює це краще!
fxfuture

1
Гаразд, вибачте за плутанину. Там було трохи мозкового газу там (напевно, недавно були мозолі). Моя відповідь оновлена, і знову це працює на мене. Не забудьте заощадити над своїми постійними посиланнями.
Меттью Бойнес

1
Ну добре, я побачив ваше оновлене запитання. Так це не так / література / художня література / сторінка / 2 не працює, це / література / сторінка / 2 не працює, чи не так? Якщо це так, це легко виправити, ми зробимо те ж саме на рівні
Меттью Бойнес

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