Как в wordpress удалить домен в url меню?

Не знаком с wordpress, надо wp_nav_menu возращал ссылки без домена, т.е не http://name-site/ , а просто /
  • Вопрос задан
  • 382 просмотра
Решения вопроса 1
wppanda5
@wppanda5 Куратор тега WordPress
WordPress Mедведь
Повеситься сюда
https://github.com/WordPress/WordPress/blob/001ffe...
function wpp_remove_domain_in_nav_menus( $item_output, $item, $depth, $args ) {
		return str_replace( get_home_url(), '', $item_output );
	}

	add_filter( 'walker_nav_menu_start_el', 'wpp_remove_domain_in_nav_menus', 10, 4 );
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Вообще есть несколько способов, и все они решают задачу - но с разной степенью влияния на производительность и возможными побочными эффектами (или же наоборот - их отсутствием). Лично я предпочитаю любой код писать как можно "ближе к телу", чтобы изменения происходили с минимальным количеством телодвижений.

Например, вариант от 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 - и это будет работать, и заметной разницы в производительности не будет, если это сделано только в этом одном месте. Но важен ваш подход к написанию кода в целом. Если подходить без задротства, то в крупных и сложных проектах начнут появляться проблемы с производительностью. Решить эту задачу можно сразу "оптимальнее", по времени и количеству строк одно и то же, эффект тот же. Но в долгосрочной перспективе - как для конкретного проекта, так и для вашей карьеры в целом, больше пользы если решать задачи наиболее эффективным методом.

ЗЫ: Задроты поймут, лентяи - нет :)
Ответ написан
zorca
@zorca Куратор тега WordPress
5ec54f51c6ce8405024235.png

Если же необходимо из ВСЕХ ссылок меню удалять домен, то сделать свой Navwalker.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы