WordPress url functions php

Как изменить URL конкретных страниц / записей / рубрик / меток / таксономий через functions.php

Если вы читаете эту статью, то наверняка хотя бы раз слышали про WP_Rewrite. Этот класс позволяет работать с постоянными ссылками в WordPress, изменять их вид и структуру. WP_Rewrite задает правила перезаписи, которые будут действовать по всему блогу.

Сейчас же я покажу вам очень простой но действенный метод ручной замены URL конкретных страниц сайта на WordPress. Состоит он всего из трёх шагов: редиректа старых страниц на новые, изменения запроса к базе, перезаписи ссылок.

Шаг 1. Редиректы через хук template_redirect

Этот шаг нужен для того, чтобы страница не была доступна по двум URL одновременно, поэтому мы ставим 301й редирект со всех старых URL на новые (желающие могут реализовать это также через .htaccess ).

В примерах я по умолчанию использую префикс для рубрик — category и для меток — tag , у вас они могут отличаться.

Читайте также:  Абсолютная ссылка

Весь код, который вы увидите в этой статье — в functions.php .

function true_301_redirect() { /* в массиве указываем все старые=>новые ссылки */ $rules = array( array('old'=>'/category/без_рубрики/','new'=>'/category/Без_рубрики/'), // рубрика array('old'=>'/контакты/','new'=>'/Контакты/'), // страница array('old'=>'/привет-мир/','new'=>'/хеллоу-мир/'), // запись array('old'=>'/tag/метка/','new'=>'/tag/Метка/') // метка ); foreach( $rules as $rule ) : // если URL совпадает с одним из указанных в массиве, то редиректим if( urldecode($_SERVER['REQUEST_URI']) == $rule['old'] ) : wp_redirect( site_url( $rule['new'] ), 301 ); exit(); endif; endforeach; } add_action('template_redirect', 'true_301_redirect');

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

Ссылки на описания функций, использованных в примерах, вы найдёте в конце статьи.

Шаг 2. Изменение параметров запроса через хук request

Окей, редиректы проставили и, если вы уже начали пробовать то, что получилось, то у вас наверняка повылазили ошибки 404. Сейчас нам нужно добиться того, чтобы новые URL WordPress воспринимал как старые.

function true_request( $query ){ $url_zapros = urldecode($_SERVER['REQUEST_URI']); /* для рубрик */ if( $url_zapros == '/category/Без_рубрики/' ) $query['category_name'] = 'без_рубрики'; /* для страниц */ if( $url_zapros == '/Контакты/' ){ $query['pagename'] = urlencode('контакты'); unset($query['name']); } /* для записей */ if( $url_zapros == '/хеллоу-мир/' ) $query['name'] = 'привет-мир'; /* для меток */ if( $url_zapros == '/tag/Метка/' ) $query['tag'] = 'метка'; return $query; } add_filter( 'request', 'true_request', 9999, 1 );

Шаг 3. И конечно же сама перезапись ссылок

Хуки для записей и страниц будут отличаться от хуков для рубрик и меток.

Для записей / страниц

function true_posts_links( $url, $post ){ if( !is_object( $post ) ) $post = get_post( $post_id ); $replace = $post->post_name; /* замены для записей и страниц, к сожалению тут только по ID замену можно сделать */ if( $post->ID == 1 ) $replace = 'хеллоу-мир'; if( $post->ID == 12 ) $replace = 'Контакты'; $url = str_replace($post->post_name, $replace, $url ); return $url; } add_filter( 'post_link', 'true_posts_links', 'edit_files', 2 ); add_filter( 'page_link', 'true_posts_links', 'edit_files', 2 ); add_filter( 'post_type_link', 'true_posts_links', 'edit_files', 2 );

Обязательно ли делать проверку именно по ID записи? Да, если в URL присутствует кириллица. Если вы не знаете, где найти ID, спрашивайте в комментах, всё расскажу и покажу.

Перезапись ссылок для рубрик / меток

function true_term_links( $url, $term, $taxonomy ){ $replace = $term->slug; /* замены для рубрик/меток, опять-таки нужно указать ID и желаемый ярлык */ if( $term->term_id == 5 ) $replace = 'Без_рубрики'; if( $term->term_id == 55 ) $replace = 'Метка'; $url = str_replace($term->slug, $replace, $url ); return $url; } add_filter( 'term_link', 'true_term_links', 10, 3 );

Альтернатива всему этому в виде плагина Custom Permalinks

Если вы не хотите мудохаться через functions.php , то рекомендую плагин Custom Permalinks. Мне он показался очень удобным — прямо в админке можно указать свои произвольные урлы.

Например при создании рубрик:

Произвольный URL рубрики при помощи плагина Custom Permalinks

Смотрите также

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 19

Привет -) Мне кажется, такие штуки не очень актуальны, хотя мы недавно с джумлы перевозили сайт — что-то похожее делали. Но есть актуальные проблемы, которые даже не гугляться.
Например, пример загрузки лого через кастомайзер — http://kwight.ca/2012/12/02/adding-a-logo-uploader-to-your-wordpress-site-with-the-theme-customizer/.
Но как эту фигню реализовать с поддержкой экранов ретина? Все реализации, которые встречались и я использую — просто поля для загрузки двух лого на странице настроек темы. Но хочется ведь красиво -)

Привет, ну чтобы не было двух лого, нужно в формате svg загружать, или вы хотите чтобы загружалась большая картинка и WP её автоматически подрезал два ретины и для обычного?

Источник

Изменяем структуру постоянных ссылок через functions.php

Если вы хотите просто поменять структуру пермалинков на своём блоге, то лучше вам воспользоваться меню.

Если всё это настраивается в админке, тогда зачем лезть в functions.php?

  • если нету доступа к админке
  • при создании плагина или темы
  • по какой-то вашей собственной причине

И сразу к делу — вот вам код, если не знаете, куда вставлять — прочитайте пожалуйста заголовок статьи 🙂

function my_permalink_function(){ global $wp_rewrite; $wp_rewrite->set_permalink_structure('/%category%/%postname%.html'); $wp_rewrite->flush_rules(); } add_action('init', 'my_permalink_function');

Итак, структура постоянных ссылок задается на 3-й строчке (в скобках и кавычках) при помощи структурных тегов.

Если использовать тот пример, то ссылки на страницах с постами будут выглядеть так же, как у меня на блоге (на этом блоге).

Думаю имеет смысл рассмотреть один пример.

Запись в виде тегов:
/%year%/%monthnum%/%day%/%postname%.html

Как будет выглядеть ссылка:
https://misha.agency/2012/01/20/change-permalinks-in-functions-php.html

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 18

А можно поменять путь к картинкам, используя подпапки для больших, маленьких картинок. А не все в перемешку, как в последнем вордпрессе?

я вот задался вопросом, а как можно сделать окончание .html только к конечным страницам сайта? то есть если у страницы есть дочерняя страница, то у родительской тоже есть html, потом надо чтобы сразу у всех страниц (теги, посты, страницы, категории, таксономии и тд) проставлялся .html если они конечные.
Есть какие то идеи.?

он добавляет html только страница, причем всем, и родительским тоже. А я хочу чтобы у родительских был на конце слеш /, а у конечных .html, и то же самое, надо к тегам префикс.
Пока нигде не встречал решения, на джумле есть решение

очень круто, но я точно с таким не справлюсь!)) я просто верстальщик, частично разбирающийся в коде, но вот что-то придумать и сделать самому — пока не дорос до такого))

ну мы все с чего-то начинали)
ок, возьму на заметку, как дойдут руки, напишу этот плагин.
т.е. суть в том чтобы в конце всех урлов добавлялось .html, верно?

в конце всех конечных страниц. То есть создаем страницу site.ru/stranica/ и у неё дочерняя site.ru/stranica/doch.html
Ну или просто чтобы был выбор, ставить html или нет на определенной странице.
А то сейчас с помощью «html on pages» было бы так:
site.ru/stranica.html и site.ru/stranica/doch.html

Скажите а реально сделать в вордпресс так чтоб ссылки на категории имели такой вид www.сайт/тип поста/название таксономии/название категории

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

Миша, подскажите выход из ситуации. Если в Постоянных ссылках выбрать «Произвольно», и выставить шаблон без закрывающего слеша (к примеру %postname%.html), то закрывающие слеши убираются из всех URL (т.е. категории выглядят как /%category% , а произвольные типы постов как %post_type%/%postname%). Если задать шаблон со слешем, то и в других ссылках он присутствует. Как убрать слеши только для постов и страниц, оставив их в категориях и далее везде? Я понимаю, что рерайт работает и без слеша, мне это нужно исключительно с эстетической целью — привык, знаете ли, за многие годы, чтобы ЧПУ заканчивались либо слешем либо расширением.

Добрый день, Андрей, готового кода у меня к сожалению нет, могу порекомендовать почитать это, возможно идеи появятся.

Источник

Как изменить URL конкретных страниц / записей / рубрик / меток / таксономий через functions.php

Если вы читаете эту статью, то наверняка хотя бы раз слышали про WP_Rewrite. Этот класс позволяет работать с постоянными ссылками в WordPress, изменять их вид и структуру. WP_Rewrite задает правила перезаписи, которые будут действовать по всему блогу.

Сейчас же я покажу вам очень простой но действенный метод ручной замены URL конкретных страниц сайта на WordPress. Состоит он всего из трёх шагов: редиректа старых страниц на новые, изменения запроса к базе, перезаписи ссылок.

Шаг 1. Редиректы через хук template_redirect

Этот шаг нужен для того, чтобы страница не была доступна по двум URL одновременно, поэтому мы ставим 301й редирект со всех старых URL на новые (желающие могут реализовать это также через .htaccess ).

В примерах я по умолчанию использую префикс для рубрик — category и для меток — tag , у вас они могут отличаться.

Весь код, который вы увидите в этой статье — в functions.php .

function true_301_redirect()  /* в массиве указываем все старые=>новые ссылки */ $rules = array( array('old'=>'/category/без_рубрики/','new'=>'/category/Без_рубрики/'), // рубрика array('old'=>'/контакты/','new'=>'/Контакты/'), // страница array('old'=>'/привет-мир/','new'=>'/хеллоу-мир/'), // запись array('old'=>'/tag/метка/','new'=>'/tag/Метка/') // метка ); foreach( $rules as $rule ) : // если URL совпадает с одним из указанных в массиве, то редиректим if( urldecode($_SERVER['REQUEST_URI']) == $rule['old'] ) : wp_redirect( site_url( $rule['new'] ), 301 ); exit(); endif; endforeach; > add_action('template_redirect', 'true_301_redirect');

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

Ссылки на описания функций, использованных в примерах, вы найдёте в конце статьи.

Шаг 2. Изменение параметров запроса через хук request

Окей, редиректы проставили и, если вы уже начали пробовать то, что получилось, то у вас наверняка повылазили ошибки 404. Сейчас нам нужно добиться того, чтобы новые URL WordPress воспринимал как старые.

function true_request( $query ) $url_zapros = urldecode($_SERVER['REQUEST_URI']); /* для рубрик */ if( $url_zapros == '/category/Без_рубрики/' ) $query['category_name'] = 'без_рубрики'; /* для страниц */ if( $url_zapros == '/Контакты/' ) $query['pagename'] = urlencode('контакты'); unset($query['name']); > /* для записей */ if( $url_zapros == '/хеллоу-мир/' ) $query['name'] = 'привет-мир'; /* для меток */ if( $url_zapros == '/tag/Метка/' ) $query['tag'] = 'метка'; return $query; > add_filter( 'request', 'true_request', 9999, 1 );

Шаг 3. И конечно же сама перезапись ссылок

Хуки для записей и страниц будут отличаться от хуков для рубрик и меток.

Для записей / страниц

function true_posts_links( $url, $post ) if( !is_object( $post ) ) $post = get_post( $post_id ); $replace = $post->post_name; /* замены для записей и страниц, к сожалению тут только по ID замену можно сделать */ if( $post->ID == 1 ) $replace = 'хеллоу-мир'; if( $post->ID == 12 ) $replace = 'Контакты'; $url = str_replace($post->post_name, $replace, $url ); return $url; > add_filter( 'post_link', 'true_posts_links', 'edit_files', 2 ); add_filter( 'page_link', 'true_posts_links', 'edit_files', 2 ); add_filter( 'post_type_link', 'true_posts_links', 'edit_files', 2 );

Обязательно ли делать проверку именно по ID записи? Да, если в URL присутствует кириллица. Если вы не знаете, где найти ID, спрашивайте в комментах, всё расскажу и покажу.

Перезапись ссылок для рубрик / меток

function true_term_links( $url, $term, $taxonomy ) $replace = $term->slug; /* замены для рубрик/меток, опять-таки нужно указать ID и желаемый ярлык */ if( $term->term_id == 5 ) $replace = 'Без_рубрики'; if( $term->term_id == 55 ) $replace = 'Метка'; $url = str_replace($term->slug, $replace, $url ); return $url; > add_filter( 'term_link', 'true_term_links', 10, 3 );

Альтернатива всему этому в виде плагина Custom Permalinks

Если вы не хотите мудохаться через functions.php , то рекомендую плагин Custom Permalinks. Мне он показался очень удобным — прямо в админке можно указать свои произвольные урлы.

Например при создании рубрик:

Источник

Оцените статью