Изменение постоянных ссылок только для типа записи 'post'

5 июн. 2018 г., 21:04:09
Просмотры: 15.1K
Голосов: 7

Как и многие другие, я хотел бы изменить: domain.com/post-title на domain.com/blog/post-title но только для типа записи 'post', а не для 'page' и особенно не для пользовательских типов записей (которых в моей теме, кажется, довольно много).

Я провел исследование на этом форуме и других источниках и знаю, что общий ответ кажется таким:

При регистрации вашего типа записи аргумент with_front в rewrite должен быть false.

$args = array(
    'rewrite' => array( 'with_front' => false ),
); 
register_post_type( 'your-post-type', $args );

К сожалению, это не помогает новичкам. Мы не понимаем, что означают приведенные выше инструкции. По-видимому, мы должны каким-то образом перерегистрировать стандартный тип записи "post" (хотя тип записи "post" уже существует и используется), но мы не знаем, как и где это сделать. Если кто-то может пролить свет на необходимую процедуру изменения URL записей блога, я буду очень благодарен.

5
Комментарии

Настройки типа записи post управляются на экране администрирования Настройки > Постоянные ссылки.

Milo Milo
5 июн. 2018 г. 21:09:05

@Milo Спасибо. Действительно, некоторые настройки URL можно контролировать таким образом. Однако в моем конкретном случае я хочу изменить настройки URL только для записей типа 'post'. Если точнее, если я перейду в настройки постоянных ссылок -> Общие настройки и вместо текущего выбранного варианта "Название записи" выберу 'Произвольная структура' и введу '/blog/%postname%', то не только все мои записи блога будут иметь слово 'blog' в начале URL, но и все мои пользовательские типы записей. Это нежелательный результат.

Mihaela Grigore Mihaela Grigore
6 июн. 2018 г. 15:25:46

Вы уже получили ответ на эту проблему — пользовательские типы записей должны регистрироваться с параметром with_front, установленным в false, как вы описали в своем вопросе выше.

Milo Milo
6 июн. 2018 г. 15:51:28

@Milo Поскольку эти пользовательские типы создаются разработчиками темы, мы, начинающие пользователи WordPress, не понимаем, что подразумевается под регистрацией пользовательского типа. Поэтому наш вопрос относится именно к тому, что нам нужно сделать для регистрации и где. Должны ли мы включить упомянутый код в файл functions.php дочерней темы, которая наследует основную используемую тему? В этом случае, не будет ли это означать, что мы повторно регистрируем пользовательский тип, поскольку он уже зарегистрирован в родительской теме? Полное раскрытие: я уже пробовал сделать вышеуказанное, и это не дало эффекта — их ссылка всё равно изменяется.

Mihaela Grigore Mihaela Grigore
6 июн. 2018 г. 23:39:16

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

Milo Milo
7 июн. 2018 г. 06:36:03
Все ответы на вопрос 3
4

Я нашел ответ здесь. Не забудьте зайти и поставить лайк.

Я опубликую его здесь для тех, кто торопится.


Добавьте это в файл functions.php:

function wp1482371_custom_post_type_args( $args, $post_type ) {
  if ( $post_type == "post" ) {
    $args['rewrite'] = array(
      'slug' => 'blog'
    );
  }

  return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

(Протестировано и работает).

Не забывайте!!

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

Помните Б) Если вы получите странные результаты, попробуйте открыть окно в режиме инкогнито и проверить там. В WordPress есть функция, которая перенаправляет на 'Ближайший совпадающий URL', что может сбивать с толку при изменении постоянных ссылок.


Вы также можете попробовать найти плагин, который это делает. Я бы не стал так делать, так как добавлять плагин только для этой цели — это излишне. Но, эй, — иногда приятно стрелять по воробьям из пушки (при создании этой шутки ни одна птица не пострадала).

26 февр. 2020 г. 15:40:26
Комментарии

Краткое и красивое решение с понятным объяснением. К сожалению, это не то, что мне нужно. В текущем варианте используется определение "rewrite" для перенаправления на старый постоянный URL ("/blog/post" -> "/post"). Однако я хочу сохранить URL "/blog/post". Как этого добиться?

Chaoste Chaoste
2 нояб. 2020 г. 15:42:43

Дополнение: это можно исправить, добавив следующий код: add_filter('pre_post_link', 'my_change_post_link', 10, 3); function my_change_post_link($permalink, $post, $leavename) { if (get_post_type($post) == 'post') { return "/blog" . $permalink; } return $permalink; }

Chaoste Chaoste
2 нояб. 2020 г. 16:04:46

@Chaoste О боже, какое совпадение - мне это понадобилось буквально на следующий день. Искал везде - ОГРОМНОЕ СПАСИБО!

gerbz gerbz
3 нояб. 2020 г. 23:25:32

Это не работает в 2023 году, я вижу, что $args обновляются, но после обновления постоянных ссылок изменения не применяются?

dungey_140 dungey_140
13 мар. 2023 г. 13:11:55
0

Вы пробовали этот вариант?

function generate_rewrite_rules( $wp_rewrite ) {
      $new_rules = array(
        '(.?.+?)/page/?([0-9]{1,})/?$' => 'index.php?pagename=$matches[1]&paged=$matches[2]',
        'blog/([^/]+)/?$' => 'index.php?post_type=post&name=$matches[1]',
        'blog/[^/]+/attachment/([^/]+)/?$' => 'index.php?post_type=post&attachment=$matches[1]',
        'blog/[^/]+/attachment/([^/]+)/trackback/?$' => 'index.php?post_type=post&attachment=$matches[1]&tb=1',
        'blog/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=post&attachment=$matches[1]&feed=$matches[2]',
        'blog/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=post&attachment=$matches[1]&feed=$matches[2]',
        'blog/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$' => 'index.php?post_type=post&attachment=$matches[1]&cpage=$matches[2]',     
        'blog/[^/]+/attachment/([^/]+)/embed/?$' => 'index.php?post_type=post&attachment=$matches[1]&embed=true',
        'blog/[^/]+/embed/([^/]+)/?$' => 'index.php?post_type=post&attachment=$matches[1]&embed=true',
        'blog/([^/]+)/embed/?$' => 'index.php?post_type=post&name=$matches[1]&embed=true',
        'blog/[^/]+/([^/]+)/embed/?$' => 'index.php?post_type=post&attachment=$matches[1]&embed=true',
        'blog/([^/]+)/trackback/?$' => 'index.php?post_type=post&name=$matches[1]&tb=1',
        'blog/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=post&name=$matches[1]&feed=$matches[2]',
        'blog/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=post&name=$matches[1]&feed=$matches[2]',
        'blog/page/([0-9]{1,})/?$' => 'index.php?post_type=post&paged=$matches[1]',
        'blog/[^/]+/page/?([0-9]{1,})/?$' => 'index.php?post_type=post&name=$matches[1]&paged=$matches[2]',
        'blog/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?post_type=post&name=$matches[1]&paged=$matches[2]',
        'blog/([^/]+)/comment-page-([0-9]{1,})/?$' => 'index.php?post_type=post&name=$matches[1]&cpage=$matches[2]',
        'blog/([^/]+)(/[0-9]+)?/?$' => 'index.php?post_type=post&name=$matches[1]&page=$matches[2]',
        'blog/[^/]+/([^/]+)/?$' => 'index.php?post_type=post&attachment=$matches[1]',
        'blog/[^/]+/([^/]+)/trackback/?$' => 'index.php?post_type=post&attachment=$matches[1]&tb=1',
        'blog/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=post&attachment=$matches[1]&feed=$matches[2]',
        'blog/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=post&attachment=$matches[1]&feed=$matches[2]',
        'blog/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$' => 'index.php?post_type=post&attachment=$matches[1]&cpage=$matches[2]',
      );
      $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
    }
    add_action( 'generate_rewrite_rules', 'generate_rewrite_rules' );

    function update_post_link( $post_link, $id = 0 ) {
      $post = get_post( $id );
      if( is_object( $post ) && $post->post_type == 'post' ) {
        return home_url( '/blog/' . $post->post_name );
      }
      return $post_link;
    }
    add_filter( 'post_link', 'update_post_link', 1, 3 );
9 сент. 2019 г. 19:46:02
2
// Поместите код в файл function.php
add_action('init', 'my_new_default_post_type', 1); 
function my_new_default_post_type() 
{ 
    register_post_type('post', array(
        // 'labels' => $labels, 
        'public' => true, 
        //'show_in_admin_bar' => true,
        '_builtin' => false, 
        '_edit_link' => 'post.php?post=%d', 
        'capability_type' => 'post', 
        'map_meta_cap' => true, 
        'hierarchical' => false, 
        'rewrite' => array('slug' => 'resources/blog'), // Укажите свой slug здесь
        'query_var' => false, 
        'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats'),
    )); 
    /* Если вы добавите этот код в function.php, пагинация блога перестанет работать. Вам нужно добавить правило перезаписи, используя плагин "Debug This" в разделе Query >> Rewrite Section и изменить свой rewrite_rule. */
    add_rewrite_rule('(.?.+?)/page/?([0-9]{1,})/?$', 'index.php?pagename=resources/blog&paged=$matches[1]', 'top');
}
26 февр. 2020 г. 15:14:10
Комментарии

Хм.. Я бы не рекомендовал так делать, так как это 'перерегистрирует' тип записи post.

Zeth Zeth
26 февр. 2020 г. 15:25:39

Вам нужно изменить структуру постоянных ссылок.

Harshal Solanki Harshal Solanki
27 февр. 2020 г. 11:20:37