トップレベルのメニュー項目にリンクを持たず、リンクされたサブメニューを作成する方法


25

私は水平メニューを構築していますが、そのメニューの一部のエントリにはドロップダウン(サブメニュー)がありますが、そうでないものもあります。サブメニューを持つものは実際にはページではありません。それらは単にドロップダウンのガイドとなることを目的としています。

たとえば、水平メニューは次のようになります。

ホーム| 私達について| 製品| 道順| 接触

そして、 "products" liアイテムは、その下の垂直ドロップダウンリストにリンクされた3つのページを持つことを意図しているので、 "products"自体は実際にはページを表しません。

(WPをCMSとして使用し、静的なホームページと内部ページを使用します。独自のテンプレートを作成し、CSSでメニューのスタイルを設定し、functions.phpにメニューを登録し、テンプレートで呼び出します。)ページのリストを介して、またはカスタムリンクによってメニュー。しかし、「製品」をリンクさせたくありません。カスタムリンクにリンクを追加しないと、メニューに追加できません。

これはメニュー管理から実行できますか、それとも他の方法でアプローチする必要がありますか?

助けてくれてありがとう!


1
解決策はうまくいきますwordpress.org/support/topic/no-page-menu-item

これを行うには、jsを使用します。この記事を試してください。kvcodes.com/2014/07/...
Kvvaradha

[URL]ボックスで、空白のままにします。
エイミーワン

WP_NAV_MENU_WALKERクラスについては誰も言及していません。あなたが望むものを吐き出す独自のウォーカーを書くことができます。
user3135691

回答:


12

私にはいくつかのアイデアがあります:

  1. #何も返さないカスタムリンクを設定します
  2. アイテムにカスタムクラスを追加し、jQueryを使用してリンクを削除します。
  3. jQueryメソッドと同等のPHPを使用する
  4. Disable Parent Menu Linkプラグインを使用します(またはそれを分解して独自のプラグインを作成します)。

ヒントとリンクをありがとう!Gavinが提案したように、カスタムリンクに#を使用すると「機能」します。他のオプションの方がうまくいくかもしれませんが、それほど簡単ではありません。プラグインはおそらく簡単ですが、同じことをより直接的に達成できる場合、プラグインを使用するのは嫌です。最善のアプローチを決定する必要があります。再度、感謝します!
PVA

触覚デバイスで使用する場合href=""、ほとんどの触覚デバイスユーザーはJSを使用せずにドロップダウンメニューを表示できないため、空の使用に注意してください
Simon

リンクが切れます。あなたは、あなたの答えの中にこれらのアイデアのいくつかを仕事をしたいかもしれません
シア

また、#2、#3はを参照してくださいwp_list_pages()、ではないwp_nav_menu()
シア

25

プラグインなどを使用せずにそれを行う最も簡単な方法は、WordPressの「メニュー」機能を使用することです。WordPress 4.8の手順は次のとおりです。

  1. WordPressダッシュボードから、「外観->メニュー」に移動します
  2. [メニューの編集]タブで、[カスタムリンク]を選択します
  3. URLに「#」と入力します(引用符なし)
  4. リンクテキストには、ドロップダウンメニューのトップレベルに必要なテキストを入力します
  5. [メニューに追加]ボタンをクリックします
  6. メニュー項目をメニュー内の目的の位置にドラッグします
  7. 追加したばかりのメニュー項目については、項目の右側にある下矢印をクリックします(項目の左側に「カスタムリンク」と表示されます)
  8. URLから「#」を削除します。これは-すべてのブラウザで-リンクをプレーンテキストに変換します。
  9. 「メニューを保存」ボタンをクリックします

そのヒントをありがとう。ezですが、マウスオーバーするとラベルが「リンク」のように見えますが、どこにも行かないという点で完全ではありません。だから、ピンチで動作することができます。
PVA

1
コメント全体を読みましたか?リンクを追加したら、リンク名の横にあるドロップダウン矢印をクリックし、URLテキストボックスから「#」を削除します。これは、すべてのブラウザーで、リンクをクリックできないようにします。
GavinR

1
はい、ありがとう、コメント全体を読みました。私は戻ってやり直し、問題を認識しました。#を残すと、単語はnavbarに「デッドリンク」として表示されます。#を削除したとき、その単語にカーソルを合わせるとnavbarに表示されず、ホバー状態で表示されます。したがって、リンクされずに表示されるように、単語にCSSを適用する必要があるということです。ホバー状態が表示される理由がわかりません
...-PVA

これはまだ4.9.5ですが、バグの利点をハッキングするハックのように「感じている」ので、私にはわかりません。そうでなければ..それは人々の多くの頭痛の種を救うでしょう...これは、Wordpressが「1 2 3 4 5 6」を強力なパスワードと考えているようなものです...それでも。
ブルックリンズ

参考までに、(何らかの理由で)ステップ8を実行すると、カスタムリンクにカーソルを合わせたときにカーソルがポインターになりません。その場合、pointer:cursorでスタイルを設定できます。
-MarsAndBack

7

私が思いついた最も簡単な方法は、リンクURL値がのカスタムリンクアイテムを作成することでした#。これは、ユーザーを同じページの空のハッシュに送信するため、基本的にどこにもリンクしません。

ただし、プレースホルダーリンクに空のハッシュを使用すると、いくつかの副作用があります。リンクは引き続き表示され、リンクのように動作するため、リンクのように見えるものをクリックしてもユーザーは混乱しますが、何も起こりません。もう1つの効果は、空のハッシュリンクをクリックすると既存のハッシュが上書きされ、ユーザーがページの上部に移動することです。とにかくページの一番上にあるメニューについてはそれほど心配することはないかもしれませんが、特にフッターメニューの場合は、予期しないときにページが予期せずジャンプする場合は非常に不快です。

解決策は、空のハッシュメソッドをコードと組み合わせて、メニューで空のハッシュリンクが使用されていることを検出しhref、そのリンクから属性を完全に削除することです。aなしの要素href属性は、正しいHTML 5の方法プレースホルダリンクを作成します。

/**
 * Remove the href from empty links `<a href="#">` in the nav menus
 * @param string $menu the current menu HTML
 * @return string the modified menu HTML
 */
add_filter( 'wp_nav_menu_items', function ( $menu ) {
    return str_replace( '<a href="#"', '<a', $menu );
} );

2

これは私のために働いた:

私はアクティブにCSSクラスを >メニューで画面のオプションを> CSSクラスは、それから私は、私はクラス「.nolink」を無効化したいとメニュー要素を与え、私のカスタムCSSパネルにコードのこの部分を追加しました:

.nolink {
   pointer-events: none;
   cursor: default;
}

これもドロップダウンを殺します。
ユーザー385917

#リンクターゲットとして使用し、スタイル設定の目的でカスタムCSSクラスを適用することは、私の意見では最もハッキングの少ないソリューションです。ただし、pointer-events: noneサブメニューが壊れるので、設定はあまり意味がありません。その属性を設定した理由について詳しく説明してください。
user1438038

1

PHPのアプローチを使用して、このコードをfunctions.phpに追加しました。

function remove_link_contact_menu($item_output, $item) {
    if ($item->post_name == 'contact')
        return '<span>' . $item->title . '</span>';

    return $item_output;
}
add_filter('walker_nav_menu_start_el', 'remove_link_contact_menu', 20, 2);
add_filter('megamenu_walker_nav_menu_start_el', 'remove_link_contact_menu', 20, 2);

これにより、リンクがpost_name == "contact"のアイテムメニューのspan要素に置き換えられます。これは私が探していたものです。これを簡単に変更して、メニュータイトルまたはIDを確認したり、子メニュー項目などがあるかどうかを確認するコードを追加したりできます。


0

私はこのように解決しました:(テーマの)header.phpで私が検索しました:

'link_before'     => '',
'link_after'      => '',

に置き換えられます:

'link_before'     => '<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("<span onclick=\"return false\">")</script>',
'link_after'      => '<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("</span>")</script>',

簡単に言えば、このスクリプトは親リンクが「#」で終わるかどうかをチェックします。この場合、Aタグのコンテンツの周囲にspan要素を追加し、クリックを無効にします。

それが役に立てば幸い :-)


こんにちは、私はこれが古い答えであることを知っていますが、今後参照するために、次の更新時にすべてのコードが上書きされるため、テーマヘッダーファイルを変更しません。これに対する最善の解決策は、カスタムコードで子テーマを作成することです。
スコット

0

ここで他の人が示唆したように、#をURLとして使用してカスタムリンクメニュー項目を作成できます。次に、メニューに追加された#を消去します。最後に、この単純な正規表現を使用して、これらのリンクから実際のタグを削除できます。

preg_replace('/<a>([^<]+)<\/a>/i', '<span class="no-link">$1</span>', $navHTML);

0

これにより、クリックが削除されます(アイテムのスタイルが解除されます)。この方法では、メニューでカスタムリンクを使用する必要はありません。

add_action( 'wp_footer', function(){
    ?>
    <script>
    (function( $ ) {
        var itemm = $('#main-menu .menu-item-has-children > a');
        itemm.click(function(){
            document.activeElement && document.activeElement.blur();
            return false;
        });
    })(jQuery);
    </script>
<?php
 }, 1, 0 );

0

これは古いスレッドであることに感謝しますが、Wordpressでリンクをすばやく簡単に作成するには、リンクURLを次のようにすることです。

#_

ハッシュタグの後のアンダースコアに注意してください。このように、メニューがページを下にスクロールする(つまり修正される)場合、クリックしてもページの上部にジャンプせず、プラグイン/スクリプトを必要としません。


0

私はゲームに遅れていることに気付きますが、これらは私が使用する2つの方法です。

1)親メニュー項目を最初のサブ項目の複製にし、そのラベルを変更します。たとえば、「Products」の下の最初のアイテムが「Product 1」である場合、「Product 1」を親メニュー項目として使用し、そのラベルを「Products」に変更します。これにより、「Products」と「Product 1」の両方がページProduct 1につながります。

2)製品ページが製品1にリダイレクトされるようにリダイレクトを追加します。このオプションの利点は、空白の製品ページを作成して、ページに階層リストを作成できることです。ページ、リダイレクトされます。


0

外観に移動し、メニューをクリックします。このセクションでは、メニュー構造の下に移動し、下向き矢印をクリックしてページを展開すると、リンクを無効にするというボックスが表示されます。そのボックスをチェックして保存します。


この機能はコアによって提供されていません。おそらく、テーマまたはプラグインがセットアップに追加していますか?
デイブロムジー

私もこれを見たことがありますが、どのプラグインまたはテーマがこれを行ったかを知りたいです。
DavGarcia

0
  1. カスタムリンクを#に設定すると、リストアイテムは何も返されません
  2. このフィルターを追加します。

    add_filter( 'wp_nav_menu_items', 'wpse_remove_empty_links' );
    
    function wpse_remove_empty_links( $menu ) {
    
        return preg_replace("/<a href=\"#\">(.+?)<\/a>/is", "<span>$1</span>", $menu);
    
    }
  3. スパンCSSを編集して<a>、同じスタイルを取得することを忘れないでくださいcursor: context-menu;


0

「カスタムリンク」メニュー項目を作成し、「javascript :;」を追加します (引用符なし)URLフィールド。「#」を使用するよりも良い方法です。クリックしてもページが上部にスクロールされないためです。


0

適切なHTML5を生成するソリューションは、2019年1月から次のことを行うことです。

  1. URLを#に設定したカスタムリンクを追加し、任意の名前を付けます。両方のフィールドが必須です。
  2. URLが空になるように、新しく追加されたカスタムリンクを編集します。
  3. 変更を保存します。

これにより、<a>Menu</a>クリックできないリンクを表す正しい方法であるトップレベルのナビゲーションが生成されます。


0

<a>純粋なcssを使用して、すべての第1レベルメニュー項目のタグのイベントを無効にすることができます。.main-menuクラスは、メニューの命名に従って別の名前を持つ場合があります。

/* disable parent menu items */
ul.main-menu > li > a {
    pointer-events: none;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.