Удаление слага из произвольного типа сообщения приводит к ошибке 404
3 ответ
- голосов
-
- 2018-01-27
Регистрация произвольного типа сообщения и модификации постоянной ссылки в порядке. Проблема заключается в правилах перезаписи WordPress,которые с большей вероятностью будут соответствовать «очищенному» URL-адресу ваших простых ссылок на страницы и будут устанавливать переменную запроса
pagename
,а неname
как предполагала ваша функцияchange_slug_struct()
.Поэтому измените функцию на эту,чтобы учесть все случаи:
function change_slug_struct( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); } elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); // We also need to set the name query var since redirect_guess_404_permalink() relies on it. $query->set( 'name', $query->query['pagename'] ); } } add_action( 'pre_get_posts', 'change_slug_struct' );
The registering of the custom post type and the permalink modification is OK. The problem is with the WordPress rewrite rules that more than likely will match the "cleaned up" URL of your simple links to pages and it will set the
pagename
query var notname
as yourchange_slug_struct()
function assumed.So change the function to this to account for all cases:
function change_slug_struct( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); } elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) { $query->set( 'post_type', array( 'post', 'single-link', 'page' ) ); // We also need to set the name query var since redirect_guess_404_permalink() relies on it. $query->set( 'name', $query->query['pagename'] ); } } add_action( 'pre_get_posts', 'change_slug_struct' );
-
это помогло,мне даже не нужно было менять или обновлять постоянные ссылки.Спасибо!!that helped, I didn't even need to change or refresh the permalinks. Thank you!!
- 0
- 2018-01-29
- Paranoia
-
это не сработало полностью,если у меня есть страница с родителем (например,domain.com/parent/page),я получаю 404. Если я изменю его на domain.com/page (без родителя),он снова заработает.Есть идеи,что это может быть?that didn't fully work, if I have a page with a parent (eg. domain.com/parent/page) i get a 404. If I change it to domain.com/page (without the parent) then it works again. Any idea what this could be?
- 0
- 2018-01-29
- Paranoia
-
Я изменю его обратно на правильный ответ,если у нас будет решение.К сожалению,я застрял :(I'll change this back to the correct answer, if we have a solution. Unfortunately I am stuck :(
- 0
- 2018-01-30
- Paranoia
-
Да.Я не учел случай,когда есть дочерние страницы.Поскольку ваш пользовательский тип публикации не является иерархическим,можно безопасно исключить случаи,когда есть дочерние страницы.Я изменил свой ответ.Дайте мне знать,работает ли это,и не забудьте продать его как правильный ответ.Yes. I haven't taken into account the case where there are child pages. Since your custom post type is not hierarchical, it is safe to exclude cases when there are child pages. I have modified my answer. Do let me know if it works and don't forget to market it as the right answer.
- 0
- 2018-01-30
- Vlad Olaru
-
ты гений !!you're a genius!!
- 0
- 2018-01-30
- Paranoia
-
- 2018-01-23
Вы должны изменить структуру перманента.По умолчанию сообщение вашего пользовательского типа сообщения будет найдено только в том случае,если URL-адрес начинается с префикса slug.При изменении префикса у вас будут те же проблемы,что и при его удалении, прочтите этот пост .
Чтобы добиться удаления префикса slug типа сообщения,вы должны подключиться к
single-link_rewrite_rules
и выполните итерацию по этим правилам,а также удалите префикс.Примечание. изменения в структуре постоянных адресов могут вызвать конфликты URL-адресов.
You have to alter the perma structure. By default your custom post type's post will only be found wenether the url starts with the slug prefix. When changing the prefix you will have similar issues as when deleting it, have a look at this post.
To achieve removal of the post type slug prefix you should hook into
single-link_rewrite_rules
and iterate through those rules and remove the prefix there as well.Note: changes in the perma structure may cause url conflicts.
-
@Paranoia не на 100% уверен,что вы имеете в виду под «использовать тип страницы».Но с помощью хука [`rewrite_rules_array`] (https://codex.wordpress.org/Plugin_API/Filter_Reference/rewrite_rules_array) вы можете получить доступ ко всем правилам.@Paranoia not 100% sure what you mean with "use the page type". But with the [`rewrite_rules_array`](https://codex.wordpress.org/Plugin_API/Filter_Reference/rewrite_rules_array) hook you can access all rules.
- 0
- 2018-01-24
- Fleuv
-
- 2020-07-22
Для нескольких типов пользовательских сообщений настройте следующим образом
$query->set( 'post_type', array( 'post', 'custom1', 'page' ) && array( 'post', 'custom2', 'page' ) );
For multiple Custom Post Types adjust like this
$query->set( 'post_type', array( 'post', 'custom1', 'page' ) && array( 'post', 'custom2', 'page' ) );
Я работаю над плагином,который создает списки. После создания списка я хотел удалить слаг из URL
Тип сообщения:
Удалите ярлык из URL:
(этот код взят из здесь а>)
Теперь после нажатия кнопки публикации слаг/одиночная ссылка/удаляется,но при посещении страницы мы всегда получаем 404. Изменение/повторное сохранение постоянных ссылок не помогло. Что я делаю не так?