Making DCB: Phase #1

Story time! Our flagship plugin is one that’s been on our minds for years. How did we go about making it a reality?

Find the right time

Based on our work with clients, it’s felt like this solution has been needed for a long time. A way for a client to manage multiple opt-ins across hundreds of posts effortlessly.

But accomplishing that was a task for someone else: ConvertPro, Thrive, OptinMonster, or even something a little more out-of-the-box like Ad Inserter + WP Forms. Something would work, if you had the time, technical skill, or money to afford it.

Block, though, have changed everything. They make it so much simpler to solve complex problems, they’re super accessible by the average user, and the standardization of them make maintaining them easier. So now the old solutions feel limited and bulky. The idea of paying for those by page view is just silly.

This old problem is starting to feel like something we can solve, given a little dedication. And when we receive a request from Matt Molen that a custom theme client have category-specific opt-ins… I’m like, “Today. We’re going to get this code going today.”

Outline the requirements

This part lived in my head for a long time, and then existed in a shorter form within our team’s “2023 Brain Dump” document for a few months. Below are snippets of the job we posted across two sites and interviewed half a dozen developers for:

All code will ideally:

  1. Follow WordPress standards
  2. Have all functions fully documented
  3. Be ready to configure with hooks and filters
  4. Separate PHP and HTML by using view folder + files
  5. Remain free of extraneous code additions, including JS or CSS
  6. Be ready for WP plugin library approval

The first block we want to make would add reusable-block-like functionality for conditionally-changing content based on post organization (category). This would allows users to display logical, dynamic content in posts automatically.

Project name: Category-Conditional Content

Components:

  • A custom post type with editor/block content: “Category-Conditional Content”
  • A custom field to set order of items in this CPT: “Priority”
  • A custom field to select categories to associate with the CPT: “Linked Categories”
  • A block with no settings

Logic:

  • CPT items don’t display on front-end and are not searchable
  • CPT listing (backend) is sorted by priority (low # to high)
  • Exclude plugin block from our own CPT
  • Plugin block outputs blocks from a single “Category-Conditional Content” item
  • The item that shows will pull based on the post’s categories, checking CCC items in order of priority and comparing each item’s selected categories (most common)
  • If no categories are selected in the CCC item, this item will match all posts (fallback)
  • Limit block to post types that are associated with categories

Example:

  • Let’s say we insert the CCC block into a post that has “dinner” and “snack” categories assigned. In the CCC CPT, we have:
    (1) an item set to priority #1 and it contains a paragraph that says “Get my free desserts cookbook! (link)” and is associated with the “desserts” and “sweet treats” categories.
    (2) an item set to priority #2 with a paragraph “Get more dinner ideas (link)” associated with the “dinner” category.
  • When viewing the original post, wherever the CCC block is inserted we’ll see content from the CCC CPT . Since the original post does not have the “desserts” or “sweet treats” categories the item with priority #1 won’t be shown. Instead, we’ll check priority #2, see that the post and the CPT share the “dinner” category, and then display the “Get more dinner ideas (link)” block.

I also included a list of features that I’d want added in the future, so it was clear where this plugin was headed, my general timeline (very flexible, but also ready to start immediately), and a general statement about how I wasn’t willing to work with anyone that couldn’t show they had lots of experience with blocks specifically. So, you know, that last part wasn’t the most friendly piece of my listing. 😇

Source a stellar team

I’m a developer. I live in code and performance and perfectionism and outsourcing is hard for me, because it’s an exercise in trust.

But hiring is something I’ve had a lot of experience with these days. In my opinion, finding the right person is 90% about past experience and 10% about communication. The team members I have appreciated the most are consistently able to demonstrate that they’ve experienced a very similar situation before and that they handled it in a way that aligns with my goals.

In this case, we hired a developer named Zafar through UpWork and he’s. been. amazing. His outreach included four example plugins built for blocks, one of them very well known and quite complex. His profile also contained projects all around plugins and, notably, some complex features. So I knew he’d have the technical knowledge.

Then his reviews sung praises like:

  • “Continues to provide support and guidance”
  • “he understands the client’s needs and is willing to adapt to them”
  • “asked questions that I didn’t know needed addressing”
  • “coming up with new ideas on how to make the job better without you even asking.”

I’m kind of obsessed with our choice. Zafar’s awesome.

Manage development

Keeping the project moving forward is a daily task. Zafar sends us progress updates daily and we need to respond in a timely manner to make sure we’re respecting his time. Even though we have pre-existing projects we’re also spending time on. Honestly, the first week or two of this project was basically working time and a half.

Updates usually look like a list of completed tasks, a series of questions, and a video of current functionality (since not all updates include actual code to review).

Here’s an example from the first update:

Hey Lauren,

Just wanted to provide you today’s update regarding the project. So Here’s what i’ve completed today:

1. Added a new CPT named “Conditional Content” (we can change the name later).
2. Added a custom field for priority and also a field that allows you to change priority within the editor.
3. Added a custom field for linked categories, and also added a field that allows you to select available categories from the website.
4. Displayed the priority on the CPT table.
5. Displayed the linked category on the CPT table and also linked them to their editable urls (thought it would make sense).
6. Implemented the logic to sort the CPT table from highest priority to the lowest priority.

I will now work on the actual SSR block (that renders content) from tomorrow (and hopefully finalise that as well). Meanwhile, I have some queries for you, Please respond when you get the chance:

1. What should we name the plugin and CPT so that it makes some more sense (or should it just be conditional content)?
2. Can you please explain me the following point: If no categories are selected in the CCC item, this item will match all posts (fallback)

I have also recorded and attached the demo video for the plugin. Please let me know if there’s anything you want to add.

Zafar’s about 9 hours ahead of us (Eastern) so most of our correspondence is done during my mornings and his evenings, meaning most days I only needed about 1-2 hours of work on my end to keep the project moving forward.

Most of the time my part involves thinking like a developer, but periodically I also review the code. So while I wouldn’t say it’s necessary to be a developer to commission a plugin, I will say that it’s been helpful for this project. It’s equally helpful to have someone who isn’t a developer doing testing with me, as they see the user interface completely differently from me. So each week I probably get another 2-4 hours of testing support from other team members.

Begin pre-marketing efforts

The most time-consuming part of this project, by far, has been preparing Small Plugins as a brand. I’m hoping future plugins won’t need nearly as much upfront time, because we’ll have the name, reputation, and experience to release them under. In this case, however, we had to organize everything from scratch:

  • Pick a brand name
  • Get the website up & running, including both the technical set-up and the outlining of content needs
  • Choose a sales platform and learn that from scratch, weighing different package options and price points during the configuration
  • Define processes for different marketing campaigns, sales funnels, and legal questions like returns
  • Create content, including tutorials, despite not really having a full/complete plugin to use for any examples
  • Draft emails for announcing the plugin, gathering feedback, and maybe creating partnerships for promoting it

Honestly, this part kind of turned my brain to mush as it was more challenging to keep everything straight/organized. And it’s really hard for me to not get caught up in making something “perfect” instead of just sharing it and asking for feedback.

Celebrate the small stuff

Without a single sale to speak of, and most feedback on our website consisting of statements that are 100% the opposite of what we’re trying to say… I’m so happy with the process so far and the plugin we’re developing.

It’s been challenging, but in a good way. I feel like I have the necessary experience to make this happen, to feel confident to move this project forward.

I sincerely think this plugin is going to make the lives of so many bloggers easier and I can’t wait for it to be out in the wild.