Как добавить пользовательскую ссылку в меню с URL-адресом относительно URL-адреса блога

16

Часть моей работы заключается в создании сайтов Wordpress. Я обычно работаю на своем ноутбуке, пока не получу что-то хорошее, чтобы загрузить его на тестовый сервер, где клиент просматривает его.

Я создаю VirtualHost для каждого нового проекта, поэтому я всегда работаю с установкой Wordpress в домене, который выглядит следующим образом http://local.example.com/, но когда сайт загружается на тестовый сервер (не контролируется мной), домен может перестать быть похожим http://testserver.com/arbitrary/path/example/.

Проблема в том, что если я добавлю пользовательскую ссылку в меню, которое указывает, например, на то /events/, что оно будет работать локально, создавая ссылку http://local.example.com/events/, но на тестовом сервере ссылка будет указывать http://testserver/events/, что, очевидно, не правильно.
Я хочу предоставить пользовательской ссылке URL-адрес, который будет работать как в моей локальной среде, так и на тестовом сервере.

Я уже справиться с проблемой смены homeи siteurlнастройки WordPress с помощью:

  • изменение этих настроек в локальной базе данных
  • создание дампа базы данных
  • обновить базу данных на сервере
  • восстановление локальных настроек.

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

Для ссылок внутри содержимого публикации есть плагин, который решает проблему с добавлением двух шорткодов: http://wordpress.org/extend/plugins/url-shortcodes/ , но мне не удалось найти что-то подобное для пользовательских ссылок. ,

Уиллингтон Вега
источник
5
Уиллингтон, я не могу помочь тебе с URL, который работает где угодно. Что я могу сделать, так это указать вам на spectu.la/search-and-replace-for-wordpress-databases . Я уже довольно давно пользуюсь поиском и заменой Дэвида, и я хорошо работаю над тем, чтобы изменить, например, URL-адреса - даже в сериализованных данных. Вот как я это делаю: просто жестко закодированные ссылки и конвертируем после перемещения базы данных в другой домен. Удачи, Питер
Питер
Пока что единственный способ успешно перейти из среды разработки в живую среду - это выполнить дамп SQL для поиска и замены всего файла, а не просто изменить параметры home и siteurl. У меня были файлы, где URL был там более 1000 раз. (до сих пор не знаю, как ему удалось подняться так высоко :))
Роб Уильямс
@Peter, @Rob спасибо, ребята, что ответили, я боялся, что поиск и замена - единственное решение, но сначала хотел спросить. Я посмотрю на этот сценарий.
Уиллингтон Вега
Лучше всего использовать скрипт, подобный тому, который я предложил. Обратите внимание, что текстовый поиск и замена в дампе базы данных испортит сериализованные данные (особенно в wp_options), если и когда длина строк поиска и замены не совпадает, так как эти данные хранятся в базе данных с указанием длины , Успех, Питер
Питер

Ответы:

9

Я также искал решение для этого, и я нашел простое.

Это то, что вам нужно поместить в поле URL:

/index.php/internal-site-name

введите описание изображения здесь

Работает просто отлично!

С наилучшими пожеланиями Крис

Кристиан Хац
источник
1
Это работает, но также изменяет URL, чтобы включить index.php. В случае одностраничного приложения с # ссылками оно сначала обновит страницу, а затем приведет вас к месту назначения (только в первый раз). Тем не менее, хорошая идея
Каталин Дьяконеску
Я использовал / что-то без index.php и, кажется, работает
user3808307
4

Вы можете использовать nav_menu_link_attributesфильтр для проверки и изменения атрибута href для каждого пункта меню перед его выводом.

В этом примере мы ищем любые атрибуты href, которые начинаются с a /, и в этом случае добавляем URL-адрес тестового сайта:

function wpd_nav_menu_link_atts( $atts, $item, $args, $depth ){
    if( '/' == substr( $atts['href'], 0, 1 ) ){
        $atts['href'] = 'http://testserver.com/example' . $atts['href'];
    }
    return $atts;
}
add_filter( 'nav_menu_link_attributes', 'wpd_nav_menu_link_atts', 20, 4 );

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

Milo
источник
Это лучший способ, который я нашел! Но, пожалуйста, @Milo, измените третью строку с помощью этого более умного базового URL для WordPress (получим site_url из wordpress): $ atts ['href'] = site_url (). $ ATTS [ 'HREF'];
gtamborero
2

Использование <base href=" ">тега в мета-заголовке даст базовый URL для всех относительных якорей на странице.

Ссылка:
https://www.w3.org/TR/html4/struct/links.html
12.4 Информация о пути: элемент BASE

Относительные пользовательские ссылки в WordPress:
если вы хотите, чтобы URL сайта был базовым URL всех якорей, добавьте его в theme / header.php внутри <head>:

<base href="<?php echo site_url(); ?>/">

я знаю, что может опоздать на тебя, но может помочь кому-то еще.

Дэвид Пачеко
источник
Выглядит многообещающе. Я проверю это и сообщу.
Эрик Хепперле - CodeSlayer2010
Не работает с путями, как, ehepperle.com/sites/in-progress/some-wp-site-root/если вы явно не установите корень сайта. Скорость веб-разработки заметно не улучшается с помощью baseтегов, поскольку при переходе на другой сайт вам придется заново определить, что такое база. Тем не менее, я вижу значение в уменьшении длины значений href.
Эрик Хепперле - CodeSlayer2010
Идея хорошая, но кажется, что Wordpress игнорирует базовый путь при использовании относительных путей в пользовательских меню wp (например: / contact)
gtamborero
1

На настраиваемом URL в настройках меню можно использовать относительные ссылки на [blogurl]. Секрет в том, чтобы начать относительный URL с одного /. Когда один / запускает пользовательский URL-адрес, система не будет добавлять http://префикс типичного, и тогда во время выполнения будет создан текущий blogURL в целевом URL-адресе.

ПРИМЕР.
Если вы хотите перейти на свою домашнюю страницу, просто укажите /в качестве пользовательского URL

Если вы хотите перейти на страницу индекса в папке, bbforumsукажите ее /bbforumsв качестве пользовательского URL.

Это позволяет вам переместить сайт в тестовый домен без необходимости жесткого кодирования нового blogURL во всех пользовательских ссылках для меню.

Например:
если мой блог http://example.comи я хочу протестировать его на поддомене, http://test.example.comсайт можно перемещать между тестированием и производством без проблем с меню, используя относительное соглашение URL, указанное выше. Я успешно протестировал этот подход, используя плагин XCloner для перемещения сайта.

user41251
источник
6
Это не работает для URL-адресов блогов с косой чертой, например example.com/blog . После пункта меню «/» вы попадете на example.com .
Jimpanzee
1

Сначала вы должны установить этот плагин для URL шорткодов.

Добавьте этот код в ваш functions.phpфайл в вашей теме:

class description_walker extends Walker_Nav_Menu {
    function start_el( &$output, $item, $depth, $args ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
        $class_names = ' class="'. esc_attr( $class_names ) . '"';

        $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) . '"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) . '"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) . '"' : '';

        // echo $item->url;
        $string = explode( '::', $item->url, 3 );
        if ( $string[1] ) {
            $string[1] = str_replace( '-', ' ', $string[1] );
            $item->url = do_shortcode( "[$string[1]]" ); 
        }

        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $prepend = '<strong>';
        $append = '</strong>';
        $description  = ! empty( $item->description ) ? '<span>' . esc_attr( $item->description ) . '</span>' : '';

        if ( $depth != 0 ) {
            $description = $append = $prepend = "";
        }

        $item_output  = $args->before;
        $item_output .= '<a'. $attributes . '>';
        $item_output .= $args->link_before . $prepend . apply_filters( 'the_title', $item->title, $item->ID ) . $append;
        $item_output .= $description . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    } 
}

Затем вам нужно вызвать wp_nav_menuфункцию из файлов шаблонов:

$arg = array( 
    'menu'        => "main-menu", 
    'echo'        => true, 
    'fallback_cb' => 'wp_page_menu', 
    'depth'       => 0, 
    'walker'      => new description_walker() 
); 
wp_nav_menu( $arg );

Вот и все. Затем перейдите в раздел внутреннего меню.

Например, если я хочу дать URL-адрес страницы для пользовательской ссылки, я добавлю ее следующим образом:

http://::blogurl-id='1302'::

Теперь вы можете перейти к интерфейсу и проверить, работает ли шорткод.

Манимаран
источник