Разрешение конфликта между именем произвольного типа записи и ссылкой страницы (одинаковый slug)

19 февр. 2014 г., 10:32:09
Просмотры: 46.7K
Голосов: 32

У меня есть произвольный тип записи под названием "visningshus", а также Страница с таким же slug. Это именно так, как должно быть (обязательно).

В настоящее время "http://my-site.com/visningshus" выводит список всех записей этого типа. Я хочу вместо этого показывать страницу, которая имеет этот permalink slug.

Как можно сделать так, чтобы WordPress не отдавал приоритет имени типа записи, а вместо этого использовал permalink и показывал Страницу?

0
Все ответы на вопрос 8
3
52

Самый простой способ — просто отключить страницу архива для этого пользовательского типа записи (CPT):

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

Не забудьте после этого обновить постоянные ссылки в разделе "Настройки > Постоянные ссылки"

19 февр. 2014 г. 12:28:14
Комментарии

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

Henrik Erlandsson Henrik Erlandsson
11 мар. 2014 г. 17:44:05

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

Bruno Monteiro Bruno Monteiro
6 апр. 2016 г. 20:08:19

Очень умное решение. Решает кучу проблем

bysanchy bysanchy
9 апр. 2017 г. 18:08:32
0
12

У меня недостаточно репутации, чтобы комментировать пост @Carl, но его ответ является правильным (по крайней мере, для ситуации, когда нужно сохранить слаг страницы и слаг пользовательского типа записи одинаковыми и не использовать файл archive.php).

Но его ответ может вызывать ошибки при пагинации. Чтобы избежать ошибок пагинации:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Этот код проверяет пагинацию, захватывает номер страницы, а затем заставляет использовать страницу с соответствующим слагом, подставляя переменную страницы.

Это в дополнение к 'has_archive' => false, (как указано выше) должно обеспечить желаемую функциональность.

Как уже отмечали другие, не забудьте сбросить правила перезаписи, посетив Настройки > Постоянные ссылки после внесения этих изменений.

Надеюсь, это поможет кому-то, потому что я знаю, что эта проблема долго ставила меня в тупик.

14 мар. 2017 г. 22:22:43
3

Привет, Хенрик!

Думаю, все что тебе нужно сделать - это добавить правило перезаписи (rewrite rule) к уже существующим правилам перезаписи WordPress. Добавь этот код в functions.php своей темы или подключи как отдельный плагин...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
13 мая 2016 г. 17:19:54
Комментарии

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

tehlivi tehlivi
14 июн. 2017 г. 21:10:47

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

Pooja Mistry Pooja Mistry
11 июн. 2020 г. 19:12:17

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

bosco bosco
12 июн. 2021 г. 05:36:09
0

Если вы зарегистрировали тип записи самостоятельно, вы можете изменить статус архива и 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.

9 февр. 2020 г. 14:47:48
4

Я решил это без разрешения конфликта. Создайте страницу с ярлыком 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.

Дайте мне знать, если это сработает.

19 февр. 2014 г. 12:31:15
Комментарии

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

kraftner kraftner
19 февр. 2014 г. 12:32:51

@kraftner нет, не пробовал. В следующий раз опробую. Спасибо!

molokom molokom
19 февр. 2014 г. 12:55:20

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

kraftner kraftner
19 февр. 2014 г. 13:00:30

Что если ID страницы изменится? Это небезопасно.

Joel James Joel James
6 февр. 2017 г. 09:19:05
0

Голосование запрещено, но поддерживаю решение Carls, register_post_type должно содержать

'has_archive' => false

Просто. Однако, если вы столкнулись с проблемами пагинации, посмотрите на

add_rewrite_rule
23 февр. 2017 г. 19:31:02
0

Что помогло в моём случае — это установка параметра archive в false, а также установка Hierarchical в false при настройке моего пользовательского типа записи!

5 окт. 2018 г. 15:50:24
0

Вот общее решение для приоритизации пагинации над контентом произвольных типов записей (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) и сохраните текущие настройки, чтобы обновить структуру ссылок на сайте.

8 окт. 2018 г. 09:33:12