Изменение ЧПУ для произвольного типа записей

25 нояб. 2016 г., 00:10:04
Просмотры: 32K
Голосов: 11

Я работаю с дочерней темой и не хочу редактировать файл, который регистрирует произвольный тип записей 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.

0
Все ответы на вопрос 2
5
31

Фильтр 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;
}
25 нояб. 2016 г. 00:18:14
Комментарии

Потрясающе. Это сработало!

Darren Bachan Darren Bachan
25 нояб. 2016 г. 08:42:15

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

Ralf Ralf
6 февр. 2020 г. 18:06:36

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

Naren Verma Naren Verma
11 февр. 2022 г. 17:27:37

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

Dave Romsey Dave Romsey
12 февр. 2022 г. 19:59:53

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

Naren Verma Naren Verma
14 февр. 2022 г. 07:41:21
2

Ответ @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 );

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

Удачи.

19 июн. 2017 г. 03:41:47
Комментарии

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

rtpHarry rtpHarry
29 нояб. 2019 г. 14:56:37

@rtpHarry это действительно полезная информация. Уверен, это поможет другим. Спасибо за ваш вклад!

Felipe Romero Felipe Romero
5 дек. 2019 г. 22:36:57