Hinzufügen eines benutzerdefinierten Links zu einem Menü mit einer URL, die relativ zur Blog-URL ist


15

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, also arbeite ich immer mit einer Wordpress-Installation in einer Domäne, die aussieht http://local.example.com/, aber wenn die Site auf den Testserver hochgeladen wird (nicht von mir kontrolliert), kann die Domäne so etwas wie enden http://testserver.com/arbitrary/path/example/.

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

Das Problem des Änderns der Optionen homeund von siteurlWordpress bewältige ich bereits 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 , indem zwei Shortcodes hinzugefügt werden: http://wordpress.org/extend/plugins/url-shortcodes/ , aber ich konnte für benutzerdefinierte Links nichts Ähnliches finden .


5
Willington, ich kann dir nicht helfen, eine URL zu finden, die überall funktioniert. Was ich tun kann, ist Sie auf spectacu.la/search-and-replace-for-wordpress-databases zu verweisen . Ich benutze Davids Search & Replace seit einiger Zeit und arbeite gut daran, zB URLs zu ändern - auch wenn es sich um serialisierte Daten handelt. So mache ich es also: Einfach hardcodierte Links und konvertieren nach dem Umzug der Datenbank in eine andere Domain. Viel Glück, Peter
Peter

Bisher habe ich nur nach dem Ausführen des SQL-Dumps eine Möglichkeit gefunden, erfolgreich von einer Entwicklungsumgebung in eine Live-Umgebung zu wechseln, um die gesamte Datei zu suchen und zu ersetzen, und nicht nur die Optionen home und siteurl zu ändern. Ich hatte über 1000 Mal Dateien, in denen sich die URL befand. (Ich weiß immer noch nicht, wie es geschafft hat, so hoch zu werden :))
Rob Williams

@Peter, @Rob, danke, dass ihr geantwortet habt. Ich hatte Angst, dass Suchen und Ersetzen die einzige Lösung ist, wollte aber zuerst fragen. Ich werde mir das Drehbuch ansehen.
Willington Vega

Verwenden Sie am besten ein Skript wie das von mir vorgeschlagene. Beachten Sie, dass beim Suchen und Ersetzen von Text in einem Datenbankspeicherauszug serialisierte Daten (insbesondere in wp_options) beschädigt werden, wenn die Länge der Zeichenfolgen zum Suchen und Ersetzen nicht gleich ist, da diese Daten in der Datenbank mit einer Längenangabe gespeichert werden . Erfolg, Peter
Peter

Antworten:


9

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

Bildbeschreibung hier eingeben

Es funktioniert gut!

Beste Grüße Chris


Dies funktioniert, ändert aber auch die URL, um die index.php einzuschließen. Bei einer Anwendung für eine einzelne Seite mit # Links wird zuerst die Seite aktualisiert und dann zum Ziel weitergeleitet (nur beim ersten Mal). Trotzdem eine gute Idee
Catalin Deaconescu

4

Mit dem nav_menu_link_attributesFilter können Sie das href-Attribut für jedes Menüelement überprüfen und ändern, bevor es ausgegeben wird.

In diesem Beispiel suchen wir nach allen 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 Testsite-Umgebung vorhanden ist.


Das ist der beste Weg, den ich gefunden habe! Aber bitte @Milo, ändern Sie die dritte Zeile mit dieser intelligenteren WordPress-Basis-URL (holen Sie sich die site_url von WordPress): $ atts ['href'] = site_url (). $ atts ['href'];
Gtamborero

2

Durch die Verwendung des <base href=" ">Tags 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 Website-URL die Basis-URL aller Anker ist, fügen Sie diese zu theme / header.php in den <head>folgenden Bereichen 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.


Sieht vielversprechend aus. Ich teste es aus und melde mich zurück.
Eric Hepperle - CodeSlayer2010

Funktioniert nicht mit Pfaden wie, es ehepperle.com/sites/in-progress/some-wp-site-root/sei denn, Sie legen den Site-Stamm explizit fest. Die Geschwindigkeit der Webentwicklung wird durch die Verwendung von baseTags nicht merklich verbessert , da Sie bei der Migration auf eine andere Site die Basis neu definieren müssen. Ich kann jedoch den Wert sehen, wenn ich die Länge von href-Werten reduziere.
Eric Hepperle - CodeSlayer2010

Die Idee ist gut, aber es scheint, dass Wordpress den Basispfad ignoriert, wenn relative Pfade in benutzerdefinierten wp-Menüs verwendet werden (zum Beispiel: / contact)
gtamborero

1

Auf einer benutzerdefinierten URL im Menü-Setup können relative Links zu [blogurl] verwendet werden. Das Geheimnis ist, die relative URL mit einer einzigen zu beginnen /. Wenn ein einzelnes / die benutzerdefinierte URL startet, wird das System der typischen URL nicht voranstellen, http://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 /die benutzerdefinierte URL ein

Wenn Sie zur Indexseite im Ordner wechseln möchten, geben Sie bbforumsdiese /bbforumsals 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.

Beispiel:
Wenn sich mein Blog http://example.comin einer Unterdomäne befindet und ich es testen möchte, http://test.example.comkann 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.


5
Dies funktioniert nicht für Blog-URLs mit Schrägstrichen, z. B. example.com/blog . Wenn Sie dem Menüpunkt '/' folgen, gelangen Sie einfach zu example.com .
Jimpanzee

1

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

Fügen Sie diesen Code zu Ihrer functions.phpDatei 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 wp_nav_menuFunktion 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.