it-swarm.com.de

Add a benutzerdefinierten Links to a menu with a URL, the relative to the Blog-URL is

Ein Teil meiner Arbeit besteht darin, Wordpress-Websites zu erstellen. Normalerweise arbeite ich an meinem Laptop, bis ich etwas habe, das gut genug ist, um auf den Testserver hochgeladen zu werden, auf dem der Client es überprüft.

Ich erstelle einen VirtualHost für jedes neue Projekt, daher arbeite ich immer mit einer Wordpress-Installation in einer Domäne, die wie http://local.example.com/ aussieht. Wenn die Site jedoch auf den Testserver hochgeladen wird (nicht von mir gesteuert), wird die Domäne möglicherweise so etwas wie http://testserver.com/arbitrary/path/example/.

Das Problem ist, dass, wenn ich einen benutzerdefinierten Link zu einem Menü hinzufüge, das beispielsweise auf /events/ verweist, das lokale Erstellen eines Links zu http://local.example.com/events/ problemlos funktioniert. Auf dem Testserver verweist der Link jedoch auf http://testserver/events/, was offensichtlich nicht der Fall ist Recht.
Ich möchte dem benutzerdefinierten Link eine URL geben, die sowohl in meiner lokalen Umgebung als auch auf dem Testserver funktioniert.

Ich behandle bereits das Problem des Änderns der Optionen home und siteurl Wordpress durch:

  • ändern Sie diese Einstellungen in der lokalen Datenbank
  • erstellen eines Speicherauszugs der Datenbank
  • aktualisieren Sie die Datenbank auf dem Server
  • wiederherstellen der lokalen Optionen.

Ich möchte keine vollständigen URLs für die benutzerdefinierten Links verwenden und diese nicht jedes Mal durch die Server-URL ersetzen müssen, wenn ich die Datenbank des Servers aktualisieren muss.

Für Links innerhalb des Beitragsinhalts gibt es ein Plugin, das das Problem behebt und zwei Shortcodes hinzufügt: http://wordpress.org/extend/plugins/url-shortcodes/ , aber ich konnte nichts finden Ähnliches gilt für benutzerdefinierte Links.

12
Willington Vega

Ich suchte auch nach einer Lösung dafür und fand eine einfache.

Folgendes müssen Sie in das URL-Feld einfügen:

/index.php/internal-site-name

enter image description here

Es funktioniert gut!

Beste Grüße Chris

8
Christian Hatz

Mit dem <base href=" ">-Tag im Kopf-Meta erhalten alle relativen Anker auf der Seite eine Basis-URL.

Referenz:
https://www.w3.org/TR/html4/struct/links.html
12.4 Pfadinformationen: das BASE-Element

Relative benutzerdefinierte Links in WordPress:
Wenn Sie möchten, dass die Site-URL die Basis-URL aller Anker ist, fügen Sie dies zum theme/header.php im <head> hinzu:

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

Ich weiß, dass es zu spät für Sie sein könnte, aber jemand anderem helfen könnte.

3
David Pacheco

Sie können den nav_menu_link_attributes-Filter verwenden, um das href-Attribut für jedes Menüelement zu überprüfen und zu ändern, bevor es ausgegeben wird.

In diesem Beispiel suchen wir nach href-Attributen, die mit einem / beginnen, und stellen in diesem Fall die URL der Testsite voran:

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

Sie können ein einfaches Plugin mit diesem Code erstellen und es nur auf Ihrem Testserver aktivieren oder eine Art Flag erstellen, das diesen Filter bedingt anwendet, wenn die Testsiteumgebung vorhanden ist.

3
Milo

Auf einer benutzerdefinierten URL im Menü-Setup können relative Links zu [blogurl] verwendet werden. Das Geheimnis ist, die relative URL mit einem einzigen / zu beginnen. Wenn ein einzelnes/die benutzerdefinierte URL startet, wird dem System nicht der typische http:// vorangestellt, und die aktuelle blogURL wird zur Ausführungszeit in der Ziel-URL generiert.

BEISPIEL
Wenn Sie zu Ihrer Homepage wechseln möchten, geben Sie einfach / als benutzerdefinierte URL ein

Wenn Sie zur Indexseite im Ordner bbforums wechseln möchten, geben Sie /bbforums als benutzerdefinierte URL ein.

Auf diese Weise können Sie eine Site in eine Testdomäne verschieben, ohne die neue blogURL in allen benutzerdefinierten Links für die Menüs fest codieren zu müssen.

Zum Beispiel:
Wenn mein Blog http://example.com ist und ich es in einer Subdomain http://test.example.com testen möchte, kann die Site mithilfe der oben angegebenen relativen URL-Konvention ohne Menüprobleme zwischen Test und Produktion verschoben werden. Ich habe diesen Ansatz erfolgreich mit dem XCloner-Plugin getestet, um die Site zu verschieben.

1
user41251

Zuerst müssen Sie dieses Plugin für URL-Shortcodes installieren.

Fügen Sie diesen Code zu Ihrer functions.php-Datei in Ihrem Thema hinzu:

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

Dann müssen Sie die Funktion wp_nav_menu aus den Vorlagendateien aufrufen:

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

Das ist es. Gehen Sie dann zum Back-End-Menüabschnitt.

Wenn ich beispielsweise die Seiten-URL einem benutzerdefinierten Link zuweisen möchte, füge ich sie folgendermaßen hinzu:

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

Jetzt können Sie zum Frontend gehen und prüfen, ob der Shortcode funktioniert.

1
Manimaran