Разрешение конфликта между именем произвольного типа записи и ссылкой страницы (одинаковый slug)
У меня есть произвольный тип записи под названием "visningshus", а также Страница с таким же slug. Это именно так, как должно быть (обязательно).
В настоящее время "http://my-site.com/visningshus" выводит список всех записей этого типа. Я хочу вместо этого показывать страницу, которая имеет этот permalink slug.
Как можно сделать так, чтобы WordPress не отдавал приоритет имени типа записи, а вместо этого использовал permalink и показывал Страницу?

Самый простой способ — просто отключить страницу архива для этого пользовательского типа записи (CPT):
register_post_type( 'visningshus',
array(
[...]
'has_archive' => false,
[...]
)
);
Не забудьте после этого обновить постоянные ссылки в разделе "Настройки > Постоянные ссылки"

Работало отлично, но теперь все постоянные ссылки, начинающиеся с имени типа записи, выдают 404 ошибку, несмотря на то, что в wp-admin они отображаются корректно и, похоже, никаких перезаписей не происходит. То есть, все постоянные ссылки на сайте правильные, но все пользовательские записи выдают 404. Можете помочь с этим? :)

@HenrikErlandsson Возможно, ваш тип записи имеет такое же имя, как и страница. В этом случае я рекомендую изменить имя типа записи. Пример: Имя типа записи - До: products После: cpt_products.

У меня недостаточно репутации, чтобы комментировать пост @Carl, но его ответ является правильным (по крайней мере, для ситуации, когда нужно сохранить слаг страницы и слаг пользовательского типа записи одинаковыми и не использовать файл archive.php).
Но его ответ может вызывать ошибки при пагинации. Чтобы избежать ошибок пагинации:
add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');
Этот код проверяет пагинацию, захватывает номер страницы, а затем заставляет использовать страницу с соответствующим слагом, подставляя переменную страницы.
Это в дополнение к 'has_archive' => false,
(как указано выше) должно обеспечить желаемую функциональность.
Как уже отмечали другие, не забудьте сбросить правила перезаписи, посетив Настройки > Постоянные ссылки после внесения этих изменений.
Надеюсь, это поможет кому-то, потому что я знаю, что эта проблема долго ставила меня в тупик.

Привет, Хенрик!
Думаю, все что тебе нужно сделать - это добавить правило перезаписи (rewrite rule) к уже существующим правилам перезаписи WordPress. Добавь этот код в functions.php своей темы или подключи как отдельный плагин...
add_action('init', function () {
add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
flush_rewrite_rules();
}, 1000);

Если кто-то использует это, удалите flush_rewrite_rules();
Не следует менять правила перезаписи на хуке init
каждый раз. Перезагрузите один раз, затем удалите этот код, или вручную сбросьте постоянные ссылки, перейдя в настройки постоянных ссылок в админ-панели и нажав "Сохранить изменения".

Из всех ответов здесь этот сработал для меня !!! Огромное спасибо.

По поводу flush_rewrite_rules()
- действительно плохая идея использовать эту функцию в хуке init
- или любом другом хуке, который выполняется часто. Это заставит вашу установку WordPress сбрасывать правила перезаписи из базы данных и вставлять их снова при каждой загрузке страницы, что создает очень ненужную нагрузку, именно поэтому WordPress сам этого не делает. После создания правила перезаписи просто перейдите в Настройки > Постоянные ссылки и нажмите сохранить - это вручную сбросит правила перезаписи один раз, чего вполне достаточно.

Если вы зарегистрировали тип записи самостоятельно, вы можете изменить статус архива и URL в своей теме или плагине.
'has_archive' => true,
включает архив в post-type-permalink. Измените это на
'has_archive' => false,
чтобы отключить архив.
'has_archive' => 'custom-slug',
включит архив с пользовательским slug(http://my-site.com/custom-slug/).
Если плагин или ваша тема регистрируют его, вы можете отключить архив способом, который предложил krafter. Также можно использовать пользовательский slug для архива.
register_post_type( 'visningshus',
array(
[...]
'has_archive' => 'custom-slug',
[...]
)
);
Если вам нужна и страница, и архив, лучшим решением будет разместить архив под другим пользовательским slug.

Я решил это без разрешения конфликта. Создайте страницу с ярлыком visningshus и напишите в ней что угодно. Запомните ID этой страницы.
Создайте и настройте шаблон 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.
Дайте мне знать, если это сработает.

Хорошая идея, но это излишне усложнено. Вы пробовали мое решение?

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

Вот общее решение для приоритизации пагинации над контентом произвольных типов записей (custom post types) для ЛЮБОГО слага типа записи.
// приоритизировать пагинацию над отображением контента произвольного типа записи
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) и сохраните текущие настройки, чтобы обновить структуру ссылок на сайте.
