Структура постоянной ссылки для типа записи Страница

Вопрос или проблема

Я пытаюсь изменить URL страниц так, чтобы они заканчивались на .htm

Мне удалось сделать это с помощью…

/* Добавить .htm к URL страниц */
add_action('init', 'htm_page_permalink', -1);
function htm_page_permalink() {
    global $wp_rewrite;
    if ( !strpos($wp_rewrite->get_page_permastruct(), '.htm')){
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.htm';
    }
}

/* Удалить завершающий слэш на страницах */
add_filter('user_trailingslashit', 'no_page_slash',66,2);
function no_page_slash($string, $type){
    global $wp_rewrite;
    if ($wp_rewrite->using_permalinks() && $wp_rewrite->use_trailing_slashes==true && $type == 'page'){
        return untrailingslashit($string);
    }else{
        return $string;
    }
}

Но затем я столкнулся с проблемой, когда я использую список постов моего Блога на странице с именем Блог. Мне нужно, чтобы эта страница НЕ заканчивалась на .htm

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

/* Исключить .htm из ссылок на странице блога */
function blog_page_url($content) {
    $current_path="/blog.htm";
    $new_path="/blog/";
    $content = str_replace($current_path, $new_path, $content);
    return $content;
}
add_filter('_get_page_link', 'blog_page_url');

И я использовал это правило перенаправления, чтобы сделать так, чтобы /blog/ загружала Страницу Блога

/* Настроить пользовательское перенаправление для страницы блога */
add_action( 'init', 'blog_page_rewrite' );
function blog_page_rewrite(){
    add_rewrite_rule('blog', 'index.php?pagename=blog','top' );
    //add_rewrite_rule('blog/(.*?)/', 'index.php?p=$matches[1]','top' );
}

Но теперь у меня есть проблема, что любой URL с /blog/ отображает Страницу Блога.

Это означает, что мои фактические посты блога, которые настроены в параметрах WP Permalink вот так…

/blog/%postname%/ не работают, вместо этого они всегда показывают Страницу Блога, которая содержит все посты блога.

В моей функции blog_page_rewrite() выше вы можете видеть, что я тестировал дополнительное правило перенаправления, которое, надеюсь, будет работать с постами блога, но оно не подействовало.

Является ли ваша страница блога той, что установлена в панели администратора по адресу Настройки > Чтение > Страница с записями? Если да, попробуйте проверить это в вашей первой функции:

/* Добавить .htm к URL страниц */
add_action('init', 'htm_page_permalink', -1);
function htm_page_permalink() {
    global $post;
    if( get_option( 'page_for_posts' ) == $post->ID ) {
         // не добавлять .htm к этой странице
         return;
    }
    global $wp_rewrite;
    if ( !strpos($wp_rewrite->get_page_permastruct(), '.htm')){
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.htm';
    }
}

Справочник по параметрам направил меня на page_for_posts.

Ответ или решение

Для решения проблемы с URL-адресами страниц в WordPress, необходимо учитывать несколько факторов, чтобы убедиться, что ваша страница блога и записи блога работают корректно без конфликтов. В данном ответе мы разберем предложенные вами функции и предложим улучшения.

Цели

  1. Настроить URL-адреса страниц, чтобы они заканчивались на .htm.
  2. Исключить страницу блога из данного правила, чтобы URL-адрес страницы блога не имел .htm.
  3. Убедиться, что индивидуальные записи блога, находящиеся по адресу /blog/%postname%/, корректно отображаются.

Шаги решения

1. Обновление функции для добавления .htm к URL страниц

Для начала нам нужно изменить функцию, которая добавляет расширение .htm, чтобы она не применялась к странице блога:

add_action('init', 'htm_page_permalink', -1);
function htm_page_permalink() {
    global $post, $wp_rewrite;

    // Проверка, является ли текущая страница страницей блога
    if ( get_option('page_for_posts') == $post->ID ) {
        return; // Не добавляем .htm к странице блога
    }

    // Проверка на наличие .htm в структуре
    if ( !strpos($wp_rewrite->get_page_permastruct(), '.htm')) {
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.htm';
    }
}

2. Обновление фильтра для URLs страниц блога

Следующий шаг — убедиться, что параметры блога заменяются корректно и не конфликтуют с другими URL. Здесь мы используем более прицельную замену:

function blog_page_url($content) {
    $current_path = "/blog.htm";
    $new_path = "/blog/";

    // Проверка на наличие вложенных страниц
    if (strpos($content, $current_path) !== false) {
        $content = str_replace($current_path, $new_path, $content);
    }
    return $content;
}
add_filter('_get_page_link', 'blog_page_url');

3. Настройка правил переопределения для страницы блога и записей

Теперь необходимо убедиться, что такая страница, как /blog/, не конфликтует с обычными записями. Убедитесь, что ваш метод переопределения add_rewrite_rule использует правильные регулярные выражения и не перезаписывает записи блога:

add_action('init', 'blog_page_rewrite');
function blog_page_rewrite() {
    // Переопределение для страницы блога
    add_rewrite_rule('^blog/?$', 'index.php?pagename=blog', 'top');

    // Переопределение для блога записей
    add_rewrite_rule('^blog/(.+)/?$', 'index.php?name=$matches[1]', 'top');
}

Подсказки

  • После внесения изменений не забудьте обновить правила перезаписи в админ панели WordPress через "Настройки" → "Постоянные ссылки", просто нажмите "Сохранить изменения".
  • Проверьте, что ваши старые посты теперь доступны по новым URL-адресам без конфликтов. Это можно сделать с помощью инструмента проверки URL-адресов.

Заключение

Следуя окончательным шагам, вы сможете настроить структуру URL для страниц и постов блога в WordPress так, чтобы они соответствовали вашим требованиям. Это поможет избежать конфликтов между страницами и записями блога. Если возникнут дополнительные вопросы или сложности, обязательно проведите диагностику конфликта при помощи доступных вам плагинов для SEO, которые могут помочь в анализе структуры URL.

Оцените материал
Добавить комментарий

Капча загружается...