Изменение ЧПУ для произвольного типа записей
Я работаю с дочерней темой и не хочу редактировать файл, который регистрирует произвольный тип записей Portfolio на моем сайте. Я использовал плагин для изменения названия с Portfolio на Stories, но плагин не предоставляет возможности изменить ЧПУ (slug).
Я попробовал использовать следующую функцию:
function change_slug_of_post_type_portfolio() {
register_post_type('portfolio', array('rewrite' => array ('slug' => 'stories',)));
}
add_action('init', 'change_slug_of_post_type_portfolio', 20);
Но это полностью удаляет Portfolio из боковой панели администратора WordPress.

Фильтр register_post_type_args
может быть использован для изменения аргументов типа записи:
add_filter( 'register_post_type_args', 'wpse247328_register_post_type_args', 10, 2 );
function wpse247328_register_post_type_args( $args, $post_type ) {
if ( 'portfolio' === $post_type ) {
$args['rewrite']['slug'] = 'stories';
}
return $args;
}

Это сработало для меня после выполнения дополнительного шага, упомянутого @Felipe Romero: "обновите" постоянные ссылки, перейдя в Настройки > Постоянные ссылки и нажав Сохранить изменения.

@DaveRomsey, Можем ли мы использовать одинаковое имя для слага страницы и слага пользовательского типа записи?

@NarenVerma Технически это возможно, но возникнут конфликты постоянных ссылок. Я бы использовал уникальные ярлыки.

@DaveRomsey, На самом деле я создал пользовательский тип записи под названием "blog". Теперь я также создал страницу блога, и да, это вызывает конфликт URL. Что я делаю: мне нужно отображать все записи блога по этому URL https://example.com/blog, а также мне нужен URL для отдельной записи блога вида https://example.com/blog/post-name

Ответ @dave-romsey не сработал для меня, PHP выдавал ошибку Warning: Cannot use a scalar value as an array in /path/to/functions.php
Поэтому я использовал подход с array_merge
.
Полная функция, которую нужно добавить в файл functions.php
дочерней темы:
function update_portfolios_slug( $args, $post_type ) {
if ( 'portfolios' === $post_type ) {
//$args['rewrite']['slug'] = 'presidentes';
$my_args = array(
'rewrite' => array( 'slug' => 'presidentes', 'with_front' => false )
);
return array_merge( $args, $my_args );
}
return $args;
}
add_filter( 'register_post_type_args', 'update_portfolios_slug', 10, 2 );
После загрузки кода не забудьте "обновить" постоянные ссылки, перейдя в Настройки → Постоянные ссылки и нажав Сохранить изменения.
Удачи.

Это помогло мне завершить задачу, но стоит отметить, что array_merge
, похоже, не объединяет вложенные массивы. Когда я удалил slug
(так как он был задан плагином вручную), он удалил базовый слаг, но также сбросился к стандартному имени слага CPT. Похоже, что функция объединит rewrite
с остальными аргументами $args
, но полностью заменит весь rewrite
, а не объединит его. Вывод - задавайте все значения rewrite
явно.
