Разрешить конфликт между именем пользовательского типа записи и постоянной ссылкой на страницу (тот же слиток)
У меня есть пользовательский тип записи под названием "visningshus", а также Страница с этим слизняком. Так и должно (должно) быть.
В настоящее время "http://my-site.com/visningshus " содержит список всех сообщений этого типа. Вместо этого я хочу показать страницу, на которой есть эта постоянная ссылка.
Как я могу заставить Wordpress не указывать имя типа сообщения, а указывать постоянную ссылку и показывать страницу?
8 answers
Проще всего было бы просто отключить страницу архива для этого CPT:
register_post_type( 'visningshus',
array(
[...]
'has_archive' => false,
[...]
)
);
Не забудьте обновить постоянные ссылки после этого в "Настройки > Постоянные ссылки"
У меня недостаточно высокая репутация, чтобы комментировать сообщение @Carl, но его ответ правильный (по крайней мере, в этой ситуации, когда страница slug и пользовательский тип сообщения slug одинаковы и не используют archive.php файл)
Но его ответ дал бы ошибки при разбиении на страницы. Чтобы избежать ошибок разбиения на страницы:
add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');
Это просматривает разбивку на страницы, захватывает номер страницы, а затем на оборотной стороне заставляет ее использовать страницу с соответствующим фрагментом, а затем вставляет переменная страницы.
Это в дополнение к 'has_archive' => false,
, опубликованному выше, должно обеспечить желаемую функциональность.
Как и другие, не забудьте удалить правила перезаписи, посетив Настройки > Постоянные ссылки после внесения этого изменения.
Надеюсь, это кому-то поможет, потому что я знаю, что это ставило меня в тупик очень долгое время.
Тьена Хенрик!
Я думаю, что все, что вам нужно сделать, это добавить правило перезаписи в уже созданные правила перезаписи Wordpress. Добавьте этот фрагмент кода в свой functions.php вашей темы или включить ее в качестве отдельного пугина...
add_action('init', function () {
add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
flush_rewrite_rules();
}, 1000);
Если вы зарегистрировали тип записи самостоятельно, вы можете изменить статус архива и URL-адрес в своей теме или плагине.
'has_archive' => true,
включает архив в виде постоянной ссылки после ввода. так что измените это на
'has_archive' => false,
отключит архив.
'has_archive' => 'custom-slug',
включит архив в пользовательском слаге(http://my-site.com/custom-slug/).
Если плагин или ваша тема зарегистрируют его, вы можете отключить его так, как это сделал krafter. Вы также можете использовать пользовательский слизняк для архив.
register_post_type( 'visningshus',
array(
[...]
'has_archive' => 'custom-slug',
[...]
)
);
Если вам нужны и страница, и архив, лучшим способом было бы поместить архив в другой пользовательский слаг.
Я решил это, не разрешив конфликт. Создайте страницу со слизняком виснингшусом и напишите на ней все, что захотите. Обратите внимание на идентификатор этой страницы.
Создайте и настройте archive-custom-post-type.php шаблон любым удобным вам способом (скорее всего, вы просто будете использовать шаблон страницы), но замените часть цикла на
$recent = new WP_Query("page_id=your-page-id");
while($recent->have_posts()) : $recent->the_post();
the_content();
endwhile;
Затем, когда вы перейдете к http://my-site.com/visningshus вы увидите содержимое, управляемое страницей, по правильному URL-адресу.
Пусть я знаю, что это работает.
Не разрешено голосовать, но +для решения Carls у register_post_type должно быть
'has_archive' => false
Просто. Однако, когда вы столкнетесь с проблемами разбиения на страницы, взгляните на
add_rewrite_rule
Что исправило для меня, так это то, что я установил архив как ложный, но также установил иерархию в значение false при настройке моего пользовательского типа записи!
Вот общее решение для определения приоритета разбиения на страницы над контентом пользовательских типов записей для ЛЮБОГО слага пользовательских типов записей.
// prioritize pagination over displaying custom post type content
add_action('init', function() {
add_rewrite_rule(
'(.?.+?)/page/?([0-9]{1,})/?$',
'index.php?pagename=$matches[1]&paged=$matches[2]',
'top'
);
});
Помимо добавления этого фрагмента, вы также должны убедиться, что ваш пользовательский тип записи имеет archive = false
И последнее, но не менее важное, перейдите на страницу настроек постоянных ссылок Настройки > Постоянные ссылки (/wp/wp-admin/options-permalink.php ) и сохраните текущие настройки, чтобы обновить структуру ссылок на странице.