Ondersteuning » Code oplossingen gezocht » wp_nav_menu one page design menu highlights

  • Ik heb een one page design template, die prima werkt op 1 probleem na.

    De template gebruikt een (door de maker) eigen gemaakte menu manager, maar omdat deze nogal wat beperkingen met zich mee bracht heb ik besloten het menu te vervangen door wordpress eigen menu (door gebruik te maken van wp_nav_menu. Dit werkt prima, behalve dan het highlighten van het actieve menu item.

    Het probleem is, omdat de website uit 1 pagina bestaat, het menu gebruikt maakt van hashtags om naar de verschillende pagina’s te linken. Volgens wordpress zit je dan de hele tijd op 1 pagina, waar door de current-menu-item en current_page_item classes niet werken. Die worden namelijk automatisch aan elk menu item gegeven.

    De oplossing zou zijn om een custom class te geven aan het actieve menu item. Ik heb hier wel oplossingen voor gevonden, maar die werkten niet goed. Die gaven namelijk elk menu item de custom class (waarschijnlijk omdat er gekeken werd naar de pagina, net zoals wordpress dat doet. En ik kan hier verder helaas geen oplossing voor vinden.

    Hieronder de html output van het menu:

    <div class="menu-hoofdmenu-container">
    <ul id="menu-hoofdmenu" class="menu">
    <li id="menu-item-621" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-621"><a href="http://www.3dinyourhands.com/wp_new/#home">Home</a></li>
    <li id="menu-item-592" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-592"><a href="http://www.3dinyourhands.com/wp_new/#portfolio">Portfolio</a></li>
    <li id="menu-item-594" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-594"><a href="http://www.3dinyourhands.com/wp_new/#contact">Contact</a></li>
    </ul>
    </div>

    Alvast bedankt.

15 reacties aan het bekijken - 1 tot 15 (van in totaal 25)
  • Misschien een oplossing regelen met jQuery? Google eens iets in de trant van “jQuery add class on hash change”

    Thread starter MrMartinH

    (@mrmartinh)

    Bedankt voor je reactie. Helaas krijg ik het nog steeds niet werkende. En ik ben toch vrij veel javaschript oplossingen tegen gekomen met de door jouw gesuggereerde zoek opdracht (en daar ook redelijk veel van geprobeerd)

    In een ander forum kreeg ik deze twee sites als tip (ook oplossingen met javascript)

    http://trevordavis.net/blog/jquery-one-page-navigation-plugin
    http://www.richnetapps.com/automatically_highlight_current_page_in/

    Maar die kreeg ik ook niet werkende.

    Ik heb alle oplossingen letterlijk over genomen (alleen de namen van de id’s en de classes aangepast) maar het lijkt wel of de scripts genegeerd worden.

    Ik ben zo langzamerhand het spoor behoorlijk bijster. Voor mijn gevoel heb ik het halve internet met oplossingen al geprobeerd

    WordPress werkt met jQuery in zgn. no-conflict modus. Concreet komt het er op neer dat je in de custom scripts die je op het net vindt $ moet vervangen door jQuery vooraleer ze te gebruiken in wp. Heb je dat toegepast?

    Thread starter MrMartinH

    (@mrmartinh)

    Ik heb er even een en ander over uitgezocht op google, wat jquery.noconflict() inhoud, en geprobeerd te doen zoals je zei, maar het werkt nog steeds niet helaas.

    Onderstaande de code van de eerste link die ik gepost had, aangepast met noconflict.

    <script src="js/jquery.js"></script>
    <script src="js/jquery.scrollTo.js"></script>
    <script src="js/jquery.nav.js"></script>
    
    <script type="text/javascript" language="javascript">
    var $j = jQuery.noConflict();
    $j(document).ready(function() {$j('#menu-hoofdmenu').onePageNav();});
    </script>

    Dit zou moeten werken lijkt me. Sterker nog, ik heb even een test gemaakt (test.html) los van wordpress om te zien o het script werk, en dat was wel het geval. Ik heb hiervoor het menu exact over genomen als dat van wordpress, en dezelfde opmaak en style gebruikt. Dit werkte dus wel (lokaal op mijn pc). Het enigste verschil was nu dat ik geen wordpress gebruik. Dit doet mij denken dat het probleem met wordpress zelf te maken heeft.

    Kan het zijn dat het aan de url output van wordpress ligt?. De url output in wordpress is <url>/#home. De url output van mijn snelle test is <url>/test.html#home.

    Als dat het is dan zit het probleem denk ik in jquery.nav.js

    Kijk even in je browser console, krijg je errors?

    Thread starter MrMartinH

    (@mrmartinh)

    In de code hierboven heb ik overigens de eerste $ en de tweede $ vervangen met $j. Ik heb ook geprobeerd door de tweede $ niet aan te passen. Maar dit maakte dus ook geen verschil.

    Thread starter MrMartinH

    (@mrmartinh)

    Yay het werkt.

    Ik heb er nooit over na gedacht in de console te checken op fouten, maar die waren er dus wel. Bij alle 3 scripts gaf hij de fout “Linked script not loaded”.

    Ik kwam er achter dat bij de template die ik gebruik de script in aan appart php bestand worden ingeladen. Dus ik heb jquery.nav.js hier aan toe gevoegd, en in mijn header de volgende code gebruikt:

    <script type="text/javascript" language="javascript">
    jQuery(document).ready(function() {jQuery('#menu-hoofdmenu').onePageNav();});
    </script>

    Jullie hebben me beiden dus een heel eind geholpen, ik zocht gewoon verkeerd. Heel erg bedankt voor de hulp.

    Thread starter MrMartinH

    (@mrmartinh)

    Hm. Ik heb denk ik wat te vroeg gejuich. Bovenstaande werkt wel, maar niet optimaal. De code in jquery.nav.js conflicteerde met enkele andere plugins op de website (die werken niet meer) en deed de website het ook niet meer in ie7 (onder het mom: als je toch compatibiliteit wilt).

    Ik vermoed dat ik iets simpelers nodig heb, want ik hoef geen scroll functie te hebben, alleen de class change.

    Terug naar het web dus maar.

    Nog een tipje tussendoor: niet linken naar scripts in de header, maar invoegen met wp_enqueue_script:

    The safe and recommended method of adding JavaScript to a WordPress generated page is by using wp_enqueue_script(). This function includes the script if it hasn’t already been included, and safely handles dependencies.

    http://codex.wordpress.org/Function_Reference/wp_enqueue_script

    Thread starter MrMartinH

    (@mrmartinh)

    Bedankt. Daar was ik inderdaad ook al achter, zo laadde ik het script ook in. Alleen gaf het script vervolgens dus problemen helaas.

    Ik heb nu het volgende script gevonden dat op het eerste gezicht lijkt te werken:

    function extractPageName(hrefString)
    {
    	var arr = hrefString.split('/');
    	return  (arr.length < 2) ? hrefString : arr[arr.length-2].toLowerCase() + arr[arr.length-1].toLowerCase();
    }
    
    function setActiveMenu(arr, crtPage)
    {
    	for (var i=0; i < arr.length; i++)
    	{
    		if(extractPageName(arr[i].href) == crtPage)
    		{
    			if (arr[i].parentNode.tagName != "DIV")
    			{
    				arr[i].className = "hidemenu";
    				arr[i].parentNode.className = "hidemenu";
    			}
    		}
    	}
    }
    
    function setPage()
    {
    	hrefString = document.location.href ? document.location.href : document.location;
    
    	if (document.getElementById("menu-hoofdmenu") !=null )
    	setActiveMenu(document.getElementById("menu-hoofdmenu").getElementsByTagName("a"), extractPageName(hrefString));
    }
    
    window.onload=function()
    {
    	setPage();
    }

    Dit doet wat het moet doen, echter, alleen als ik de pagina refresh. Dus ik klik op een menu-item (bv contact) dan doet hij niks, maar wel als ik daarna refresh dus (omdat #contact dan in de url staat).

    Nu kan ik mijn bezoekers wel elke keer op F5 laten drukken, maar ik heb twijfels bij de gebruiksvriendelijkheid hier van.

    Ik denk dat het komt door de windows.onload functie, want als ik die weg haal dan werkt het helemaal niet.

    script ziet er op zich ok uit, maar we kennen natuurlijk het hele verhaal niet.. Een eventueel alternatief voor wat je tracht te bereiken is jQuery UI Tabs. Wordt standaard meegeleverd met WP, en je kan de tabs stylen als menu items. Just a thought 🙂 http://jqueryui.com/demos/tabs/

    Thread starter MrMartinH

    (@mrmartinh)

    Welk hele verhaal? Als ik ergens niet duidelijk ben geweest moet je het maar zeggen hoor.

    Het script werkt dus wel, zoals ik zei. Maar alleen bij een refresh van de pagina. Ik moet een onclick functie oid hebben, denk ik. Maar ik heb helemaal geen verstand van JS, dus hoe ik dat moet gaan toepassen is momenteel nog even abacadabra.

    Dat verhaal van de tabs. Moet je die ook als tabs gebruiken zoals in het voorbeeld van de website? Want dat zou betekenen dat ik mijn hele website moet restylen, en dat is dan weer niet de kant die ik op wil :).

    Edit
    Hier is trouwens een link naar de website: http://www.3dinyourhands.com/wp_new/ mocht dit helpen bij het oplossen.

    Ik gebruik nu dus het bovenstaande script, maar dat werkt pas als je op een menu item klikt en de browser refreshed.

    Met het hele verhaal bedoel ik bv. hoe de content gegenereerd en verpakt wordt, en bij uitbreiding alles wat meespeelt op je site. Wat de tabs betreft: je moet inderdaad eerst die standaard css toevoegen, maar die kan je gewoon overschrijven met je eigen css.

    Thread starter MrMartinH

    (@mrmartinh)

    Volgens mij posten we net door elkaar heen. Had mijn vorige post net ge-edit met de link naar mijn website om (hopelijk) het verhaal wat duidelijker te maken.

    goed nieuws denk ik, want op een mac (met chrome) werkt het perfect zoals het hoort?

15 reacties aan het bekijken - 1 tot 15 (van in totaal 25)
  • Het onderwerp ‘wp_nav_menu one page design menu highlights’ is gesloten voor nieuwe reacties.