web-dev-qa-db-ja.com

メニュー項目のURLを変更する

単一ページのWebサイトを作成し、メインメニュー項目にはアンカー(#)のみを使用します。

今、私はウェブサイト上の2番目のページを含めて、同じメニューを維持する必要があります。

私はルーツのテーマを使っています。それで、私はメニューを使ってメニューを構築しています:

wp_nav_menu(array('theme_location' => 'primary_navigation')); 

しかし、この2ページ目でのみ、アイテムのURLを#contactからmywebsite.com.br/#contactに変更する方法

1
marcelo2605

あなたのテンプレートでは、あなたがフロントページにいるかどうかを確認してから、別のメニューを表示することができます。

例えば:

if(is_front_page() || is_home()){

 wp_nav_menu(array('theme_location' => 'primary_navigation'));

}else{

 wp_nav_menu(array('theme_location' => 'secondary_navigation'));

}

また、functions.phpファイルに2番目のメニューの場所を登録する必要があります(まだ行われていない場合)。

新しいメニューの場所を登録するには:

function register_my_menus() {

    register_nav_menus(array( 
        'secondary-location' => __('Secondary Location'),
    ));

}

add_action( 'init', 'register_my_menus' );

欠点は、バックエンドで2つのメニューを管理しなければならないということです。 2つのメニューを更新する必要があるため、メニューが頻繁に変わると問題になる可能性があります。

代わりに、メニューが表示される前にwp_nav_menuをフィルタリングしてURLを変更することができます。たとえば、これはfunctions.phpに入ります。

function change_menu($items){

if(!is_front_page()){

  foreach($items as $item){


    $item->url = get_bloginfo("url") . "/" .  $item->url;


  }

}

  return $items;

}

add_filter('wp_nav_menu_objects', 'change_menu');

上記のコードはwp_nav_menu_objectをフィルタリングします。あなたがウェブサイトのフロントページにいない場合、それは完全なURLを追加します。そうでなければ、通常のメニューを返すだけです。この方法を使用すると、管理者に2番目のメニューを作成する必要はありません。

3
gdaniel

もしあなたのメニューがカスタムのアンカーリンクとページリンク(例えばその2ページ目、ホーム、インプリントなど)を含んでいるならば、あなたがフロントページにいないとき、gdaniels change_menu関数はそれらのページリンクを壊します。それは、 'change_menu'関数がsite-urlをall menu-linksの前に追加したときに彼が経験した問題です。しかし、彼氏の関数 'lb_menu_anchors'では、アンカーリンクを切り替えるときにフロントページのページが更新されますで終わるでしょう。 これを避けるために、lb_menu_anchorsは現在のページがフロントページではない場合にのみ実行されなければなりません

function lb_menu_anchors($items, $args) {
// current page is NOT front page?
  if(!is_front_page()){
    // loop through menu-objects (the links)
    foreach ($items as $key => $item) {
        // check if link begins with '#'
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            // if so, prepend site_url to link
            $item->url = site_url() . $item->url ;
        }
    }
    // return edited links
    return $items;
  }
  else {
    // return unedited links if current page IS front page
    return $items;
  }
  }

add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);

あなたのすべての考えをありがとう

1
klausduraditz

私はgdanielのソリューションの修正版を使用していましたが、最近、カスタムメニューリンクを使用してメニュー項目を外部リンクに向ける場合、サイトURLが外部リンクの前に追加されるという問題に遭遇しました。

以下のコードは、アンカーリンクを変更する必要があり、外部リンクを変更する必要がない場合に機能するはずです。

function lb_menu_anchors($items, $args) {
    foreach ($items as $key => $item) {
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            $item->url = site_url() . $item->url;
        }
    }

    return $items;
}
add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);

すべての小道具はlaubsterboyとfayeに行きます: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/https://laubsterboy.com/blog/2014/09/wordpress- menu-anchor /#comment-35170

1
boywonder