Jak dodać niestandardowy link do menu z adresem URL, który jest względny w stosunku do adresu URL bloga

16

Częścią mojej pracy jest tworzenie stron internetowych Wordpress. Zwykle pracuję na laptopie, dopóki nie mam czegoś wystarczająco dobrego, aby przesłać je na serwer testowy, na którym klient go sprawdza.

Tworzę VirtualHost dla każdego nowego projektu, więc zawsze pracuję z instalacją Wordpress w domenie, która wygląda http://local.example.com/, ale kiedy strona zostanie przesłana na serwer testowy (nie kontrolowany przeze mnie), domena może być czymś podobnym http://testserver.com/arbitrary/path/example/.

Problem polega na tym, że jeśli dodam niestandardowy link do menu, które wskazuje na przykład, /events/działałoby to dobrze lokalnie, tworząc link do http://local.example.com/events/, ale na serwerze testowym link wskaże http://testserver/events/, co oczywiście nie jest poprawne.
Chcę, aby niestandardowy link miał adres URL, który działałby zarówno w moim środowisku lokalnym, jak i na serwerze testowym.

Rozwiązuję już problem zmiany opcji homei siteurlWordpressa poprzez:

  • zmiana tych ustawień w lokalnej bazie danych
  • tworzenie zrzutu bazy danych
  • zaktualizuj bazę danych na serwerze
  • przywracanie opcji lokalnych.

Nie chcę używać pełnych adresów URL do niestandardowych łączy i muszę zamieniać je na adresy URL serwera za każdym razem, gdy muszę aktualizować bazę danych serwera.

W przypadku linków w treści postu istnieje wtyczka, która rozwiązuje problem z dodaniem dwóch skrótów: http://wordpress.org/extend/plugins/url-shortcodes/ , ale nie udało mi się znaleźć czegoś podobnego dla niestandardowych linków .

Willington Vega
źródło
5
Willington, nie mogę ci pomóc w tworzeniu adresu URL, który działa wszędzie. Co mogę zrobić, to wskazać Ci na spectacu.la/search-and-replace-for-wordpress-databases . Od dłuższego czasu korzystam z wyszukiwania i zastępowania Davida i dobrze się zmieniam, np. URL - nawet w przypadku danych zserializowanych. Tak właśnie to robię: po prostu zakoduj linki i przekonwertuj po przeniesieniu bazy danych do innej domeny. Powodzenia, Peter
Peter
Jak dotąd jedynym sposobem, który udało mi się z powodzeniem przenieść ze środowiska deweloperskiego do środowiska na żywo, jest zrobienie zrzutu SQL w celu przeszukania i zastąpienia całego pliku, a nie tylko zmiany opcji home i siteurl. Mam pliki, w których URL był tam ponad 1000 razy. (wciąż nie wiem, jak udało mu się tak wysoko :))
Rob Williams
@Peter, @Rob dziękuję wam za odpowiedź, bałem się, że wyszukiwanie i zamiana to jedyne rozwiązanie, ale najpierw chciałem zapytać. Rzucę okiem na ten skrypt.
Willington Vega
Najlepiej jest użyć skryptu takiego jak ten, który zaproponowałem. Zauważ, że wyszukiwanie i zamiana tekstu w zrzucie bazy danych zepsuje zserializowane dane (szczególnie znalezione w wp_options), jeśli i kiedy długość ciągów wyszukiwania i zamiany nie jest taka sama, ponieważ dane te są przechowywane w db ze specyfikacją długości . Sukces, Peter
Peter

Odpowiedzi:

9

Szukałem również rozwiązania tego problemu i znalazłem proste.

Oto, co musisz umieścić w polu adresu URL:

/index.php/internal-site-name

wprowadź opis zdjęcia tutaj

Działa dobrze!

Z pozdrowieniami Chris

Christian Hatz
źródło
1
To działa, ale zmienia również adres URL, aby uwzględnić index.php. W przypadku aplikacji z pojedynczą stroną z # linkami najpierw odświeży stronę, a następnie zabierze Cię do miejsca docelowego (tylko za pierwszym razem). Mimo to dobry pomysł
Catalin Deaconescu
Użyłem / coś bez części index.php i wydaje się, że działa
użytkownik3808307
4

Możesz użyć nav_menu_link_attributesfiltra, aby sprawdzić i zmodyfikować atrybut href dla każdego elementu menu przed jego wydrukowaniem.

W tym przykładzie szukamy wszelkich atrybutów href, które zaczynają się od /, i w tym przypadku poprzedzamy adres URL witryny testowej:

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 );

Możesz utworzyć prostą wtyczkę z tym kodem i aktywować ją tylko na serwerze testowym lub utworzyć flagę, która warunkowo zastosuje ten filtr, gdy obecne jest środowisko strony testowej.

Milo
źródło
To najlepszy sposób, jaki znalazłem! Ale proszę @Milo, zmień trzeci wiersz za pomocą tego inteligentniejszego podstawowego adresu URL WordPressa (pobierz to site_url z wordpress): $ atts ['href'] = site_url (). $ atts ['href'];
gtamborero,
2

Użycie <base href=" ">tagu w meta head da podstawowy adres URL do wszystkich względnych kotwic na stronie.

Odniesienie:
https://www.w3.org/TR/html4/struct/links.html
12.4 Informacje o ścieżce: element BASE

Względne niestandardowe linki w wordpress:
Jeśli chcesz, aby URL strony był podstawowym adresem URL wszystkich kotwic, dodaj to do theme / header.php w <head>:

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

wiem, że może być dla ciebie spóźniony, ale może pomóc komuś innemu.

David Pacheco
źródło
Wygląda obiecująco. Przetestuję to i zdam raport.
Eric Hepperle - CodeSlayer2010
Nie działa z takimi ścieżkami, ehepperle.com/sites/in-progress/some-wp-site-root/chyba że jawnie ustawisz katalog główny witryny. Szybkość tworzenia stron internetowych nie jest zauważalnie poprawiona za pomocą baseznacznika, ponieważ podczas migracji do innej witryny konieczne będzie ponowne zdefiniowanie podstawy. Widzę jednak wartość zmniejszania długości wartości href.
Eric Hepperle - CodeSlayer2010
Pomysł jest dobry, ale wydaje się, że Wordpress ignoruje ścieżkę bazową podczas korzystania ze ścieżek względnych w niestandardowych menu wp (na przykład: / contact)
gtamborero
1

Na niestandardowym adresie URL w ustawieniach menu można użyć względnych linków do [blogurl]. Sekret polega na tym, aby względny adres URL rozpocząć od jednego /. Gdy pojedynczy / uruchamia niestandardowy adres URL, system nie będzie poprzedzał typowego adresu URL, http://a bieżący blogURL zostanie wygenerowany w docelowym adresie URL w czasie wykonywania.

PRZYKŁAD
Jeśli chcesz przejść do strony głównej, po prostu wpisz /niestandardowy adres URL

Jeśli chcesz przejść do strony indeksu w folderze, bbforumswpisz /bbforumsniestandardowy adres URL.

Pozwala to przenieść witrynę do domeny testowej bez konieczności kodowania nowego blogURL we wszystkich niestandardowych linkach do menu.

Na przykład:
jeśli mój blog jest http://example.comi chcę go przetestować w subdomenie, http://test.example.comwitryna może być przenoszona między wersją testową i produkcyjną bez problemów z menu przy użyciu wspomnianej powyżej konwencji adresów URL. Z powodzeniem przetestowałem to podejście za pomocą wtyczki XCloner do przeniesienia witryny.

użytkownik41251
źródło
6
Nie działa to w przypadku adresów URL blogów zawierających ukośniki, na przykład example.com/blog . Podążanie za punktem menu „/” spowoduje przejście do example.com .
Jimpanzee
1

Najpierw musisz zainstalować tę wtyczkę dla skrótów URL.

Dodaj ten kod do functions.phppliku w motywie:

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 );
    } 
}

Następnie musisz wywołać wp_nav_menufunkcję z plików szablonów:

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

Otóż ​​to. Następnie przejdź do sekcji menu zaplecza.

Na przykład, jeśli chcę podać adres URL strony do niestandardowego linku, dodam go w następujący sposób:

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

Teraz możesz przejść do interfejsu i sprawdzić, czy shortcode działa.

Manimaran
źródło