Вопрос или проблема
Я пытаюсь изменить 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, необходимо учитывать несколько факторов, чтобы убедиться, что ваша страница блога и записи блога работают корректно без конфликтов. В данном ответе мы разберем предложенные вами функции и предложим улучшения.
Цели
- Настроить URL-адреса страниц, чтобы они заканчивались на
.htm
. - Исключить страницу блога из данного правила, чтобы URL-адрес страницы блога не имел
.htm
. - Убедиться, что индивидуальные записи блога, находящиеся по адресу
/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.