willingtonvega
  • 0
Новичок

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

  • 0

Частью моей работы является создание веб-сайтов 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/, но мне не удалось найти что-то подобное для пользовательских ссылок..

Share
  1. Уиллингтон, я не могу помочь вам с URL-адресом, который работает где угодно. Что я могу сделать, так это указать вам на spectacu.la/search-and-replace-for-wordpress-databases. Я использую поиск и замену Дэвида в течение достаточно долгого времени, и я хорошо работаю, чтобы изменить, например, URL-адрес — даже в сериализованных данных. Вот как я это делаю: просто жестко закодированные ссылки и преобразование после перемещения базы данных в другой домен. Удачи, Питер

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

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

    /index.php/internal-site-name
    

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

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

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

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

    В этом примере мы ищем любые атрибуты href, начинающиеся с /, и в этом случае добавляем 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 );
    

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

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

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

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

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

    Я знаю, что могу опоздать для вас, но могу помочь кому-то еще.

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

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

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

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

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

    • 0
  6. Сначала вам нужно установить этот плагин для шорткодов 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'::
    

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

    • 0

Оставить ответ

You must login to add an answer.