 Okay, the Zoom lady has told us that recording is on. So I would like to take this opportunity to welcome everybody who is joining us today. I apologize, excuse me, for being a few minutes late. I was off at a last minute field hockey tournament that my boys' schools were involved in, and things were running late. And so I was trying to catch the start of the first match before I had to rush off, but that didn't work out. So I'll probably get a WhatsApp message a bit later on to know what the score was there. I apologize if that distracts me. As you are joining, please let us know in the chat where you are joining us from. And let me know what the weather is like in your part of the world. Because currently in Cape Town, we are entering what I like to think of as winter in Cape Town, June and July are out in months. So it has been, as the colloquialism says, raining cat and dogs for the past few days, it is cold, not as cold as countries that have things like snow and sub-zero temperatures, but it is cold for Cape Town. And it is dark in the mornings and we don't observe any form of daylight savings. So currently when I get up at 6 a.m., it is pitch black and it stays pitch black until about 10 past, quarter past seven, which is when I'm sort of getting into the car and taking the boys to work. So we drive, sorry, to school. So we drive to school in darkness. So I am keen to hear whether you've got summer weather or not. Adrian says it's cloudy and cool in Anaheim, California, Carolina, it's from Argentina, it's cloudy here and cold. Loris says that they've just had five days of rain, but the sun is out today, that's excellent. Rita is from Reno and it's sunny, snow-home-ish, low 41, high 66, no rain. Yes, Islam, there will be a video definitely. I'm just reading the comments as they come through. Arthur from Frankfurt, Germany, sunny weather today. I'm so glad to hear that, Arthur, because I am traveling to Europe next week to World Camp Europe and I'm looking forward to getting some free summer. Jim says, dry spell, low temperatures. Natalia is from Greece and she says it's warm and sunny, yes. So a bunch of my colleagues, not my current colleagues, but friends of mine who work at Kodable, which is a WordPress freelancing platform that I am part of, or used to be part of. I'm still in the WhatsApp group. They have a World Camp Europe WhatsApp group that gets reinvigorated every year around about this time. They've all been posting their pictures about how sunny it is in Greece right now. So Jerry from Edinburgh says 12 degrees in Edinburgh, okay. Laura says, I saw someone swimming in the ocean in Greece at World Camp. Yes, there's a lot of that going on. As long as he'll be there too, awesome. I'll see you there. Anya from Ukraine, hi there, welcome. Meti from Bangkok, it's so hot here. Yes, I believe Bangkok, it's very hot. Mark says, hang in there, Jonathan. Yes, I've only got to hang in there until Tuesday at which point I bought a flight and then land in summer, it's gonna be great. Okay, cool. So while everybody's joining, let's take things off here. Today we are going to be talking about WordPress coding standards. And before we get into the official announcements of the workshop, I have a quick note on today's presentation. Usually I try and make these workshops as interactive as possible. So I try and present something where you can follow along with me on your side. You can try out the code, you can test it for yourself. But there are, excuse me, there are certain things that require a little bit of developer tooling to be set up, some software to be installed. And depending on your operating system and your local development environment, the path to set these things up is a little bit different. And I'm speaking specifically about the composer package manager or dependency manager for PHP and the NPM package manager for JavaScript which is installed when you install the Node.js runtime. If you are on a Mac, it's fairly straightforward. You make sure you've got Homebrew installed and then you can install everything else through Homebrew generally. If you are on a Linux system, you can generally install all the things you need to install in whatever package manager you have or you could probably install most Linux systems I think can install Homebrew as well and you can do it that way. Windows is a slightly different story because Windows is not a Unix-like operating system. It doesn't have a Unix-like terminal. So setting up a lot of these command line tools requires a combination of either using something like PowerShell and then something called Chocolatey which is a package manager for Windows. So Chocolatey is kind of a comparison, a comparable package manager to Homebrew. And I've always found it interesting that the Windows sort of, I must say default but one that is popular is named after chocolates, the Windows one and the Mac one is named after brewing beer. I've always found that interesting. There are obviously other ways to do it. You can install I think Git Bash which is a command line tool. You can use the Windows subsystem for Linux which is another way of doing things but it's one of those things that really it requires an entire series of workshops or even tutorials to kind of guide the user through installing these things. So today we're going to be looking at some tools that require these packages and these pieces of software and I'm not going to be able to have time to guide you through that installation process. So if you have these things installed on your machine already, that's great and you should be able to follow along. If you don't, then all I would suggest then is just to watch the presentation, keep an eye on the recording, download the slides with all the links and then when you have some time to look into these things, install these pieces of software and then install the packages and things that I'm showing you today. I would love to do a workshop one day around installing all of these things and it's probably gonna have to be three different workshops one for Mac OS, one for Windows and then one to cover anybody who uses Linux which I don't even know what the percentage of that is. And so for today, just please be with me on that one when we get to that section of the presentation. Okay, with that out of the way let's do the official announcements. So again, welcome to everybody and thank you to Laura who is co-hosting with me here today, it is lovely to have Laura on as my co-host. Laura recently joined the training faculty program which is a team within the training team that kind of helps administer things and move things forward. So it's very cool to have you here today, Laura. Then if you can't see this announcement slide right now please do let me know. There is a known bug with Zoom that we're aware of on certain situations that when the presentation is being shared before you join the Zoom chat, some folks can't see it. So if you don't see a Google slides slide in front of you right now that says announcements at the top please let us know either in the chat or just unmute and let us know and I'll disable and re-enable the screen share. As always we're presenting in focus mode but you are welcome to enable your video if you would like Laura and I to see your face. You don't have to but you're welcome to do so. Focus mode just means that you can see Laura and myself but you can't see each other and this just prevents any kind of Zoom bombing. I was saying to Laura before the session started I've been very fortunate and that I have never been Zoom bombed but maybe I should say that with my fingers crossed because it could happen today. And then as always you are always welcome to ask questions you're welcome to post your questions in the chat or unmute to ask questions. The only thing that I ask is that if your question is not specifically related to what I'm doing on screen at the time please keep your questions for the breaks that I leave for questions or just post them in the chat and then we'll catch up with them as we go along. All right, there is some code that you can some example code that we're going to look at today I'm going to share the link to it in the chat so you're welcome to download this plugin unlike any of my other workshops this is the first time that the plugin doesn't actually physically do anything. It's literally just some example code that we're gonna look at and we're gonna see how it applies to WordPress coding standards. And then if you're finding that downloading the zip file ends up if you're on a Mac and you're using Safari and downloading the zip file results in just the PHP file sitting in somewhere on your desktop there is a setting on Safari that you need to I think disable and then it will allow you to download the zip file that way. And then lastly, just this is more of a reminder to myself but if I start talking too fast please let me know, please slow me down. I really do try and keep my pace measured but whenever I do more sort of free form chats when I do those developer AMAs I tend to get very excited about whatever I'm talking about and I tend to speed up and then the zoom closed captioning can't keep up with my South African accent and the closed captioning breaks. So let me know if I'm going too fast and I will slow down. And then last but not least as I was asked earlier yes I will be posting this this is being recorded it will be posted to WordPress TV tomorrow during the course of my day tomorrow and I share it in the chat in the meetup event the next day. Okay. Let us get on to our learning outcomes today. So today we're going to be looking at what are coding standards and why we should use them. And then we're going to specifically looking at the coding standards for WordPress. We're going to be looking at the HTML and CSS coding standards at about the same time and we're going to look at how we can validate any HTML and CSS code that we have using some online tools. And then we're going to be looking at the PHP and JavaScript coding standards. And then I'm going to be showing you how you can do what's known as linting your PHP or JavaScript code on your computer. The linting part is where I will be using things installed via Composer and MPM. So that'll be the part where if you don't have those things installed now you might need to install them later and try this out later if you're watching this on WordPress TV later now would be a great time to pause and go ahead and install those things or wait until we get to the section where I talk about it and then pause there and install it there. And then if there's time and this is one of the other reasons why I set the session to be an hour and a half long I want to show you something that one of my colleagues at Automatic Setup Ryan Welcher, some of you might know Ryan he does coding live streams and Ryan Welcher codes or something like that on Twitch. And he's actually set up a starter template on GitHub that you can use to sort of pre-configure all of these linters for you. So if there's time I'm going to show you where that is and how you use that. All right, and so today my let's code slide is going to say let's lint because we're not going to be coding today we're going to be linting and if you don't know what linting is don't worry I will explain that in a minute. All right, before we continue I'm going to pause and grab a quick sip of water if there are any questions now is the perfect time to ask them otherwise we will kick off in approximately however long it takes me to have a sip of water. Anybody remembers when I first started doing these workshops about a year ago I used to have a coffee I used to have a fresh I have a very big coffee flask this was given to me by the company when I joined and I used to have a fresh one of those whenever I did my workshops and then I used to wonder why I used to speed up towards the end of the workshop and I couldn't figure out why until someone said to me coffee at four o'clock while you're doing a workshop is that the best idea? And I went, no, you're absolutely right. So I've mostly switched towards it now. Okay, thank you Laura for posting those links in the chat very handy then. Okay, so the first question, what are coding standards? Now, there are many ways you can define what coding standards are. I tend to refer to Wikipedia as the online encyclopedia of things given that we know this is managed by humans sometimes these things are wrong but in this case they're not 100% wrong and Wikipedia says that coding standards or Wikipedia actually refers to them as coding I'm just trying to zoom in my screen here. There, coding conventions, coding standards or coding conventions, it's the same thing. There are a set of guidelines for a specific programming language that recommend programming style, practices you could say best practices and methods for each aspect of a program written in that language. So essentially the long and the short of it is a specific way to write that code. Now, coding standards create a baseline for collaboration and review within various aspects of an open source project and community. If you are working in a company, coding standards provide the same thing. Most companies will have a defined coding standard most open source projects will have a defined coding standard. And the bottom line is that they help avoid common coding errors, improve the readability of the code and simplify modification. So the general idea is that if everybody within a code project be it an open source project or a company based project follows a coding standard it's easy for anybody else in that project or that team to read the code suggest changes to the code. It looks like it was all written by one person. In terms of WordPress if you are planning to contribute to WordPress core you do need to familiarize yourself with these standards because any code that you submit will need to comply with them. While it is not strictly a requirement it is a good idea to also follow these standards while developing plugins and themes. And when I say it's not a requirement you won't get penalized for not following the WordPress coding standards if you submit a plugin or a theme to the various repositories but it does make it easier if you want anybody else to help you to contribute to your plugin or theme within the project because if the project is following it you're more likely to have folks using the same coding standards. Now within the WordPress sphere ecosystem you'll call it what you will there is a defined set of coding standards. You can find them all at this link that I've just shared in the chat. And it's in the developer resources under the heading coding standards. I actually think, I just wanna check I actually think it's linked from, yes it's linked from the home of developer.wordpress.org it is the second item in the list after code reference which shows you how important the project thinks the coding standards are. And there are four sets of programming coding standards one set of accessibility standards and then two sets of inline documentation standards. So the inline, I'm gonna start from the bottom here the inline documentation standards are when you are writing comments in your code and inline documentation we're not going to be covering those today. The accessibility coding standards are for making sure that your front ends are accessible. We're not gonna be focusing on these today either. I want to have a separate workshop on accessibility because that is a topic on its own. So today we're just gonna be focusing on the four programming languages the CSS, HTML, JavaScript and PHP. And I'm not gonna get into a debate today about whether or not CSS or HTML is a programming language. If you don't know what I'm talking about you are blessed. If you do, I feel sorry for you but I do consider them programming languages. Okay. So from that coding standards page we can click through to the HTML and CSS coding standards. So I'm going to do that now. So here are the CSS coding standards and here are the HTML coding standards. I will share these links in the chat with you as we go. And you will notice if you open up these two documents that the HTML and CSS coded standards are not very long documents. And the main reason for that is that, let me jump back to my slides. I'm just laughing at Adrian's coming there. The main reason for that is that the HTML and CSS coding standards pretty much follow the World Wide Web Consortium also known as the W3C standards for HTML and CSS. So if you, I'm gonna open that page now as well and share it with you in the chat. So if you, and by the way all of these links are in the resources of my slide so you don't need to copy them now if you don't want to. But if you are following the W3C standards for HTML and CSS then you should be following the standards for WordPress. The only major differences is that in the WordPress HTML coding standards they talk about the fact that self-closing elements like a break tag should have a space between the closing part of the element. They talk about attributes and tags having certain lowercase and uppercase properties. They talk about quotes should only be single or double quoted and not like this example here where there are no quotes around attributes. And then at the bottom they talk about HTML indentation. And this is a thing you will find across all WordPress coding standards be it HTML, CSS, PHP or JavaScript WordPress prefers using tabs over spaces. Again, I'm not gonna get into an argument over that. One of the best arguments that I have seen for using tabs versus spaces and we'll dive into tabs and spaces in a second is that tabs are more accessible for folks who have visual impairment. And for me, that's a good enough reason. And those are the only major sort of changes or differences between the W3C HTML standards and the WordPress HTML standards. In terms of the CSS coding standards mostly it is the same. The one slight difference is that if you take and I'm gonna show you in a second how you can validate this if you take this code here and you validate it according to the W3C CSS coding standards it will come back as valid. WordPress says no, we don't want things to be like that. We want the CSS code to have proper indentation to have tabs not spaces to use blank lines between sections and that each selector should be on its own line. So those are the slight differences there. Okay, so those are the main CSS and HTML standards you can read through these pieces of documentation whenever you have a chance. I do recommend reading through them and making sure you understand how they work. Now, if you have the plugin installed on your local WordPress install which I don't have at the moment. So let me fix that. I'm going to open up my local version of WordPress and I'm going to install that plugin. I might not even have that plugin on my desktop. So I might actually even have to download it. Let's see, debugging. No, I don't have it yet. So let me grab that from my own slides and let's save it to my desktop and then let's add it. And I'm not going to worry about activating it light right now because as I mentioned, it doesn't do anything. But if you have that installed on your local WordPress install then you open it up in your code editor and you browse to the WP content plugin, WP learn coding standards folder. You will see there are four files. One is a PHP file, one is a JavaScript file, one is an HTML file and one is a CSS file. If you have a look at the HTML file you will see that if you didn't know any better this HTML file looks valid. And if you load this page in a browser, it will work. And one of the reasons it will work is that a browser will fix any problems might exist within the HTML. However, the W3C has a HTML validator which you can access, let me jump back over here which you can access at validator.w3.org, W3.org. And if you copy and paste your HTML code in there you will see it starts reporting a couple of errors. You can do it via URI. So you can validate a page on a website. You can validate by a file upload. So I could upload this HTML file if I wanted to. But I'm just gonna go with direct input for now. It's nice and easy. I paste the code in there. I hit check and it does some checks for me. I see that Adrian says I get an error when I activate it so best not to. Yes, I haven't done any kind of checking. The PHP is just random PHP. So it's a very good chance. Don't install it on the site that you want to keep working. It's just, for once it's just example code. It doesn't physically do anything. And you'll see that at the bottom of this check it says to me write consider adding, it says warning. It says consider adding a lang attribute to the HTML start tag to declare the language of this document. And it also says that the first start tag is HTML and it's expected doc type HTML. So you can effectively take these changes and you can pop them here. So this one, I just need to add this right to the top. And then it says I need to add a lang attribute and I'm just gonna make it. I think it's just EN is for English. And now if I copy paste this code back into the checker and hit check, it will return all happy no errors. You will notice though that the break tag is not using that space that the WordPress coding stand is recommended. So if you were to submit this HTML code as part of a file somewhere, part of a PHP file or a template or whatever, that might get picked up as an error and you would then ask to fix that. So that's a good reason to know why, sorry, it's a good reason to know what those additional HTML coding standards are. Similarly for CSS, if we have a look at the CSS file it just has one line of CSS code. The W3C has a validator for CSS as well. For some reason it's under the jigsaw.w3.org subdomain, I'm not quite sure why I'm gonna copy and paste both validators out and pop them in the chat because I realized I forgot to do the previous one. So there they go. So if I open up this, I can, if I can add it, come on, there we go. So there is my CSS validator. Same thing I can do by URI, by URI is nice because you can, let's say you're building a site and you've got everything in a homepage and the CSS is in line somewhere. You can just send it that link to that page and it'll validate the CSS on that page. It's quite handy. File upload works in our case. If we were using a file, let's actually use a file, why not? Let's do it that way instead of direct paste. So let me navigate to this plugin and let me find the CSS file and there it is and let's upload and check it and it checks it and says, hey, we're happy. It validates to CSS level three and SGV, so all good. And you will notice that in the file itself everything is on one line. And why am I mentioning that? Well, because according to the WordPress CSS coding standards having everything on one line is incorrect. So according to W3C, it's perfectly valid. WordPress has some additional layers on top of that. WordPress would prefer it if you had it like this if you had it on the next line and on the next line like that with tabs over here that would be WordPress's preference. So obviously it would be ideal if there was some way that we could do this validation. Number one, not on the internet because then it would require us to have an internet connection on it all times. And also within our little coding project to pick up those specific WordPress standards over and above the W3C. And there are ways to do this and I'm going to dive into those in the next part of my workshop. But for now I just wanna pause, grab another quick sip of water and check if there are any questions at this point in time. Okay, they don't seem to be having... They don't seem to be have... They don't seem to be any questions. So I will move on. Me fumbling my words is also a good reminder that I'm talking too fast. All right. So the next set of standards we're going to talk about first are the PHP and JavaScript standards. Now, these are very, very different from the HTML and CSS standards. And I'm going to dive into the history of why. But first let's have a look at them. So let's open up the PHP coding standards and I'll share that with you in the chat. And then from here I'm just gonna pop open the JavaScript ones and I'll share that with you in the chat. Okay. So if you have this open in front of you or if you're watching it on screen with me now you will see that this document and I'm gonna start scrolling. This is the JavaScript one. It's a lot longer and has a lot more information and has a lot more rules and the way things should be done. And I'm still scrolling, I haven't even had halfway yet. There's a lot more going on. There's a lot more to be aware of. The PHP one I think is even longer. Yes. If you have a look at it and if you can see the little draggable item on the side of my browser here this one is fairly sort of shortish. But if I switch over to PHP it's even shorter which means even more scrolling needs to happen. So in PHP there are even more rules and guidelines and things like that. So to understand why this is the case we need to understand about the history of the use of PHP and JavaScript in the WordPress project. And we need to understand the history of the web. So those of you who know know that HTML as a concept and the W3C itself was founded in about 1994 by Sir Tim Berners-Lee. So that means the standards for HTML and CSS at that point in time were defined and then continued to evolve over time. WordPress as we all know from the big celebration this past weekend turned 20. So that means WordPress came out in 2003. That means that from 1994 to 2003 they were nine years of HTML and CSS standards to build on. So WordPress could quite easily adopt the HTML and the CSS standards and go forward with them. And that's why they are only minimal changes. PHP and JavaScript are ever very different. PHP came out in 1994. The very first version of PHP came out in 1994. And JavaScript one year later in 1995. And there's a group in the PHP community called PHP Think, which is the PHP framework into interrupt. I can never remember the name of it. PHP framework interrupt group. There it is, PHP framework interrupt group. They first met at a PHP conference in around 2009, I think it was. I'm just gonna check my notes because I couldn't actually find any hard dates on this. I found it in a German translated version of a Wikipedia page on the PHP interrupt group because I think the first group met in, it was a German conference. Yes, here we go. They were founded in 2009. So WordPress started using PHP before there was even a group to define PHP standards. And the PHP framework interrupt group have since developed something which they call the PSR standards. So if you go to, I'm gonna copy the link out for anybody who wants to go and read about that. If you click on the PSRs, they have all the different coding standards there and they are very, very different from WordPress coding standards. And that is because WordPress has been around so long. So if you don't know, there's a little bit of a, I wouldn't say fight, but those who follow a PSR strictly sort of look down on those of us who follow WordPress coding standards. Those of us who follow WordPress coding standards tend to feel a little bit judged by the folks who follow the PSRs. My general opinion on the matter is use whichever coding standard your project or product uses. So when I'm working in WordPress code, I'm using the WordPress coding standards. When I'm working in a Laravel project, I'm using whatever the Laravel project follows. And I find ways to automate that process. I use a tool called PHP storm. It is a paid tool. It is, I think $99 a year, but I have saved more than that by using it over time. And it has ways. And in fact, I think I would actually like to share that with you today. I'm not trying to convince you to buy a PHP storm, but I would like to show you one of the reasons why I use PHP storm. So these are my notes from today's workshop, but I just wanna go into the settings. I'm going completely off-script here, but I want to show you why I love PHP storm so much. This reason alone is worth the money. I can go into the settings for PHP, the code style, and I can set on a per project basis. I can set my coding style to the pair coding style, the Zend coding style, Symphony 2, the PSRs, which is the PHP fed group, code igniter coding style, Laravel, PSR 12, Drupal, Joomla and all WordPress. I set a per project, and then I never have to worry about it again. It will auto format my code for me. It just saves me all of this brain space. So the long and the short of it is, if you want your coding style to follow, if you want your code to easily follow a coding style, pay for PHP storm and this workshop is over. Okay, anyway, here we go. But the point I'm trying to make here is that WordPress has its own coding style. It was adapted from so for, let's find the documentation here. For JavaScript, it was adapted from the jQuery JavaScript style guide, and it has then evolved over time. There were some conversations recently in the core JavaScript group about updating some of the coding styles to meet more modern JavaScript functionality. Some of that is happening, some of it isn't. The PHP coding standards, it doesn't, if you have a look at the JavaScript coding standards, it actually says they were adapted from jQuery. You do not find anything about what PHP was adapted from, because PHP wasn't really adapted from anything when the WordPress coding standards for PHP were defined. It's very specific to WordPress. I don't know any other project that follows a similar, the same standard. It has taken pieces from here and there. Some of it is taken from something called the pay coding standards. That's an interesting question. I'll get to a question in a second. Some of them were adapted from the pay coding standards. Some of them were adapted elsewhere. Some of them were just based on the C coding language, which is what PHP is written in, and it became the WordPress coding standards and then that's the way it was. Okay, there are, however, some tools that you can use. Instead of having to memorize all of that, there are some tools that you can use that do what's known as linting. Linting, if we have a look at Wikipedia, again, let's just do a quick search for lint. Linting, I think is the word I'm looking for. Yes, linting is the term for static code analysis to flag programming errors, bugs, stylistic errors, and suspicious constructs. So in this case, it'll scan through your code and check, are there any issues with your code according to a specific code style? Okay, I'm gonna take a pause there and check if there are any questions at this point before we dive into how these tools will work. Rita says, can we have a workshop on PHP Store? Maybe please. So Rita, I would love to do a workshop on PHP Store. The problem I have is that in the WordPress projects, not specifically an automatic rule, the company that I work for, but a WordPress project rule is that we are not really supposed to promote one specific paid tool over another. So what I could do in the future maybe, and this is something that I have been thinking about, is I want to, and I know it's possible to do so, I want to set up my VS Code editor that I use for presenting these workshops, I'm kind of getting there. I want to set that up so it's running similar situations to PHP Store. Exactly what Adrienne is saying now. And then show the comparison, show the pros and cons to both. For me, PHP Store, I came from, before PHP Store, I was using something called Zen Studio. Before Zen Studio, I was using something called Apache NetBeans with the PHP edition. I've always used what's known as an IDE versus a code editor. So I've always used something that comes fully fledged with baked in functionality for the language that I'm working on. That's how I started programming. I started programming in, well, I didn't start programming in an IDE. I started in basic in a text editor, but when I studied programming at college, it was IDE's Delphi basic IntelliJ, not IntelliJ, what was it? VisualJ++ for Java. So I see the benefits in spending the money on an IDE, but I also understand that the open-source free versions, open-source and or free versions have a benefit as well. So maybe in the future, we'll do a PHP Store versus VS Code showdown, but I wouldn't like to present a workshop just on PHP Store because it does have a cost involved. Not everybody can afford that cost, especially around the world, different, what's the word? Currencies and currency rates. So maybe a comparison would be, yeah, it is quite expensive. I won't disagree with that. Okay. So let me close down some of these windows and let's get on to how we can do all of this in an automated way. All right. So the first code linter or code examiner, the tool that we're going to look at is known as the PHP code sniffer. And it has, they are WordPress coding standard sniffs for PHP code sniffer. So what PHP code sniffer does is it sniffs your code, that's the term it uses, basically it reads through your code and it looks for any problems and it reports those problems to you on the command line. As I mentioned earlier, it does require you to have composer installed. Well, I say it does. It doesn't actually require a composer, but using it through composer is one of the easiest ways to do it. You can install a PHP code sniffer, what's it's known as PHP CSS. You can install it on its own and then you have to clone the WordPress code that it sniffs and then some links and folders up. And I actually have an article on my blog, you're welcome to go and find it and read it. That talks you through the process. Doing it through composer while it does require a composer, it is the most straightforward way to set it up. So if you're looking at install composer, you also do need to have PHP installed on your command line, but there are instructions in the getting started section of composer, which talks about system requirements and how to install things. Once you have it installed and you switched to your terminal, then you can run composer on type today, composer minus V, and it'll give you some information and show you that composer is installed. In this case, I've got composer version 235 installed on my command line. What I'm going to do now is I'm just gonna quickly switch over to my learn press site and I'm going to switch into the WP learn, no, plugins, WP learn coding standards folder. So this is now inside of that folder. And if we do an LS minus LA, we will see there are the four files, coding standards, CSS, HTML, JS and PHP. With those things installed, you can start installing the different packages. So I'm going to open up the link so that you can see what they look like if you want to install them yourself. I'm just moving my notes around because I can't see my notes on the split screen. So please give me one second, come on. There we go. So this is the link to PHP code sniffer. This is the link to the coding standards. They are here in my slides. So code sniffer basically tokenizes your PHP files and detects violations of a specific set of coding standards. By default, it doesn't include the WordPress coding standards. So you have to install those separately as well. Those are maintained over here by the WordPress project. So they are PHP code sniffer rules or SNFs to enforce the WordPress coding conventions. This is specific to PHP. So once you have everything up to install these things, you run the following three commands. I'm going to just hop over to my slides so we can see them. So the first one is to install PHP code sniffer installer. So you run composer require, use the dash dash dev command to say I want to only install it as what's known as a dev dependency, meaning don't upload any of these dependencies to the production environment. And then you install this PHP code sniffer composer installer package. So we'll start with that. And that goes and finds the things and downloads the things. And then it asks you, do you trust this PHP code sniffer component, composer installer plugin? It is safe to trust this. So you can just say yes, and it'll do some more downloads and it'll go. If you have installed this on another project, the way composer works, it actually keeps a cached version of the code in a temporary location. So the first time I did this, it may have taken a few minutes. When I do it now, it's much quicker because it's just putting it from the cached version. Okay, so that's the first step. The second step is to install PHP code sniffer. So you use this command. So composer required dash dash dev and it's the squids, squids labs, PHP code sniffer package. So you run that and it installs a whole bunch of things. In this case, it already has been installed. So it's all good. And then the last thing you need, and let's go back to my slides is the WordPress coding standards. And again, that's requiring as a dev dependency. So there we go required dev WP coding standards WPCS. Okay. So what that does is that it installs the code sniffer package in the plugin situation and allows me to run it where the WordPress coding stands. I wanna show you in my visual code studio what this has done physically on the hard drive. So it's created first of all a composer.json file, which is the file that manages all my composer packages. It's also installed something called composer lock, which is the file that sort of when it installs the packages that gets the version number and then locks your packages to that version. And then it creates what's known as a vendor folder. So the vendor folder is where all of these dependencies are installed physically on your computer. So there's the coding standards. There's the squizz labs PHP code sniffer one. There's the dealer direct PHP code sniffer plugin. And then there is a bin directory, which includes the PHP code beautify executable and the PHP CS or PHP code sniffer executable. So that's the one we're going to use on our command line. Once we've done that, we need to tell PHP code sniffer which files to use and which files to ignore. Because what we don't want is we don't want the code sniffer to be running through our vendor folder. So PHP code sniffer supports an XML configuration file. So I'm going to create that right now. So I'm going to just close down some of these. I'll leave the PHP one open. And so what I'm doing is I'm creating a new file in my plugin folder. And I call it PHP CS dot XML, very specific name that needs to be called phps.xml. And then the basic rule sets that I need looks a little bit like this. I'm taking that out now because I'll explain what I'm doing in a second. So the rule set, we could just call it the WordPress coding standards. You can call it whatever you want. So you can call it WPCS if you want or coding standards, whatever you want to do. That's just an English or human readable name for it. The ref is WordPress. So this is the coding standard we want to adhere to. We tell it what extensions to run through. So in other words, only look at PHP files. Don't worry about JavaScript, CSS, HTML, any of that, only look at PHP files. This file attribute means look at all the files in the project route. So scan through all the files in the project route that are PHP files, but then exclude certain directories. And in this case, we don't want to run through the vendor directory because those are all the dependencies. We only want to focus on our code. So this is the base PHP XML that you might need for doing this. I'm gonna place this in the chat if anybody wants it, it is in my slides if you need it. Let me just verify that. Then put it in my slides, I'm pretty sure. Yes, there it is in my slides. Okay. And then once you've installed all the software and you've set up your PHP, CSS, XML file, then it's literally one command that you run. So you run dot slash vendor, burn PHP, CSS, and you say use the PHP, CSS, XML as the standard set of guidelines that we're going to use. So I'm going to copy this out now and I'm going to open up the terminal. And what I'm also going to do is I'm just gonna clear my screen so that we can jump right to the top. And this is basically now going to run on the PHP file that I have. So let's do that. And there we go. A whole bunch of errors have been reported. 41 errors and six warnings affecting 16 lines. So this is basically taking all of those coding standards on that PHP page that we saw and applying them to our code. And this is what I love about this is in 25 lines of code of this plugin PHP file. There are more, let's go back there. There are more errors and warnings than there are lines of code. Now, a lot of these errors are duplicates. So for example, you will see it, if we look at this one here, it says tabs must be used, tabs must be used, so I'm using spaces and not tabs and those kinds of things. So now you can go through and you can start fixing these errors. So let's have a look at the first one. The first one says missing package tag in the file comment. So what that means is the top of this file, WordPress coding standards requires a package tag. Don't stress if you don't know what this means, but that's just a requirement from the coding standards. You can go read about that on the coding standards documentation. And now if we run this again, it should say, right, that area has been gone and yes, that area has been gone, sorry, has been removed. Now the next one, white space found at the end of line and so on and so forth. Then you go through and you fix one by one by one. Okay, any questions on all of that? I'm not gonna go through these now because we're gonna be here forever, but any questions on all of that and how it gets set up and what you need to use to get it going while I grab another sip of water. So we've spoken about the PHP coding standards and how we can automatically length them. Let's jump onto JavaScript's coding standards. Now JavaScript is slightly different to PHP. The coding standards are more or less the same for certain things like spaces between things and the way functions need to be declared and that kind of thing. But then there are other areas that things are slightly different because the slight differences in the JavaScript language. Because JavaScript is not like PHP, we obviously can't install any composer packages to validate PHP code. But if you don't know the sort of modern JavaScript version of composer is something called NPM. I'm gonna open that up now very quickly here. So NPM is what's known as the package manager for JavaScript is it sort of comes with the Node.js runtime environment. Node.js is a JavaScript runtime that was developed a number of years ago. It basically allows folks to write JavaScript code and have it executed on a server as opposed to just being in a browser. So as with, let me open up the server here. And let me jump back here. As with PHP, there is a package that you can use. It's predefined. It is specific to, again, like the PHP WordPress coding standards, this one is specific to the WordPress project. You can find the documentation for this in the block editor handbook because we have a lot of the... I'll show you a question there, I'll get to it in a second. It is defining the developer resources for the block editor, because that's where a lot of the JavaScript functionality has been happening these days. And the nice thing is, once you have Node.js and NPM installed, you install one package and you're good to go. I'm gonna pause there for a second because Jim says, is the auto fix reliable? So Jim, when you say auto fix, I assume you mean this line at the bottom here where it says PHP, CBF can fix the 46 marks and violations automatically. Is that what you're asking? Good. Okay. Can I ask you to hold on to that question? Cause I wanna show you something very cool in a second after I've done the JavaScript stuff. And that'll help answer your question. Okay. So just bear with me, I'm getting there. Okay. So with the JavaScript code linter, it's basically just the WordPress scripts package that you need to install. But before you do that, you need to install Node.js and NPM. Fortunately, installing Node.js also installs NPM. So it's one install that you need to do. If you go to the Node.js website, which is simply Node.js.org and you click, it automatically picks up that I'm on Mac OS and it gives me two versions to install. You can also install it through package managers. So if you have Homebrew installed, you can install Node.js from Homebrew. If you're on Ubuntu Linux, you can install it that way. Windows, you generally have to do the download way and then install it that way. But once that's up and running, you will be able to run something called, let me just clear this out, NPM on the command line. And I'm gonna go minus V again to check the version. And there it's telling us NPM version 6.14.7 is installed and ready to rock and roll. Because all of this happens in the WordPress Scripts package, the only command that we need to run is this one. The NPM install WordPress Scripts, Save Dev. So I'm going to run that because it does take a while and while that's running, I want to have a chat about WordPress Scripts very quickly. WordPress Scripts is what the Gutenberg project uses to develop and build the block editor, the site editor and all of those things. So it contains a lot more functionality than just what you need for linting. However, the advantage of installing it means that if you ever decide you want to contribute or work on the Gutenberg project one day, you already have all of those packages enabled and installed and ready to go. So there is also a, just gonna find it here. There is a WordPress ES lint plugin. ES lint is basically a linter for JavaScript and you can also install that as an option. It provides configuration custom rules for WordPress development. You can do the set, you've got the single command there and then you can run it and you can use it. My recommendation though is to get used to using WordPress Scripts because it does set you up for working in the WordPress project as a whole. Okay, let's see if you see this is still busy installing so it takes a while. So while that's installing, let's jump back over to Jim's question. So Jim was saying, Jim was asking, should I say? I think I cleared out that screen at the bottom of the, let me open up a new terminal here while that's installing. Let's go to that site. Can't remember what it's called now. Plug in, it's WP learning coding standards and let's run the PHP CS linter on it again so we can see that message. So Jim was asking this line here, PHP-CBF can fix the 46 mark sniffer violations automatically. So PHP-CBF is called PHP code beautifier. It comes with the PHP code sniffer package. And what's cool about PHP-CBF is you can actually have it set up in your editor. So you can do it in PHP Storm and you can do it in VS code. I specifically didn't want to go through the process today because I'd have to uninstall it from my VS code and reconfigure it, but I wanna show you very quickly how it all works. So it's an extension in VS code, for example. Let me just open up my extensions and the extension is called PHP sniffer and beautifier. I'm gonna find this online so I can share the link with you even though it's not in my slides because I think it's useful to have. If you're not sure, you can just search for it, PHP code sniffer and beautifier for VS code. Samuel Hilsen, let me make sure that's the same one. Samuel Hilsen, yes, it's exactly the same one, excellent. So your first step is you, I'm just smiling at you, the agent. Your first step is you install that package or that extension. Then what you do is you make some changes to your configuration. What you'll need to do and this is where you will need to have the WordPress coding standards GitHub repository cloned to your local machine. You then go into the settings and I'm probably gonna do this as part of that VS code versus PHP store workshop. So I will show you the thorough steps of this one day. But basically it's, let me just find the charts in a, here we go. So you need to have the PHP CBF executable installed globally in your system. And then so it's under extensions PHP sniffer. So let's find it there quickly. So it's under extensions, PHP sniffer, there we go. So you need to have PHP CBF set up. You need to have PHP CS set up as well. So these are installed globally using homebrew. Once that's done, then you need to configure your sniffer arguments in your settings.json file, which I'm gonna click through to here and you'll see I have it up here. I have this PHP sab executable path. I've set the standards to WordPress and then it has the PHP XML and all of those things configured. And so what I also have is I have, quite sure where I have it installed. I think it's just in my home directory. I have the coding standards installed so that the visual code set up in the plugin can connect to those coding stands. And then what can happen is if you have, and thank you to Adrian who was the one who pointed out the shortcut to me on this one, if you use, I think it's option command L, auto format in this code, it will automatically fix the code for you. And you'll notice I'm gonna control Z so we can see the changes. You'll notice how it's spaced everything out. So I'm gonna just jump between the two. So first of all, it spaces everything out, number one. Number two, you'll notice that the, the way this function has been set up has changed. Sorry, I'm using the wrong things there. And it's kind of fixed those problems. So that's effectively what it's doing. It's running PHP, CBF on the code, fixing those problems. If we now go back to where we ran that original command and run it, there are still some errors, but way less, okay? So it's not a hundred percent perfect, but it's better than having 46 warnings and errors. So now I just have a couple of things I need to fix. So there's a missing dot comment for the function, register custom post type, and there's a precision alignment of one space's issue because I'm using spaces not tabs correctly or something along those lines. So yes, it does work. It fixes a lot of the problems for you, but it's not gonna fix every single thing. You do need to still run it against your linting tool and just check that there aren't any missing things because it can't pick up everything. Okay, let's check on the installing of WordPress scripts. Okay, so Jim, I hope that answers your question. I will do that workshop on setting up VS Code and how that all works. So what I think I might do, if you folks are interested in this, let me know maybe in the chat. But what I think I might do is I might take you through the process of all the things, all the extensions, all the configurations I have set up in VS Code to get all the tools that I'm used to in PHP Storm and sort of how long that takes and then show you just working out of the box in PHP Storm. Maybe we'll do that. Or maybe what we'll do is we'll say these are the things that I like about PHP Storm, let's set them up in VS Code. Maybe we'll do it that way around. I haven't figured it out yet, but if you're keen on that, I can definitely do that. Okay. Rita says yes. Natalia says yes, please. Rita says keen, okay. Sounds like we need to do that one. Cool, I will make a note of it and I will definitely get to it. All right, back to JavaScript coding standards. Once you've got the WordPress Scripts package, sorry, did I lost myself on a tangent here? So I'm going to pop over back to my slides and just remind myself. Yes, sorry. The other thing you need to do, I've done this a little bit the wrong way around, but you need to also run NPM init. And what NPM init does is it creates, let me go back to here. I'm seeing something beep at me and I'm not sure if it's important, so I'm just going to check. Okay, I don't think it's important. It's another conversation. That's all good. If you, let's just hop back over here. Sorry folks, I've lost my tangent there. Okay. If you run NPM init in the command line for the project, what this will initialize the project to use NPM for adding other dependencies. And we don't need it for dependencies right now, but we need it to be able to set up the WordPress Scripts that we're going to run. So when you do that, you can pretty much accept the default values for the NPM init questions. So I'm just going to accept that one as the default. I'm going to accept that one. I'm not going to worry about description. I'm going to leave that as it is. I'm not going to worry about a test command. I'm happy with that being in the GitHub repository. I'm not worried about keywords. I can put my name in there, but I'm not going to worry about it now. The only thing I do need to do is I need to change the license to GPL 2 or 3 or later because it's a WordPress product. And the nice thing about this is that if I type it in wrong, it'll actually say to me, hey, this is not a valid expression. So maybe it's similar to this. And so this is what I'm going to paste in there. I prefer to use two or later. Three just has some slightly more restrictive things that I don't think are acceptable for WordPress core, but it's fine for you if you're doing plugins or themes. So I stick to GPL 2 or later. It says, are you happy with this? I'm happy with this at this point in time because it's not super important. So I'll just say yes. And what that will do is that will create this package.json file. And the only thing that I, no problem, Adrian, the only thing that I need that is JSON file right now is the scripts area here. So what I'm now going to do is I'm going to replace what's in my package.json scripts with the scripts command from the WordPress scripts package. So once I've installed it, if I scroll down, you'll see here is the scripts example. I'm going to copy the whole thing out just because I'm lazy, but I'll show you the two that we're specifically going to look at today. So I'm going to copy that out of there. I'm going to pop it in there, make sure that there is a comma there. Oh wait, there's two additional lines in this JSON object. I don't need that. There we go. There's the WordPress scripts. I need to make sure there's a comma there. VS code is great at picking up those errors. So that's lovely. And there we go. So that's our script section. And what this allows us to do, this allows us to run any one of these predefined scripts on our project. And the two that we're going to look at are lint.js and lint.css. So to run those, I think I do have it in my slides. Let's jump over to the next slide over here. So there's the scripts we discussed. And literally it's a case of you just run npm run lint.js. So let's do that. Let's clear this out. And now it's only going to run and lint JavaScript code, which is what I like about this process. I didn't set up a phpcs.xml file and tell it what files to worry about and tell it to certain other things and all the other stuff. I just say lint.my.js files. And it will then look for my inmy.js file. It'll find one and it'll report on those errors. What I don't like about this linter is it's a little bit trickier to figure out what's going on. And the reason I say that is this item over here actually means a space, not that character. It actually means there needs to be a space there. I find the formatting of phpcs to be a little bit easier to read on the terminal. But at least it does give me the errors that I need to understand and I need to fix. And then I can go through just as I do with the php code and I can go through and I can fix those errors. As I might have mentioned earlier, which I think I did, there's also a CSS linter. So just like I can learn the JavaScript code, I can learn the CSS code as well. So I can run npm run lint CSS. It'll then look any CSS. And there we go. It's already telling me expected a new line, expected certain things. So it's picking up WordPress coding standards issues. So remember earlier, we saw that W3C was happy because according to W3C standards, that is correct CSS code. But according to WordPress coding standards, we need to make these few changes. Okay. And there are ways to also do the auto formatting of your code in your VS code setup. There is a plugin, I don't have it installed because I don't do a lot of JavaScript programming, but there is a plugin called, I think it's ES lint and another plugin called Prettier. You install those two extensions, you configure them with your linting and then it'll also do the auto formatting in the VS code editor for you as well. Okay. Any questions around all of that? Anything that didn't make sense? I know it was a lot to take in. So that's some of the reasons why I made sure that my slides were fairly extensive today so that you can take them and you can go through and you can read about these things and understand. Hopefully you'll be able to use this presentation to remember what we were talking about and you'll be able to set them up on your site. I'm gonna take another sip of water before I show you something very, very cool. Okay. Just checking if there were any other questions. Okay. I don't see any questions right now. So the last thing that I want to show you, okay, is there is, there is this package with this GitHub repository that Ryan, who's the chap that I mentioned earlier, has created. Ryan is currently also an automatic. He is a developer advocate and he does a lot of similar work to what I do. And he set up this project which basically has all of the required lintes pre-configured. So it has the linting and formatting tools for PHP, JavaScript, CSS and package.json files and a build process provided by WordPress scripts. So you will see there is the PHP CS file that we saw earlier. You will see that he has the composer.json which installs all the required packages for you. You will see that there is the package.json which also installs all the required packages and sets up the scripts for you. And all that you need to do this is you need to have Node.js and NPM installed on your machine. You use the template to start up your new project. So in other words, if I click on here, I click on use to this template and I can create a new repository. I can then set up the repository in my GitHub account. I can clone it to my local machine and then I literally just run NPM run setup and it'll do all the installation and all the everything else and then off it'll go. It'll do it all for me. No problem, Laura. So I do recommend checking out this project template and use it as a learning experience. So use it to, what's nice about it is you don't have to worry about all the things I just walked through. You just start a new project, a new plugin or a new theme. You can either keep this as a template on your GitHub and then keep it locally and then just copy the pieces you need. And at the bottom, you'll also see that Ryan mentions that if you're using VS Code, if you add the following to your settings.json, so editor, code actions on saved. Every time you save a file, it'll automatically fix everything. It'll run through, fix it all for you. So don't even have to auto format using the keyboard hotkeys. You do need to configure your VS Code to automatically save files, which is possible. But this is a great way to automate everything for you to run through to pick up the problems and fix them for you. So I highly recommend checking this out. Ryan is an amazing coder and he has grabbed these resources from sort of all of the best practices and put them together in one package. So please do check that out. I'm gonna copy this into the chat if anybody wants to grab it now. It's a great way to learn about and set up and configure all the coding standards in one place. Okay, and then finally, as I mentioned, all of the things that I've discussed today are linked through at the end of my slides. The slides are shared on the Meetup chat. So if you wanna get all of these links, you're welcome to get them there. The only sort of hiccup that you might struggle with is getting composer installed, getting Node.js and NPM installed. But once you figured those out for your operating system, the rest is just running commands on the command line. Awesome, any questions around any of this stuff that I've presented, WordPress coding standards in general, anything else you wanna ask that you feel like I didn't cover today around the topic of WordPress coding standards now is the perfect time to ask while I refresh my voice again. Carolina with the curveball. Carolina, I've been pronouncing your name correctly. Any recommendations for doing this with Gulp? It should be possible and I'll tell you why. As far as I know, WordPress scripts essentially just uses, I think ESLint to lint the JavaScript. So you should be able to set up your Gulp to run ESLint with the coding standards. You would probably have to pull the WordPress scripts packages apart and see what other packages are being used, but it should be possible. I, unfortunately, I skipped over the Gulp and Grunt days. I went from writing mostly PHP code and vanilla JavaScript to working in projects with Gulp and Grunt were already set up and I just kept reusing them. Straight over to Webpack and using Webpack, there's something called Larival Mix, which is built around something called Webpack to transpile my CSS and JavaScript code, my SAS and my less and all that kind of stuff and typescript and all that. So I personally can't recommend any suggestions for doing in Gulp. It should be possible, but I don't know the ins and outs. Jerry says, are the steps the same for setting up linting in WPEV? I think so. I would think it is the same. I actually think that WPEV might have some details around that. Let's just have a look here because WPEV is essentially using NPM to install. So my assumption would be, yes, you should be able to do it because you're essentially, you're able to run WPEV from your WordPress source code directory. So you're managing the source code on your machine. WPEV, if I'm not mistaken, will create a package.json file. So you should just be able to install WordPress scripts if it isn't already being used by WPEV and then make sure the scripts are there and run the scripts, that should work. But that information is untested. I've never tried it before, but theoretically it should work. For the PHP code, you should just be able to install Composer and then install the packages in your plugin theme or WordPress source and then run it the same way. That should theoretically be possible because if memory serves WPEV, it just basically manages the Docker instance that serves the code to the browser, but your code's actually sitting on your machine. So anytime the code is physically on your machine that you're working on, you should be able to run these things without any problem. Yeah. Ah, currently there's a mixing gulp with WordPress in the company I work for and just got the idea maybe there was something that I could add to the project. I just wanna check. I know that some time ago, when I was still working in Delicious Brains, we did an article about gulp versus grunt in the Battle of the Boltzols or something. I just wanna see if we covered this there. So this article might help. I just wanna see. So you'll see they're talking about compiling less and linting and those things. There's a good chance. I say this without any proof, but grunt does also create as far as I remember a package JSON file. So if you just include WordPress scripts and then set up the scripts in your package JSON already, that should work theoretically, but I've never tried. So your mileage may vary as they say. But you're welcome to read through this article. Maybe I'll share it in the chat with you. Maybe there's something in here that will be useful on that one. Okay, I think we also, we did a, there was a NPM scripts as a Boltzol. This is effectively what the WordPress scripts does. It uses NPM scripts as a Boltzol. So this one actually talks about the differences between the two. And I seem to recall that one, what I do remember is there was a project that I was working on where we used either grunt or gulp for something. Can't remember exactly. And for those of you who are listening, if you've never heard of grunt or gulp, excuse me, there were sort of JavaScript task runners that existed pre-webpack, pre-NPM, almost pre-no JS. I seem to recall there was a project where we had, we were using either gulp or grunt. Can't remember which one to do some CSS or JavaScript transpiling. And then I needed to use something in webpack. And I think I just installed the package and set up the scripts in the grunt file. And I think it just worked. I'm going to go and see if I can find that because I think it was when I was working on the seriously simple podcasting plugin. So I'll find it. And if I do find it, I'll share it in the meetup.com event chat tomorrow. But I do seem to recall, I did kind of what they call Frankenstein, gulp grunt and webpack together. So it should theoretically be possible. But it's not something I've done recently. So I can't say for sure. Okay. Any other questions around all of this while I close down my multiple tabs? I discovered today, this is completely off topic, but I discovered today that Brave allows me to use vertical tabs. And I'm trying to decide if that's better or not. I've been using horizontal tabs for so long, but I like the idea of having them all down the side. So I'm going to be playing with that over the next few days and weeks. Anyway. So does it take up more screen space? That's the thing I kind of... So that's the kind of the interesting question is, yes, it does take up more screen space, but if you look at something like Composer, there's so much white space anyway, does it matter? Yeah. That's what I haven't quite figured out yet. Yeah. That's the one issue with working with the WordPress is when you get the list view and then your styles, it shrinks everything down and then it distorts everything. So... Correct. I discovered... This is completely off topic, but I discovered recently that Wikipedia launched a... Yes, probably better for large screens. Wikipedia launched a Maximize View button at the bottom on the right here. You can toggle between a fixed width and a full width by clicking on this button. And right now on this, I present on a 1920 by 1080 resolution when I'm presenting workshops. So right now that view is no good, but when I switch back to... What's a 2560 by 1440, there's so much white space on the side and then I much prefer to have it maximized. So yeah, it's an interesting... I guess it's the first world problem. Okay, folks, thank you so much for joining me today. I hope that wasn't too much of an information dump. I will be reviewing and getting back to this topic in a future workshop. And as I say, maybe we'll do some other workshops around getting Composer installed, getting Node.js installed. We might do workshops, I might just do tutorials. We are going to get to a point as I progress through the sort of the functionality and things that I'm working on where being able to come to one of these workshops that I present will require you to have Composer and Node.js installed if you want to code along with me. So whichever way we do plan to set that content up, I do recommend consuming that content and trying to figure those things out. As much as I would love to not have to worry about dependency managers, it is the way that modern web development has moved. It does make life a lot easier. So I do recommend maybe make it your rest of the year resolution for the rest of 2023 for the next six months of 2023, make it a personal sort of goal to get Composer and Node.js and NPM just up and running on your local machine. You don't have to use them, but just get them up and running. I do highly recommend that because there are so many amazing tools and PHP tools and JavaScript tools and things that are out there that are available to you if you have these pieces of software installed. Rita says, may I see your package to JSON file? Sure. I'll actually copy it into the chat for you. This is what the final one looks like. There we go. I'll pop that in the chat, no problem there. Okay. Next week Thursday, I will not be presenting a workshop. As I mentioned earlier, I will be at WordCamp Europe. So I will not see you all next week. And the week after that, I will have been traveling back from WordCamp Europe. So I'm probably planning a way less code heavy session. I was thinking of doing a, because we've just celebrated the 20th anniversary of WordPress, I was thinking of doing a WordPress quiz for fun. So if you're interested in that, do join me. We'll have 20 questions celebrating 20 years of WordPress and I'll try and figure out how we can do prizes. I don't know how we're gonna do that. I hosted a quiz at my local meetup recently and we had some WordPress swag that we could give away, but I don't know how I can give away swag in an online workshop. So we'll figure that out. For those of you are going to Athens, please do come and find me. I obviously don't know all of you because I'm just presenting and I'm just seeing names, but please do come and find me and tell me, hey, I'm Natalia and I joined one of your workshops or I am whoever and I joined one of your workshops. I would love to connect with as many people as possible. I do talk fast. Some of you have probably noticed I'm getting sped up now because I'm very excited about Red Camp Europe. So slow me down, but yes, I would love to meet as many people as I can while I'm there. Laura, again, thank you for this. One of the other things about next Thursday is Contributor's Day at WordPress. So especially those people in Europe because it's 3 a.m. my time. So if anybody in Europe in that time zone, Africa could join in, you can join virtually too, even if you're not part of being at WordPress. Absolutely, thank you, Laura, for reminding me about that. Yes, so we will be, next week Thursday is Contributor's Day at Red Camp Europe and you can join remotely, join the training team or any other team and come and help us build WordPress. Thank you, Laura, for reminding me about that. And thank you, Laura, for co-hosting today. It's been lovely. I've seen Laura in some workshops in the past. It's lovely to finally meet you in person. Thank you, everybody, for joining me. I hope you have a great Thursday and enjoy the rest of your week and your weekend. Bye-bye. Bye, everyone.