Разве это не должно быть легко ?! Пользовательский тип сообщения / пользовательская постоянная ссылка на таксономию

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/

fxfuture
источник
Из любопытства, что вы пробовали до сих пор?
Мэтью Бойнс
Этот ответ дал мне самый близкий - 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 по информатике: он работает для меня ... ;-)

Из земли TMI ...

Для справки, причина, по которой страницы не работают по умолчанию, заключается в том, что WordPress вводит правило перезаписи для литературы /% Литература_категории% /% 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 не работает, не так ли? Если это так, это легко исправить, мы сделаем то же самое на следующем уровне
Мэтью Бойнс
1
давайте продолжим это обсуждение в чате
Мэтью Бойнс