-
-
Save davidwebca/a7b278bbb0c0ce1d1ec5620126e863bb to your computer and use it in GitHub Desktop.
Hi @jansolo76!
Just for your info, I made this available as a package on a separate repo, in case you're using Composer. https://github.com/davidwebca/wordpress-menu-classes
So, for now, the default WordPress function only allows adding custom html attributes to links, so you can potentially use your links as refs. Since it's the lowest denominator, it's possible to do something like $refs.thelink.parentNode.parentNode, etc. and add the x-data attribute to a wrapper around your menu. Otherwise, there's a little secret that they don't make very explicit in Alpine's docs, but the data object is a callable, which means you can do something like this:
Alpine.data('menu', () => {
// Add some initial logic here... like adding attributes to the dom! This all executes before any init functions.
let menuElements = document.querySelectorAll('.nav li.nav-item');
for (let i=0, il=menuElements.length; i < il; ++i) {
let menuElement = menuElements[i]
menuElement.setAttribute('x-on:click.prevent', "openMenu == null ? openMenu = $el.parentNode.getAttribute('id') : openMenu = null");
}
return {
openMenu: null
}
});
This is untested code, but I use a similar pattern in my projects nowadays. I initialize lots of attributes on the elements before they are actually used by Alpine internally. This is the best way to do things when you don't have full access to customize the markup.
The other thing I should mention is that there's also a package available to use to completely change the navigation markup if you use Sage as a starter theme + blade view. https://github.com/Log1x/navi
And then the other alternative is to create a custom nav walker: https://developer.wordpress.org/reference/classes/walker_nav_menu/.
Lots of options! I usually go for the first one since it's really isolating my JS, even though it feels kinda dirty to add markup attributes with JavaScript to have it interpreted after the fact... by another piece of JavaScript, buuut until WordPress gives us full control over the nav rendering, we have to dance a little!
@davidwebca Thanks a lot! 👍
@hofmannsven No worries! Don't forget to check out the package this gist has evolved into. I added a few more functionalities recently. https://github.com/davidwebca/wordpress-menu-classes
@davidwebca Hi there! The script is exactly what I was looking for. Unfortunately I am quite new to wordpress theme dev. How can I activate this functionality if I dont use composer? I added the file to my theme, but that doesn't seem to change anything.
@nikolailehbrink Hi! You can basically copy the whole content of the file here: https://github.com/davidwebca/wordpress-menu-classes/blob/main/src/WordPressMenuClasses.php
and add it to your functions.php (without the first line with the namespace)
Thanks for the response! @davidwebca Okay, that's what I thought, but I find that a little messy. Is there a better way with separation of files?
Using composer would enable the best separation of files, but otherwise you can simply put WordPressMenuClasses.php in your theme wherever and include it from your functions.php 🤔
<?php
/**
* At the top of your functions.php file
*/
require_once('WordPressMenuClasses.php');
@davidwebca Worked fine! Thank you! :)
Great glad to hear!
HI David,
It's really a great job, and it' really usefull. I hop in the future put walker's in the trash...
I'm near to have the best menu of the worrld, but I am encountering a problem : https://github.com/Vince-ALIEN/dev/blob/main/the-header-content.php.
I use Tailwind css and Alpine js.
It's a offcanvas menu on desktop and mobile, the burger open menu w-1/2 and li_atts_0 push it to w-full.
First, i would liketo close the submenu when i click on other li_atts_0 to open them, and then i want to keep the menu full width.
Does your response to @jansolo76 it's the way to realise this ?
Do you have just an idea ? It'would be great...
Encore merci.
Vincent.
Hey Vince! This gist is now a full composer package : https://github.com/davidwebca/wordpress-menu-classes
You can look at the updated file there if you want to use it standalone : https://github.com/davidwebca/wordpress-menu-classes/blob/main/src/WordPressMenuClasses.php
Especially since there were updates to WordPress core that I contributed that allows to add classes and attributes to the links directly (instead of only being able to add them to the LI elements).
What I'm looking at in your linked code seems to be fine unless I don't understand completely what you want to achieve. One thing to note is that if you want to only keep one submenu opened, you need to store an ID of some sort.
Here's a quick demo of how I do it and you can also check out the newest Alpine plugin Anchor which solves a part of the headache for anchoring submenus :
- https://jsfiddle.net/davidwebca/os4guzvy/17/
- https://twitter.com/calebporzio/status/1720147531546447897
--
Edit: The demo is HTML only but gives you an idea of what would be the attributes to pass to which element in wp_nav_menu
Hi David!
This is really helpful. I'm still learning when it comes to tailwind and alpine, but wouldn't it be necessary (on a mobile nav) to add custom attributes to let's say ul and li classes to control opening and closing different levels of the navigation? it would also be good to add something like a toggling container after the first level to toggle the second level.
If could give me a hand (or point me to a solution) to achieve this i would be really thankful!
Best regards
Jan