単一ページのWebサイトを作成し、メインメニュー項目にはアンカー(#)のみを使用します。
今、私はウェブサイト上の2番目のページを含めて、同じメニューを維持する必要があります。
私はルーツのテーマを使っています。それで、私はメニューを使ってメニューを構築しています:
wp_nav_menu(array('theme_location' => 'primary_navigation'));
しかし、この2ページ目でのみ、アイテムのURLを#contactからmywebsite.com.br/#contactに変更する方法
あなたのテンプレートでは、あなたがフロントページにいるかどうかを確認してから、別のメニューを表示することができます。
例えば:
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番目のメニューを作成する必要はありません。
もしあなたのメニューがカスタムのアンカーリンクとページリンク(例えばその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);
あなたのすべての考えをありがとう
私は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