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

11

Une partie de mon travail consiste à créer des sites Web Wordpress. Je travaille habituellement sur mon ordinateur portable jusqu'à ce que j'ai quelque chose d'assez bon pour être chargé sur le serveur de test où le client le passe en revue.

Je crée un VirtualHost pour chaque nouveau projet afin que 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 être quelque chose comme 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 to http://testserver/events/ , ce qui n'est évidemment pas correct.
Ce que je veux, c'est donner au lien personnalisé une URL qui fonctionnerait aussi bien sur mon environnement local que sur le serveur de test.

Je gère déjà le problème de la modification des options home et siteurl Wordpress par:

  • modification de ces paramètres dans la base de données locale
  • créer un dump de la base de données
  • mettre à jour la base de données sur le serveur
  • restauration des options locales.

Je ne souhaite pas utiliser d'URL complètes pour les liens personnalisés et je dois 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 de la publication, un plug-in résout le problème en ajoutant deux codes abrégés: enlace . , mais je n'ai pas réussi à trouver quelque chose de similaire pour les liens personnalisés.

    
posée Willington Vega 11.03.2011 - 21:45

5 réponses

7

Je recherchais également une solution à ce problème et j’en ai trouvé un simple.

C’est ce que vous devez placer dans le champ URL:

/index.php/internal-site-name

Cela fonctionne très bien!

Cordialement Chris

    
réponse donnée Christian Hatz 02.09.2016 - 20:54
2

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

Référence:
enlace
12.4 Information de chemin: l'élément BASE

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

.

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

Je sais que je pourrais être en retard mais aider quelqu'un d'autre.

    
réponse donnée David Pacheco 03.05.2017 - 17:59
1

Sur une URL personnalisée dans la configuration du menu, il est possible d'utiliser des liens relatifs vers la [blogurl]. Le secret consiste à démarrer l'URL relative avec un seul / . Lorsqu’un / démarre l’URL personnalisée, le système n’ajoute pas la valeur typique de http:// , puis la blogURL actuelle est générée dans l’URL cible au moment de l’exécution.

EXEMPLE
Si vous souhaitez accéder à votre page d'accueil, indiquez simplement / en tant qu'URL personnalisée

Si vous souhaitez accéder à la page d'index du dossier bbforums , mettez /bbforums en tant qu'URL personnalisée.

Cela vous permet de déplacer un site vers un domaine de test sans avoir à coder en dur la nouvelle URL de blog dans tous les liens personnalisés des menus.

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

    
réponse donnée user41251 02.11.2013 - 03:44
1

Vous devez d’abord installer ce plugin pour les codes courts d’URL.

Ajoutez ce code à votre fichier functions.php 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 );
    } 
}

Vous devez ensuite appeler la fonction wp_nav_menu à 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. Ensuite, allez à la section du menu principal.

Par exemple, si je souhaite attribuer l'URL de la page à un lien personnalisé, je l'ajouterai ainsi:

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

Maintenant, vous pouvez aller au début et vérifier que le shortcode fonctionne.

    
réponse donnée Manimaran 16.03.2012 - 14:57
0

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

Dans cet exemple, nous recherchons tous les attributs href commençant par / 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 plug-in simple avec ce code et l'activer uniquement sur votre serveur de test, ou créer une sorte d'indicateur appliquant de manière conditionnelle ce filtre lorsque l'environnement du site de test est présent.

    
réponse donnée Milo 03.05.2017 - 18:44

Lire d'autres questions sur les étiquettes