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


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

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

Как я могу заставить Wordpress не указывать имя типа сообщения, а указывать постоянную ссылку и показывать страницу?

Author: Henrik Erlandsson, 2014-02-19

8 answers

Проще всего было бы просто отключить страницу архива для этого CPT:

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

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

 42
Author: kraftner, 2014-02-19 10:28:14

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

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

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

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

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

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

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

 8
Author: Andrew Herder, 2017-03-14 20:36:33

Тьена Хенрик!

Я думаю, что все, что вам нужно сделать, это добавить правило перезаписи в уже созданные правила перезаписи Wordpress. Добавьте этот фрагмент кода в свой functions.php вашей темы или включить ее в качестве отдельного пугина...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
 4
Author: Carl, 2016-05-13 14:19:54

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

Если вам нужны и страница, и архив, лучшим способом было бы поместить архив в другой пользовательский слаг.

 2
Author: Bikram, 2020-02-09 12:47:48

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

Создайте и настройте 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-адресу.

Пусть я знаю, что это работает.

 0
Author: molokom, 2014-02-19 11:20:10

Не разрешено голосовать, но +для решения Carls у register_post_type должно быть

'has_archive' => false

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

add_rewrite_rule
 0
Author: Vitali Protosovitski, 2017-02-23 17:31:02

Что исправило для меня, так это то, что я установил архив как ложный, но также установил иерархию в значение false при настройке моего пользовательского типа записи!

 0
Author: Adrian Sticea, 2018-10-05 12:50:24

Вот общее решение для определения приоритета разбиения на страницы над контентом пользовательских типов записей для ЛЮБОГО слага пользовательских типов записей.

// 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 ) и сохраните текущие настройки, чтобы обновить структуру ссылок на странице.

 0
Author: jmarceli, 2018-10-08 06:33:12