Як додати спеціальне посилання до меню з 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і siteurlWordpress шляхом:

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

Я не хочу використовувати повні URL-адреси для користувацьких посилань і потребувати заміни таких на URL-адреси сервера щоразу, коли мені потрібно оновити базу даних сервера.

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


5
Уіллінгтон, я не можу допомогти вам URL-адресі, яка працює в будь-якому місці. Що я можу зробити, - це вказати на бази specu.la/search-and-replace-for-wordpress-data . Я використовую пошук і заміну Давида досить довгий час, і мені добре змінюється, наприклад, URL-адреса - навіть коли в серіалізованих даних. Тож ось як я це роблю: просто жорстко кодуються посилання та конвертуються після переміщення бази даних на інший домен. Удачі, Пітер
Петро,

Поки єдиний спосіб, з якого я виявив успішний перехід із середовища розробок до живого середовища, - це після того, як на SQL-дампах було здійснено пошук та заміну всього файлу, а не лише змінити параметри дому та siteurl. У мене були файли, де URL знаходився там понад 1000 разів. (досі не знаю, як вдалося досягти такої висоти :))
Роб Вільямс

@Peter, @Rob дякую, хлопці, за відповіді, я побоювався, що пошук і заміна - єдине рішення, але хотів запитати спочатку. Я перегляну цей сценарій.
Віллінгтон Вега

Найкраще використовувати сценарій, як той, який я запропонував. Зауважте, що пошук і заміна тексту на дамбі дамп викручує серіалізовані дані (особливо це стосується wp_options), якщо і коли довжина рядків пошуку та заміни не однакова, оскільки ці дані зберігаються у db із специфікацією довжини . Успіх, Петро
Петро,

Відповіді:


9

Я також шукав рішення для цього і знайшов просте.

Це те, що потрібно розмістити в полі URL:

/index.php/internal-site-name

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

Це працює просто чудово!

З найкращими побажаннями Кріс


1
Це працює, але воно також змінює URL-адресу, включаючи index.php. У випадку застосування програми на одній сторінці із посиланням # спочатку оновить сторінку, а потім доставить вас до місця призначення (лише в перший раз). Незважаючи на це, гарна ідея
Каталін Деаконеску

Я використав / що-небудь без частини index.php і, здається, працює
user3808307

4

Ви можете використовувати 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 );

Ви можете створити простий плагін з цим кодом і активувати його лише на своєму тестовому сервері, або створити якийсь прапор, який умовно застосовує цей фільтр, коли є середовище тестового сайту.


Це найкращий спосіб, який я знайшов! Але будь ласка, @Milo, змінити третій рядок за допомогою цього розумнішого базового URL-адреси wordpress (отримати сайт_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-адресою всіх якорів, додайте це до теми / header.php у межах <head>:

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

я знаю, що може запізнитися на вас, але я можу допомогти іншому.


Виглядає перспективно. Я перевіряю це і звітую.
Eric Hepperle - 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 для переміщення сайту.


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'::

Тепер ви можете перейти до передовій і перевірити, чи працює короткий код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.