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

19

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

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

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

Хенрик Эрландссон
источник

Ответы:

33

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

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

Не забудьте обновить ваши постоянные ссылки потом в «Настройки> Постоянные ссылки»

kraftner
источник
1
Работало отлично - но теперь все постоянные ссылки, начинающиеся с имени пользовательского типа записи, дают 404, несмотря на то, что они верны в wp-admin и, похоже, переписывание не происходит. То есть все постоянные ссылки на сайте верны, но все пользовательские сообщения дают 404. Можете ли вы помочь с этим? :)
Хенрик Эрландссон
@HenrikErlandsson Возможно, ваш тип поста имеет такое же имя страницы. В этом случае я рекомендую вам изменить название вашего поста. Пример: имя пользовательского типа записи - До: продукты После: cpt_products.
Бруно Монтейру
Очень умный. Решает кучу проблем
bysanchy
8

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

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

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

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

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

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

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

Эндрю Гердер
источник
4

Тена Хенрик!

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

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
деревенщина
источник
4
Если кто-то использует это, удалите flush_rewrite_rules();Вы не должны менять правила перезаписи initкаждый раз. Перезагрузите один раз, затем удалите его, или вручную сбросьте постоянные ссылки, перейдя в настройки постоянных
ссылок
0

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

Создайте и настройте шаблон 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, вы увидите содержимое, управляемое страницей, по правильному адресу.

Дайте мне знать, что это работает.

molokom
источник
Хорошая идея, но это слишком сложно. Вы пробовали мое решение?
kraftner
@kraftner нет, я не сделал. Я попробую в следующий раз. Благодарность!
молоком
Это также имеет некоторые побочные эффекты, такие как заголовок и все еще создается, как если бы это была страница архива, а не страница. Я бы не советовал использовать это решение.
kraftner
Что если идентификатор страницы изменится? Это не безопасно.
Джоэл Джеймс
0

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

'has_archive' => false

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

add_rewrite_rule
Виталий Протосовицкий
источник
0

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

Адриан Стицея
источник
0

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

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

jmarceli
источник