Come aggiungere un collegamento personalizzato a un menu con un URL relativo all'URL del blog


16

Parte del mio lavoro è creare siti Web Wordpress. Di solito lavoro sul mio laptop fino a quando non ho qualcosa di abbastanza buono per essere caricato sul server di test in cui il client lo recensisce.

Creo un VirtualHost per ogni nuovo progetto, quindi lavoro sempre con un'installazione di Wordpress in un dominio simile http://local.example.com/, ma quando il sito viene caricato sul server di prova (non controllato da me), il dominio potrebbe finire per essere qualcosa di simile http://testserver.com/arbitrary/path/example/.

Il problema è che se aggiungo un collegamento personalizzato a un menu che punta, ad esempio, /events/funzionerebbe bene a livello locale creando un collegamento http://local.example.com/events/, ma nel server di prova, il collegamento punterà a http://testserver/events/, che ovviamente non è giusto.
Quello che voglio è dare al link personalizzato un URL che funzioni sia sul mio ambiente locale che sul server di prova.

Gestisco già il problema di modificare le opzioni di Wordpress homee siteurl:

  • cambiando quelle impostazioni sul database locale
  • creando un dump del database
  • aggiorna il database sul server
  • ripristino delle opzioni locali.

Non voglio usare URL completi per i collegamenti personalizzati e devo sostituirli con l'URL del server ogni volta che devo aggiornare il database del server.

Per i collegamenti all'interno del contenuto dei post, esiste un plug-in che risolve il problema aggiungendo due codici brevi: http://wordpress.org/extend/plugins/url-shortcodes/ , ma non sono stato in grado di trovare qualcosa di simile per i collegamenti personalizzati .


5
Willington, non posso aiutarti ad un url che funziona ovunque. Quello che posso fare è indicarti spectacu.la/search-and-replace-for-wordpress-database . Sto usando la ricerca e la sostituzione di David da un po 'di tempo e lavoro bene per cambiare, ad esempio, l'URL, anche quando si tratta di dati serializzati. Quindi è così che faccio: solo collegamenti hardcoded e conversione dopo aver spostato il database in un altro dominio. Buona fortuna, Peter
Peter,

Finora l'unico modo che ho trovato per passare con successo da un ambiente di sviluppo a un ambiente live è dopo aver eseguito il dump SQL per fare una ricerca e sostituire l'intero file, non solo cambiare le opzioni home e siteurl. Ho avuto dei file in cui l'URL era presente più di 1000 volte. (ancora non so come sia riuscito a salire così in alto :))
Rob Williams

@Peter, @Rob grazie ragazzi per aver risposto, avevo paura che cercare e sostituire fosse l'unica soluzione, ma volevo chiedere prima. Dò un'occhiata a quella sceneggiatura.
Willington Vega,

La cosa migliore è usare una sceneggiatura come quella che ho suggerito. Si noti che una ricerca di testo e la sostituzione in un dump del db rovinano i dati serializzati (specialmente trovati in wp_options) se e quando la lunghezza della ricerca e sostituisce le stringhe non è la stessa, poiché quei dati sono memorizzati nel db con una specifica di lunghezza . Successo, Peter
Peter

Risposte:


9

Stavo anche cercando una soluzione per questo e ne ho trovato una semplice.

Questo è ciò che devi inserire nel campo URL:

/index.php/internal-site-name

inserisci qui la descrizione dell'immagine

Funziona benissimo!

I migliori saluti Chris


1
Funziona ma cambia anche l'URL per includere index.php. Nel caso di un'applicazione a pagina singola con # collegamenti, aggiornerebbe prima la pagina e poi ti porterà alla destinazione (solo la prima volta). Anche così, una buona idea
Catalin Deaconescu,

Ho usato / qualcosa senza la parte index.php e sembra funzionare
user3808307 il

4

È possibile utilizzare il nav_menu_link_attributesfiltro per ispezionare e modificare l'attributo href per ciascuna voce di menu prima che venga emesso.

In questo esempio, cerchiamo eventuali attributi href che iniziano con a /e anteponiamo l'URL del sito di test in quel caso:

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

È possibile creare un semplice plug-in con questo codice e attivarlo solo sul server di prova oppure creare una sorta di flag che applica condizionalmente questo filtro quando è presente l'ambiente del sito di test.


Questo è il modo migliore che ho trovato! Ma per favore @Milo, cambia la terza riga con questo url base wordpress più intelligente (ottieni il site_url di wordpress): $ atts ['href'] = site_url (). $ atts [ 'href'];
gtamborero,

2

L'uso del <base href=" ">tag nel meta head fornirà un url di base a tutti gli ancoraggi relativi nella pagina.

Riferimento:
https://www.w3.org/TR/html4/struct/links.html
12.4 Informazioni sul percorso: l'elemento BASE

Link personalizzati relativi in ​​wordpress:
se vuoi che l'URL del sito sia l'URL di base di tutte le ancore aggiungi questo al tema / header.php all'interno di <head>:

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

so che potrebbe essere tardi per te ma potrebbe aiutare qualcun altro.


Sembra promettente. Lo proverò e riporterò indietro.
Eric Hepperle - CodeSlayer2010,

Non funziona con percorsi come ehepperle.com/sites/in-progress/some-wp-site-root/se non imposti esplicitamente la radice del sito. La velocità di sviluppo Web non è notevolmente migliorata utilizzando il basetag, poiché quando si esegue la migrazione a un altro sito, sarà necessario ridefinire la base. Tuttavia, posso vedere il valore nel ridurre la lunghezza dei valori href.
Eric Hepperle - CodeSlayer2010,

L'idea è buona, ma sembra che Wordpress ignori il percorso di base quando si utilizzano percorsi relativi nei menu personalizzati di wp (ad esempio: / contact)
gtamborero

1

Su un URL personalizzato nell'impostazione del menu è possibile utilizzare i collegamenti relativi al [blogurl]. Il segreto è avviare l'URL relativo con un singolo /. Quando un singolo / avvia l'URL personalizzato, il sistema non antepone il tipico http://e quindi il blogURL corrente verrà generato nell'URL di destinazione al momento dell'esecuzione.

ESEMPIO
Se vuoi andare alla tua home page, inserisci semplicemente /come URL personalizzato

Se vuoi andare alla pagina dell'indice nella cartella, bbforumsinserisci /bbforumscome URL personalizzato.

Ciò consente di spostare un sito in un dominio di prova senza dover codificare il nuovo blogURL in tutti i collegamenti personalizzati per i menu.

Ad esempio:
se il mio blog è http://example.come voglio testarlo in un sottodominio, http://test.example.comil sito può essere spostato tra test e produzione senza problemi di menu utilizzando la relativa convenzione URL indicata sopra. Ho testato con successo questo approccio usando il plugin XCloner per spostare il sito.


6
Questo non funziona per gli URL dei blog che presentano barre, ad esempio example.com/blog . Seguire la voce di menu '/' ti porta ad esempio.com .
Jimpanzee,

1

Per prima cosa devi installare questo plugin per i codici brevi URL.

Aggiungi questo codice al tuo functions.phpfile nel tuo tema:

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

Quindi devi chiamare la wp_nav_menufunzione dai file dei modelli:

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

Questo è tutto. Quindi vai alla sezione del menu di back-end.

Ad esempio, se voglio assegnare l'URL della pagina a un collegamento personalizzato, lo aggiungerò in questo modo:

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

Ora puoi andare al front-end e verificare che lo shortcode funzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.