Comment ajouter un lien personnalisé à un menu avec une URL relative à l'URL du blog

16

Une partie de mon travail consiste à créer des sites Web Wordpress. Je travaille généralement sur mon ordinateur portable jusqu'à ce que j'aie quelque chose d'assez bon pour être téléchargé sur le serveur de test où le client l'examine.

Je crée un VirtualHost pour chaque nouveau projet, donc je travaille toujours avec une installation Wordpress dans un domaine qui ressemble http://local.example.com/, mais lorsque le site est téléchargé sur le serveur de test (non contrôlé par moi), le domaine peut finir par ressembler à quelque chose http://testserver.com/arbitrary/path/example/.

Le problème est que si j'ajoute un lien personnalisé à un menu qui pointe, par exemple, /events/cela fonctionnerait bien en créant localement un lien vers http://local.example.com/events/, mais dans le serveur de test, le lien pointera vers http://testserver/events/, ce qui n'est évidemment pas correct.
Ce que je veux, c'est donner au lien personnalisé une URL qui fonctionnerait à la fois sur mon environnement local et sur le serveur de test.

Je gère déjà le problème de la modification des options homeet siteurlWordpress en:

  • modification de ces paramètres sur la base de données locale
  • création d'un vidage de la base de données
  • mettre à jour la base de données sur le serveur
  • restaurer les options locales.

Je ne veux pas utiliser d'URL complètes pour les liens personnalisés et devoir les remplacer par l'URL du serveur chaque fois que je dois mettre à jour la base de données du serveur.

Pour les liens à l'intérieur du contenu du post, il existe un plugin qui résout le problème en ajoutant deux shortcodes: http://wordpress.org/extend/plugins/url-shortcodes/ , mais je n'ai pas pu trouver quelque chose de similaire pour les liens personnalisés .

Willington Vega
la source
5
Willington, je ne peux pas vous aider avec une URL qui fonctionne n'importe où. Ce que je peux faire, c'est vous diriger vers spectacu.la/search-and-replace-for-wordpress-databases . J'utilise la recherche et le remplacement de David depuis un certain temps et je travaille bien pour modifier les URL, par exemple, même dans les données sérialisées. Voilà comment je le fais: juste des liens codés en dur et convertis après avoir déplacé la base de données vers un autre domaine. Bonne chance, Peter
Peter
Jusqu'à présent, le seul moyen que j'ai trouvé pour passer avec succès d'un environnement de développement à un environnement réel est après avoir effectué le vidage SQL pour effectuer une recherche et le remplacer sur l'ensemble du fichier, pas seulement changer les options home et siteurl. J'ai eu des fichiers où l'URL était là plus de 1000 fois. (Je ne sais toujours pas comment il a réussi à atteindre ce niveau :))
Rob Williams
@Peter, @Rob merci les gars d'avoir répondu, j'avais peur que la recherche et le remplacement soit la seule solution mais je voulais d'abord demander. Je vais jeter un œil à ce script.
Willington Vega
Le mieux est d'utiliser un script comme celui que j'ai suggéré. Notez qu'une recherche de texte et remplacement dans un vidage de la base de données vissera les données sérialisées (en particulier dans wp_options) si et quand la longueur des chaînes de recherche et de remplacement n'est pas la même, car ces données sont stockées dans la base de données avec une spécification de longueur . Succès, Peter
Peter

Réponses:

9

Je cherchais également une solution pour cela et j'en ai trouvé une simple.

Voici ce que vous devez placer dans le champ URL:

/index.php/internal-site-name

entrez la description de l'image ici

Cela fonctionne très bien!

Cordialement, Chris

Christian Hatz
la source
1
Cela fonctionne mais cela modifie également l'URL pour inclure le index.php. Dans le cas d'une application d'une seule page avec # liens, elle rafraîchirait d'abord la page et vous amènerait ensuite à la destination (seulement la première fois). Même ainsi, une bonne idée
Catalin Deaconescu
J'ai utilisé / quelque chose sans la partie index.php et semble fonctionner
user3808307
4

Vous pouvez utiliser le nav_menu_link_attributesfiltre pour inspecter et modifier l'attribut href pour chaque élément de menu avant sa sortie.

Dans cet exemple, nous recherchons les attributs href commençant par un /et ajoutons l'URL du site de test dans ce cas:

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

Vous pouvez créer un plugin simple avec ce code et l'activer uniquement sur votre serveur de test, ou créer une sorte d'indicateur qui applique conditionnellement ce filtre lorsque l'environnement du site de test est présent.

Milo
la source
C'est le meilleur moyen que j'ai trouvé! Mais s'il vous plaît @Milo, changez la troisième ligne avec cette URL de base wordpress plus intelligente (obtenez le site_url de wordpress): $ atts ['href'] = site_url (). $ atts ['href'];
gtamborero
2

L'utilisation de la <base href=" ">balise dans la méta-tête donnera une URL de base à toutes les ancres relatives de la page.

Référence:
https://www.w3.org/TR/html4/struct/links.html
12.4 Informations sur le chemin: l'élément BASE

Liens personnalisés relatifs dans wordpress:
si vous voulez que l'URL du site soit l'URL de base de toutes les ancres, ajoutez ceci au theme / header.php dans <head>:

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

Je sais que ça pourrait être en retard pour vous mais je pourrais aider quelqu'un d'autre.

David Pacheco
la source
Cela semble prometteur. Je vais le tester et faire rapport.
Eric Hepperle - CodeSlayer2010
Ne fonctionne pas avec des chemins d'accès, ehepperle.com/sites/in-progress/some-wp-site-root/sauf si vous définissez explicitement la racine du site. La vitesse de développement Web n'est pas sensiblement améliorée à l'aide de la basebalise, car lorsque vous migrez vers un autre site, vous devrez redéfinir ce qu'est la base. Cependant, je peux voir la valeur de la réduction de la longueur des valeurs href.
Eric Hepperle - CodeSlayer2010
L'idée est bonne mais semble que Wordpress ignore le chemin de base lors de l'utilisation de chemins relatifs sur les menus personnalisés wp (par exemple: / contact)
gtamborero
1

Sur une URL personnalisée dans la configuration du menu, il est possible d'utiliser des liens relatifs vers le [blogurl]. Le secret est de démarrer l'URL relative avec un seul /. Lorsqu'un seul / démarre l'URL personnalisée, le système ne fera pas http://précéder l'URL standard, puis l'URL blog en cours sera générée dans l'URL cible au moment de l'exécution.

EXEMPLE
Si vous souhaitez accéder à votre page d'accueil, mettez simplement /l'URL personnalisée

Si vous souhaitez accéder à la page d'index du dossier, bbforumsmettez-la /bbforumscomme URL personnalisée.

Cela vous permet de déplacer un site vers un domaine de test sans avoir à coder en dur le nouveau blogURL dans tous les liens personnalisés pour les menus.

Par exemple:
si mon blog est http://example.comet que je veux le tester dans un sous http://test.example.com- domaine, le site peut être déplacé entre le test et la production sans problèmes de menu en utilisant la convention d'URL relative indiquée ci-dessus. J'ai testé avec succès cette approche en utilisant le plugin XCloner pour déplacer le site.

user41251
la source
6
Cela ne fonctionne pas pour les URL de blog comportant des barres obliques, par exemple example.com/blog . Suivre l'élément de menu «/» vous amènera simplement à example.com .
Jimpanzee
1

Vous devez d'abord installer ce plugin pour les shortcodes URL.

Ajoutez ce code à votre functions.phpfichier dans votre thème:

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

Ensuite, vous devez appeler la wp_nav_menufonction à partir des fichiers de modèles:

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

C'est ça. Accédez ensuite à la section du menu principal.

Par exemple, si je veux donner l'URL de la page à un lien personnalisé, je vais l'ajouter comme ceci:

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

Vous pouvez maintenant aller sur le front-end et vérifier que le shortcode fonctionne.

Manimaran
la source