Вообще есть несколько способов, и все они решают задачу - но с разной степенью влияния на производительность и возможными побочными эффектами (или же наоборот - их отсутствием). Лично я предпочитаю любой код писать как можно "ближе к телу", чтобы изменения происходили с минимальным количеством телодвижений.
Например, вариант от
WP_Panda абсолютно рабочий. Но меня напрягает использование
get_home_url()
- и в нем нет никакого смысла, если у вас не мультисайт (что чаще всего), достаточно использовать
get_option( 'home' )
. Эффект тот же, CPU cycles использовано - меньше.
Дальше, мне не очень по душе перебирать длинные строки которые потенциально могут сломаться целиком, комфортнее работать с данными, до того как они собрались в HTML:
function absolute_to_relative_url( $atts )
{
$atts['href'] = str_replace( get_option( 'home' ), '', $atts['href'] );
return $atts;
}
add_filter( 'nav_menu_link_attributes', 'absolute_to_relative_url' );
Но и здесь мой внутренний задрот все еще не будет удовлетворен, потому что у нас постоянно вызывается
get_option( 'home' )
(или
get_home_url()
), хотя это значение не меняется. Плюс наша логика выполняется на фильтре, который запускается для каждого элемента меню - это все тоже лишние CPU cycles. Поэтому я бы сделал вот так:
function absolute_to_relative_url( $sorted_menu_items )
{
$host = get_option( 'home' );
foreach ( $sorted_menu_items as $item ) {
$item->url = str_replace( $host, '', $item->url );
}
return $sorted_menu_items;
}
add_filter( 'wp_nav_menu_objects', 'absolute_to_relative_url' );
Бенефиты - наш коллбек вызывается всего один раз для одного меню, адрес сайта получается один раз, простой цикл быстро перебирает объекты пунктов меню (данные).
Этого можно не делать, можно просто отфильтровать HTML - и это будет работать, и заметной разницы в производительности не будет, если это сделано только в этом одном месте. Но важен ваш подход к написанию кода в целом. Если подходить без задротства, то в крупных и сложных проектах начнут появляться проблемы с производительностью. Решить эту задачу можно сразу "оптимальнее", по времени и количеству строк одно и то же, эффект тот же. Но в долгосрочной перспективе - как для конкретного проекта, так и для вашей карьеры в целом, больше пользы если решать задачи наиболее эффективным методом.
ЗЫ: Задроты поймут, лентяи - нет :)