 So, euphemistically, I titled this in the summary as everything I learned about plug-in support I learned in an operating room. So, I'm a surgeon, and what I found is traditionally I find family members and other people not too dissimilar from your users who ask you questions at a time in their life when they are confused, vulnerable, scared, and they just have a million and a half questions and sometimes they don't even know what the questions are, but they know things aren't quite working right and they have issues about that. And so you have to kind of sit back and take a deep breath and listen to what they're saying and hopefully get them to a point where they can understand what's going on. Now, in the day job it's a little different because you have to convert the really technical into stuff that's not very technical because you get all sorts of people with all sorts of very involved issues and you kind of have to distill it sometimes. So, some of it was really easy. You know, I'd have somebody who came in a car crash and you'd go and talk to the family and the first thing I'd tell them is like, they're going to be fine. Okay? It might take a while, but they should be fine. Now, those were the easy conversations because you can lead with the good stuff. The bad stuff takes a little longer and it gets more detailed and you have to kind of figure out everything along the way. So, I wrote this plug-in. Get an updater. And it's not in the repo for reasons and that's fine. And so I don't really have any great way of judging how many people use it. Anybody here use it? All right. I've got one. What it does is it basically, if you have plugins that are outside the repository either on GitHub or Bitbucket or GitLab, it will allow them to update through the admin dashboard just like any plug-in in the repo does. Oh, you've got to move that a little bit. Other corner somewhere. That's how I'm kind of judging how much interest may be in it. Just to kind of give you a basis or just a breakdown, Gutenberg has about the same number of stars on it, though it got there a lot quicker than I did. And so what I can tell you about doing writing plugins and stuff, I wrote this because I needed it. It was something that I found useful and, you know what, if anybody else can find it useful, great. If anybody else can find it useful, great. Oh, by the way, hi everybody in the other area. I keep changing and iterating and doing all sorts of things with this and maybe that's good and maybe that's not so good because you can have issues and problems. One of the few things I've found is I really hate white-screening people. But you get to the point where it's like we talked about imposter syndrome and the last thing. It's like, oh my god, can I really pull this off? And the answer, you know, as a surgeon I will tell you one of the euphemisms we speak of is sometimes wrong, never in doubt. Because, you know, you're the captain of the ship in the operating room and people expect you to make decisions. Now, you make decisions, they're not always right, but you make them and you live with them and your patients live with them. I don't really have any sort of classic computer science education, at least nothing you would say is something like that. And so every time I get to the point where I'm about ready to release something, I probably leave it and develop Branch for a lot longer than it needs to be. Just because I'm worried about doing something to someone's sight. I mean, everybody else, you know, most people out here, you guys make a living doing this and, you know, I don't want to screw with that. I really don't want to interrupt it. That being said, you know, in a hospital, in an operating room, I've never had an imposter syndrome. It's like, you know, you get to the point where everybody has their own little niche and they know what they're doing and they know where they are. You know, you get to a place, you know that. Everybody is an expert in their own little area. And there are things that you will speak to with authority at the drop of a hat. And nobody will question you. Well, they may not question you just because you're speaking with authority and everybody kind of tends to look at that as you know what you're talking about. It's also helpful if you actually do. But when it comes to code, it's a lot different sometimes. So I always worry about those things. And so maybe it's a sense of caution, but I tend not to release it as often as I probably should. You know, there's a couple of changes and fixes and things that I've done. I mean, just recently I converted the small amount of JavaScript that I had into it from using jQuery to using vanilla JavaScript because there was one time when the jQuery library didn't load and trunk. And I'm like, wait, what happened to the way the settings page looks? It's like screwed up. And so it's, I don't know, JavaScript took me all day to Google out and figure out how to change things. But you know, you change them one thing at a time and eventually you figure it out. Google is your friend. I had a heavy dose of imposter syndrome hit recently in, actually it wasn't even trunk, it was in the .org repository. One of the things I have in the plug-in is that if your plug-in also resides in .org, it will preferentially take the .org versioning and update it against .org and not update it against GitHub or Bitbucketer, etc. And they recently changed the way the plug-ins API returned the value of is your plug-in in the repo. And it used to print out this nice long array back with all the data from your plug-in. And if it wasn't in the repo, it just gave you a null. And so I was checking against the null. And recently they fixed it and said, you know, this isn't very, this isn't what we should present, we should present an actual error. So they changed it to present an actual error. Well the problem is, I was testing against the null. And so because it had data that came back, or more specifically because the way I wrote the code, it wasn't returning a null variable or empty. It saw every single plug-in as being in .org. Consequently if it didn't live in .org, it wasn't going to get updated, including my updater. So all of a sudden thinking, oh my god, what am I going to do? And so I wrote a bunch of posts and I put an issue up on the page. And I said, okay, because of this issue, I need you to, everybody who's using it, I'm going to need you to update, you know, in one of these methods. And fortunately there are methods that would update it in place. It wasn't just download it and reinstall it and stuff like that. But I did something better. I got on Slack and I talked to Dion Hulse, who's the component maintainer for the Upgrader and installer. And I said, hey, you know, I know you changed this and I appreciate it and understand it, but it kind of broke one of my issues. And you know, even though my plug-in isn't on the repo, I do test against it. Wonderful. He backed out the changes and said, you know, I can just make a 1.2 version of the API. And so now everything works again. And I was really happy. So I don't know if anybody has been following 4.9.3 from WordPress. They had a very similar issue where all of a sudden automatic updating was not functioning. Now, fortunately it didn't really go out to that many. It didn't go to any other branches other than trunk and 4.9.3. And it showed up. I blame myself for it. Because it showed up my logs and I kept seeing this. I'm like, what's going on? Because always if you're testing, turn on all your debugging. Check your logs, see what your errors are, see where your errors are interacting with something else. Because there's lots of stuff you will see that the plug-in still works. You just don't, you know, you just won't see it. You won't see the PHP notices that are there. You won't see the, in this case, a PHP fatal error that showed up in my logs. And I say I take some blame for it because I saw like a week or so before the 4.9 release. And it just so happened that I'd mentioned it in Slack the day 4.9.3 went out. And it was like, oh my God, it was the response. And needless to say, they kind of mitigated it pretty quickly and worked with hosting companies to fix an update where necessary. But to anybody who hasn't updated from 4.9.3 to 4.9.4, do it now. I'll give you some time. But anyway, as I said, I kind of blame myself because it was the same sort of issue that I had run into the week before. And I kept sweating about, well, how am I going to get everybody back onto the right version where they're getting updates? I mean, after all, this is an updating plug-in. It's supposed to work that way. So always turn on your debugging. Always check with your debugging. Always check your logs. It's very, it's you, I've had users tell me they see this in the air and like I don't see it. Sometimes they're set up. Sometimes I don't see it. But it's always in there. Be nice. It's kind of the golden rule. Yes, sir. And? Okay, I'll just rest it on my chin. Why not? That works. Wow, I can hear it now. Be nice. As I started to say from the beginning in the intro, people are coming to you with issues. They're scared. They've got their product in this case. They've got their product, their plug-in, their theme that they need to put a fix out to somebody to their users. This is their business and their livelihood. And all of a sudden something's not working. And it used to work. And they don't understand why it's not working. And so you just got to be nice. And you kind of, you know, it says there, you know, treat everybody like you'd want to be treated. Who here has missed an airplane flight? You ever gone on the counter? You go to the connection thing, you know, where they reroute you and reschedule you in the terminal? I remember I missed an airplane flight. I was in Dallas. And like my own fault, you know, I just came back from a long trip. I plugged in, first time I got a decent Wi-Fi in like two weeks. So I started to do some stuff. And all of a sudden, wow, there's a gate change. There's not just a gate change. There's a terminal change. And I got down the tram going the wrong direction. Everybody been to Dallas airport before? Yeah. This will really screw you up. Because all of a sudden there's, you're not five minutes out. You're 25 minutes out. So I finally got to one of the ticket counters. And I'm just standing in line. And I'm on my way home, so it was okay. And I'm listening to these people just yell and scream and be irate with these agents. And, you know, the agents are, hey, this is our job. It's, you know, it's customer support, right? They're trained, be nice, be cordial, do what you can. But let's face it, we've all gotten support requests. And when people are pissy, you're not going to get to them right away. Because what do you need another dose of pissy for? And so I was listening to these people just yell and scream, like it was the airline's fault that they missed their flight. Maybe it was, maybe it wasn't. In this case, I knew it was my fault. So I get up to the counter. And I said, how can I help you get me home? Because, you know, that was all I was interested in. And, you know, it takes out a whole different demeanor when you start from the premise of being nice to somebody and not having to come at it from, you know, you're my enemy kind of thing, or you did this to me. They didn't do that to me. I did it to myself. You know, if you missed the flight, because the other flight was like, well, you know, they didn't do it to you. You're talking to this person here who's trying to help you out and trying to connect you and trying to get you to the next place. Tech support, same way. All sorts of questions. They're just trying to get you to the next place. Get you to your little happy spot where everything's done or works again. Or at least it works like it's supposed to. Be patient. I have to work on that. Because everybody's like, you know, you're in a rush. You're in a hurry. Nobody takes it. You know, you have to take time to respond. You have to take time to listen. And sometimes I have to ask questions and get back to people. And then I have to realize it's not a race. I mean, I can't tell you how many times someone reports an issue. I'll have to fix ten minutes later. Hey, can you tell me whether it works back on your end? Hour goes by. Day goes by. Week goes by. Okay. You know, I look at it as like, I finished it. Works on my end. I assume if it doesn't work on there, I'll hear something eventually. Sometimes they get back and, you know, life happens, right? They're busy. Something else takes precedence. And they'll either get back to me or, you know, if it's a month later, I'll just, you know, close out the tissue and say, let me know if it's not working. But it's just, everybody has different priorities. So their priority in sending you the ticket may not be the same as yours in fixing it, or after you've fixed it, getting a response back. This is a global community and it's amazing to me how many people you just can't interact with at the same time because, you know, they're asleep when you're awake and you're awake when they're asleep. So sometimes you get built in waiting. And so it's okay. The other thing I've learned is learn to say no. Learning to say no is a lot harder to say than saying yes. And saying yes can cause all sorts of problems sometimes. We all talk about scope creep. And sometimes people have great ideas. And sometimes it's just worth saying, you know, you can go on GitHub and fork this and add that issue and add that feature that you think is absolutely wonderful back. And oh, by the way, if you do it and get it working, hey, send me a PR so I can look at it. Because if it works out well and it is what I want, I'm happy to put it back in. I had something in here. Sometimes learning to say no. I had this one kid who was, you know, tragic accident, shot in the head, okay? Brain dead. Those are bad conversations. Big family. NRICU literally had to call the police three different times to have them come because they were unruly. At one point they asked me if I could do a brain transplant. And hey, you can't laugh. I mean, you know, they don't, you know, this goes into the people don't understand the technical issues. I mean, you know, Mary Shelley aside. They don't, they, and yeah, you think about these and you hear that in your initial thought is, wow, that's really silly. But you can't let them know that because they're hurting. I mean, all they know is something really bad's happened. And as for scope creeps, sometimes scope can change over time. Sometimes you will find that things are better. I mean, you know, the whole overriding.org that got me into that issue was both me trying to play nice and someone asked for it. And it was just, it seemed easy to create. And the method of creating it changed over time because, you know, I found a better way, but it was within scope again. Be open to other ways of doing things. One of the other plugins I write is a spits out CSS. And I can't tell you how many questions I've answered about, you know, you select two of these things and it's going to create CSS for each one. And you've got the same selectors except for there's one little class that's different. And so the last defined class is the one that's going to get hit. And so you can't do both of them. And that would be my pat response for years. And someone said, well, what if you just didn't define that class for that? Like, hey, let me give that a try. So it's in the develop branch. It hasn't been pushed yet. But it was right. I mean, things don't quite line up right, but you know, you can now, it's the category colors plugin for events calendar. And you can now set a different, you know, a different category that just has a background and a different category that just has a border. And if you have both those categories selected, wow, you get the border for one and the background for the other. Sometimes you don't understand anything. Ask for help. It's a big community. Everybody, everybody's more than willing to help you. You just have to kind of wait for it, because sometimes it'll be on their time. And sometimes it's not. There are certain features of the updater plugin that wouldn't have gotten developed if I hadn't had help. Being able to work with Bitbucket server, being able to upgrade against a webhook are all those issues. Recently, I've got someone who's doing a PR for GTA. Anybody have heard of GTA? It's another Git repository, something self-hosted. We're getting closer, so... The best thing you can do if you're doing support is build a community, because I don't do Facebook, I do Slack, I do Twitter. One of the greatest things is when your users are helping each other. I can't tell you how, you know, you get the great warm feelies. When, you know, I log into Slack three messages or five messages, and it's two users who are basically helping each other with the problem and fixing it. So I'll really need to do that. Pay it forward. Work with other plugins, other repositories. Now you're going to have to move it over somewhere else. These are all on WPTally. If you plug in a username, you'll get the list of everything there. They're listed as a contributor on. Did I write all these? No. Did I contribute all these? Yeah. You know, this one, I helped make it multi-site compatible. This one, probably a bunch you read. I seem to have inherited that. Again, didn't work in multi-site. If you wanted to use the beta tester in multi-site, you had to go to one of the branches and turn it on, essentially. Not, you couldn't do it through network install. Same thing with... I don't know. I think that was it right now. Oh, hide SEO bloat. Sorry, Yost. Also, didn't work under multi-site cleanly. But most of them, you contribute code. It's amazing how many people will download and use your code. It's more amazing that you get core updates and core things put in. Because then it's not just, you know, half a million people using your code and downloaded your code. It's, you know, 30% of the web. So, to summarize... You're on top of that. I like it. To summarize, you know, do your best to help people. Create documentation. I've told people, you know, it's amazing. You put up the wiki. You put 12, 15 pages up there with all sorts of examples and descriptions of why you need to do it. People still don't read it. You know, it's like, I have to ask for... To see what their repo is, to see where it is, to see, hey, you know, you need to add this header to make sure it actually works with the plugin. And, you know, some people just haven't added it yet. But since you can actually install a plugin without the header, they think it should just work with it. I haven't built that part yet. Support your... whoops. Support your code. You know, if you wanted to keep doing and keep living, you got to support it. Otherwise, you're just not going to happen. If you want people to contribute, make your code readable, document it well, always develop with debug true, and pay it forward. Contribute to everybody else. That's it for me. This is me. I blog very rarely here. That's me at work. My son took that for a class project, right? You can find all my stuff at A-fragment GitHub. Yep. Some of it's what customers are asking for. Some of it's... If I think it's a... If I've added a new feature, I'll buy a minor release. If it's just a patch, it's, you know, a patch release. If it's just fixing something. If it's... Oh, no, no. If I don't think that it belongs in the plug-in, I won't put it there. I literally... You can kind of tell when I do that, when I say, hey, you can fork the project over on GitHub and I'll give the URL to it and make it work however you want. You know, here, I'll give you a great starting point. Yeah, I'm a recovering trauma and acute care surgery. As I said, past over the dark side, I'm now in hospital administration. That's really weird. Any other questions? Did I lose anybody? No, you know, it's really funny. Every once in a while, I will get a... I've gotten a couple requests. Hey, can I hire you to fix this thing? You know, something with a CSS in the plug-in. You know, it's mostly a theme issue. And I put a bunch of hooks in to kind of fix it. Every once in a while, I'll just write their filter hook so that it works for them. If they tell me what it is. And one group said, can we hire you? And I'm like, honestly, you can't afford my hourly rate. And they're like, no, seriously. I'm like, no, seriously, that was my avatar for a while with the surgeon. And they think, oh, we just thought you were like a code surgeon. I'm like, no, no, real surgeon, blood guts, all that good stuff. And then I never heard back from them. And here I was, you know, I wrote the plug-in. I was ready to try and fix their problem for free. You know, may not have been on their time frame, but, you know, never heard back from them. No, I, you know, I like it. I enjoy it. That's why most of my, you know, almost all my stuff is open source and free and whatnot, at least to this point. I'm sorry, sir. No, I'm not ready to quit my day job yet. I changed my day job, but I'm not ready to quit it quite yet. Any questions? Any questions from the alternate room? Yeah, I'm just kidding. I can't see you guys. Oh, thank you very much. Enjoy lunch, everybody.