web-dev-qa-db-fra.com

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

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 chargé sur le serveur de test (non contrôlé par moi), le domaine peut finir par ressembler à 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, sur /events/, la création d'un lien vers http://local.example.com/events/ fonctionnera correctement localement. Toutefois, dans le serveur de test, le lien pointe sur http://testserver/events/, ce qui n'est évidemment pas le cas. droite.
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 traite déjà le problème de la modification des options Wordpress home et siteurl en:

  • changer ces paramètres sur 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
  • rétablir les options locales.

Je ne souhaite 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 de l'article, un plugin résout le problème en ajoutant deux shortcodes: http://wordpress.org/extend/plugins/url-shortcodes/ , mais je n'ai pas réussi à trouver quelque chose. similaire pour les liens personnalisés.

12
Willington Vega

Je cherchais aussi 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

enter image description here

Cela fonctionne très bien!

Cordialement Chris

8
Christian Hatz

L'utilisation de la balise <base href=" "> dans l'en-tête méta 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 Information de 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 le <head>:

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

_ {Je sais que je pourrais être en retard pour vous mais aider quelqu'un d'autre.} _

3
David Pacheco

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 plugin simple avec ce code et l'activer uniquement sur votre serveur de test, ou créer une sorte d'indicateur appliquant ce filtre de manière conditionnelle lorsque l'environnement du site de test est présent.

3
Milo

Sur une URL personnalisée dans la configuration du menu, il est possible d'utiliser des liens relatifs vers [blogurl]. Le secret consiste à démarrer l'URL relative avec un seul /. Lorsqu'un seul/démarre l'URL personnalisée, le système ne ajoute pas le http:// typique, puis l'URL de blog 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, il vous suffit de saisir / comme URL personnalisée.

Si vous souhaitez accéder à la page d'index du dossier bbforums, indiquez /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 d'URL relative indiquée ci-dessus. J'ai testé cette approche avec succès en utilisant le plugin XCloner pour déplacer le site.

1
user41251

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

Ensuite, vous devez appeler la fonction wp_nav_menu à partir des fichiers 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 tout. Ensuite, allez à 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'::

Maintenant, vous pouvez aller au front-end et vérifier que le shortcode fonctionne.

1
Manimaran