Full Page Patterns Are Still the Missing Piece of Block WordPress Theme Development

It was the early days of the Gutenberg project. Many on the Theme Review Team and those in design circles were trying to wrap their heads around this new concept called blocks. In particular, we wanted to know how it could be applied to theme development. There were many discussions on the pros and cons of the early editor. Overall, there was a bit of cautious excitement in the air, our optimism tempered by a buggy version of alpha-level software.

The block system could potentially solve one of the biggest hurdles of theme development: inserting default/demo content for a full page into the editor.

I cannot remember who initially explained the idea, but it was a lightbulb moment for many at the time. The general concept was pre-building a custom homepage or any page design that users could choose visually. It would all be done through a standardized block system, and we would no longer need to rely on piecemeal theme options, third-party plugins, or attempt to work around the review team’s “do not create content” guideline.

No one really knew how this would work in practice, but we understood the theory of how it would make the life of a theme developer much simpler.

In October 2019, Automattic developer Jorge Bernal opened a ticket titled Starter Page Templates. His team was working on a template selector for mobile apps, and the WordPress.com Editing Toolkit already had the feature. The goal was to bring it to the core platform, allowing third-party theme designs to build on top of it.

Starter templates or page patterns selector for inserting full-page content into the WordPress editor.
Starter page templates idea initially shared in the ticket.

Because the term “template” is overused in the WordPress space, I will refer to these as “page patterns.” This naming convention was coined by Noah Allen, a software engineer for Automattic, in the ticket. It makes sense because we are actually talking about a page’s content rather than the wrapping template.

The Genesis Blocks plugin is one of the best ways to understand the page pattern concept. It has a Layouts button at the top of the editor that, when clicked, creates an overlay of designs to choose from.

Full-page layout inserter via the Genesis Blocks plugin in a modal overlay.
Selecting a full-page layout from Genesis Blocks.

These designs are split between sections and layouts. Sections are the same thing as patterns in core WordPress: small, reusable pieces of starter content. Layouts are full-page starting points for users to create various types of pages.

The StudioPress/Genesis team was not the first to market this concept. However, they have created a well-rounded user experience on top of the WordPress editor.

You will find similar experiences via GoDaddy’s onboarding process for its managed hosting service. The Redux Framework allows much the same, and Editor Plus offers templates and patterns from the Extendify library.

That initial excitement has waned a bit. It felt like that early promise was a dream that would never be a reality.

Theme authors, especially in the commercial space, have long offered home-brewed solutions for the one-click insertion of full-page content. Whether via a ThemeForest project or a popular theme on WordPress.org, there are endless examples of everyone solving the same problem. One might even argue that these custom inserters are so ingrained into theme agency systems that anything WordPress offers at this point will not appeal to those who have already brought their solutions to market. Where the core platform has failed to meet user demands, our development community has stepped up.

Some of you may be thinking that the current block patterns system works for this. Yes, and no. Theme authors could shoehorn full-page designs into it, but the user experience is lacking compared to third-party solutions. Patterns today are one of the best theming tools available, but they fall short of what is needed to see this thing through.

The foundation of this feature exists via the Patterns API. From the theme author’s perspective, they merely need a method for flagging a pattern as a full-page layout, separate from the others. However, the UI and UX flow need an overhaul. The flyout panel for the current inserter does not cut it, especially on large screens. A fullscreen overlay has become the de facto standard among other systems.

Users should also have another option between selecting from an existing page pattern or starting empty upon creation.

“I think this would be so useful to have in the core,” wrote Ana Segota of Anariel Design in a recent comment on the ticket. “I created 2 FSE themes so far and also our latest premium theme is made with block patterns and this is exactly what I thought and talked with few people about. It would be great when a user opens a new page, to chose design/page patterns however we called it and it starts editing it right away. Most of the users just want to add a page, choose a layout and start adding their content.”

Of course, this is not a revelation to the average theme author who works with end-users daily. Inserting or importing entire page designs into WordPress is one of the most common requests. WordPress is almost there with its current patterns system. We just need to take it to the next level.

Save Pen Dropdown

Just a quick note on this Pen Editor UI/UX change. The Save button used to be only that. You click it, the Pen saves. It’s only other job is a little line on the top of it to let you know when the Pen has unsaved changes. We’ve updated it to have a little dropdown menu to give you easier access to a variety of other functions relevant to any Pen:

If you ask me, Format Code on Save is under-utilized (as it’s not a default), and it’s such a pleasure to use. I’m sure most of y’all have autoformatting going on in your local editor using something like Prettier, which is exactly what we use. Give it a try!

The post Save Pen Dropdown appeared first on CodePen Blog.

Insert a table to mysql from access data base using vb.net

I found this peaice of code to import a Access database table to sql server

Private Sub btnImport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImport.Click

    Dim fileName As String = ""

    Dim ofd As New OpenFileDialog
    If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
        fileName = ofd.FileName
        PerformImportToSql(fileName)
    End If
End Sub

Private Sub PerformImportToSql(ByVal Filename As String)
    Dim table As DataTable = New DataTable
    Dim accConnection As New OleDb.OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0; DataSource=" & Filename & ";User Id=admin; Password=;")
    Dim sqlConnection As New SqlClient.SqlConnection("Data Source=yourServer; Initial Catalog=yourDatabase; User Id=yourUsername; Password=yourPassword;")

    Try

        'Import the Access data
        accConnection.Open()

        Dim accDataAdapter = New OleDb.OleDbDataAdapter("SELECT * FROM <tablename>", accConnection)
        accDataAdapter.Fill(table)
        accConnection.Close()

        'Export to MS SQL
        sqlConnection.Open()
        Dim sqlDataAdapter As New SqlClient.SqlDataAdapter("SELECT * FROM <tablename>", sqlConnection)
        Dim sqlCommandBuilder As New SqlClient.SqlCommandBuilder(sqlDataAdapter)
        sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand()
        sqlDataAdapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand()
        sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand()
        sqlDataAdapter.Update(table)
        sqlConnection.Close()
    Catch ex As Exception
        If accConnection.State = ConnectionState.Open Then
            accConnection.Close()
        End If
        If sqlConnection.State = ConnectionState.Open Then
            sqlConnection.Close()
        End If
        MessageBox.Show("Import failed with error: " & Environment.NewLine & Environment.NewLine _
        & ex.ToString)
    End Try
End Sub

I want exactly the same thing but to mysql database. or can someone point me a diffrenet way to do this

Many Thanks

Plaid’s Collaboration With U.S. Bank Bolsters Secure Open Banking Initiative

Earlier this year, a collaboration was announced between Plaid and U.S. Bank, which was intended to leverage Plaid’s API-based financial infrastructure in the development of a new cross-platform integration that would provide increased transparency and simplicity for the companies’ customers that interact with third-party financial applications. This integration, which is accessible via U.S.

How To Build Resilient JavaScript UIs

Things on the web can break — the odds are stacked against us. Lots can go wrong: a network request fails, a third-party library breaks, a JavaScript feature is unsupported (assuming JavaScript is even available), a CDN goes down, a user behaves unexpectedly (they double-click a submit button), the list goes on.

Fortunately, we as engineers can avoid, or at least mitigate the impact of breakages in the web apps we build. This however requires a conscious effort and mindset shift towards thinking about unhappy scenarios just as much as happy ones.

The User Experience (UX) doesn’t need to be all or nothing — just what is usable. This premise, known as graceful degradation allows a system to continue working when parts of it are dysfunctional — much like an electric bike becomes a regular bike when its battery dies. If something fails only the functionality dependent on that should be impacted.

UIs should adapt to the functionality they can offer, whilst providing as much value to end-users as possible.

Why Be Resilient

Resilience is intrinsic to the web.

Browsers ignore invalid HTML tags and unsupported CSS properties. This liberal attitude is known as Postel’s Law, which is conveyed superbly by Jeremy Keith in Resilient Web Design:

“Even if there are errors in the HTML or CSS, the browser will still attempt to process the information, skipping over any pieces that it can’t parse.”

JavaScript is less forgiving. Resilience is extrinsic. We instruct JavaScript what to do if something unexpected happens. If an API request fails the onus falls on us to catch the error, and subsequently decide what to do. And that decision directly impacts users.

Resilience builds trust with users. A buggy experience reflects poorly on the brand. According to Kim and Mauborgne, convenience (availability, ease of consumption) is one of six characteristics associated with a successful brand, which makes graceful degradation synonymous with brand perception.

A robust and reliable UX is a signal of quality and trustworthiness, both of which feed into the brand. A user unable to perform a task because something is broken will naturally face disappointment they could associate with your brand.

Often system failures are chalked up as "corner cases" — things that rarely happen, however, the web has many corners. Different browsers running on different platforms and hardware, respecting our user preferences and browsing modes (Safari Reader/ assistive technologies), being served to geo-locations with varying latency and intermittency increase the likeness of something not working as intended.

Error Equality

Much like content on a webpage has hierarchy, failures — things going wrong — also follow a pecking order. Not all errors are equal, some are more important than others.

We can categorize errors by their impact. How does XYZ not working prevent a user from achieving their goal? The answer generally mirrors the content hierarchy.

For example, a dashboard overview of your bank account contains data of varying importance. The total value of your balance is more important than a notification prompting you to check in-app messages. MoSCoWs method of prioritization categorizes the former as a must-have, and the latter a nice to have.

If primary information is unavailable (i.e: network request fails) we should be transparent and let users know, usually via an error message. If secondary information is unavailable we can still provide the core (must have) experience whilst gracefully hiding the degraded component.

Knowing when to show an error message or not can be represented using a simple decision tree:

Categorization removes the 1-1 relationship between failures and error messages in the UI. Otherwise, we risk bombarding users and cluttering the UI with too many error messages. Guided by content hierarchy we can cherry-pick what failures are surfaced to the UI, and what happen unbeknownst to end-users.

Prevention is Better than Cure

Medicine has an adage that prevention is better than cure.

Applied to the context of building resilient UIs, preventing an error from happening in the first place is more desirable than needing to recover from one. The best type of error is one that doesn’t happen.

It’s safe to assume never to make assumptions, especially when consuming remote data, interacting with third-party libraries, or using newer language features. Outages or unplanned API changes alongside what browsers users choose or must use are outside of our control. Whilst we cannot stop breakages outside our control from occurring, we can protect ourselves against their (side) effects.

Taking a more defensive approach when writing code helps reduce programmer errors arising from making assumptions. Pessimism over optimism favours resilience. The code example below is too optimistic:

const debitCards = useDebitCards();

return (
  <ul>
    {debitCards.map(card => {
      <li>{card.lastFourDigits}</li>
    })}
  </ul>
);

It assumes that debit cards exist, the endpoint returns an Array, the array contains objects, and each object has a property named lastFourDigits. The current implementation forces end-users to test our assumptions. It would be safer, and more user friendly if these assumptions were embedded in the code:

const debitCards = useDebitCards();

if (Array.isArray(debitCards) && debitCards.length) {
  return (
    <ul>
      {debitCards.map(card => {
        if (card.lastFourDigits) {
          return <li>{card.lastFourDigits}</li>
        }
      })}
    </ul>
  );
}

return "Something else";

Using a third-party method without first checking the method is available is equally optimistic:

stripe.handleCardPayment(/* ... */);

The code snippet above assumes that the stripe object exists, it has a property named handleCardPayment, and that said property is a function. It would be safer, and therefore more defensive if these assumptions were verified by us beforehand:

if (
  typeof stripe === 'object' && 
  typeof stripe.handleCardPayment === 'function'
) {
  stripe.handleCardPayment(/* ... */);
}

Both examples check something is available before using it. Those familiar with feature detection may recognize this pattern:

if (navigator.clipboard) {
  /* ... */
}

Simply asking the browser whether it supports the Clipboard API before attempting to cut, copy or paste is a simple yet effective example of resilience. The UI can adapt ahead of time by hiding clipboard functionality from unsupported browsers, or from users yet to grant permission.

User browsing habits are another area living outside our control. Whilst we cannot dictate how our application is used, we can instill guardrails that prevent what we perceive as "misuse". Some people double-click buttons — a behavior mostly redundant on the web, however not a punishable offense.

Double-clicking a button that submits a form should not submit the form twice, especially for non-idempotent HTTP methods. During form submission, prevent subsequent submissions to mitigate any fallout from multiple requests being made.

Preventing form resubmission in JavaScript alongside using aria-disabled="true" is more usable and accessible than the disabled HTML attribute. Sandrina Pereira explains Making Disabled Buttons More Inclusive in great detail.

Responding to Errors

Not all errors are preventable via defensive programming. This means responding to an operational error (those occurring within correctly written programs) falls on us.

Responding to an error can be modelled using a decision tree. We can either recover, fallback or acknowledge the error:

When facing an error, the first question should be, “can we recover?” For example, does retrying a network request that failed for the first time succeed on subsequent attempts? Intermittent micro-services, unstable internet connections, or eventual consistency are all reasons to try again. Data fetching libraries such as SWR offer this functionality for free.

Risk appetite and surrounding context influence what HTTP methods you are comfortable retrying. At Nutmeg we retry failed reads (GET requests), but not writes (POST/ PUT/ PATCH/ DELETE). Multiple attempts to retrieve data (portfolio performance) is safer than mutating it (resubmitting a form).

The second question should be: If we cannot recover, can we provide a fallback? For example, if an online card payment fails can we offer an alternative means of payment such as via PayPal or Open Banking.

Fallbacks don’t always need to be so elaborate, they can be subtle. Copy containing text dependant on remote data can fallback to less specific text when the request fails:

The third and final question should be: If we cannot recover, or fallback how important is this failure (which relates to "Error Equality"). The UI should acknowledge primary errors by informing users something went wrong, whilst providing actionable prompts such as contacting customer support or linking to relevant support articles.

Observability

UIs adapting to something going wrong is not the end. There is another side to the same coin.

Engineers need visibility on the root cause behind a degraded experience. Even errors not surfaced to end-users (secondary errors) must propagate to engineers. Real-time error monitoring services such as Sentry or Rollbar are invaluable tools for modern-day web development.

Most error monitoring providers capture all unhandled exceptions automatically. Setup requires minimal engineering effort that quickly pays dividends for an improved healthy production environment and MTTA (mean time to acknowledge).

The real power comes when explicitly logging errors ourselves. Whilst this involves more upfront effort it allows us to enrich logged errors with more meaning and context — both of which aid troubleshooting. Where possible aim for error messages that are understandable to non-technical members of the team.

Extending the earlier Stripe example with an else branch is the perfect contender for explicit error logging:

if (
  typeof stripe === "object" &&
  typeof stripe.handleCardPayment === "function"
) {
  stripe.handleCardPayment(/* ... */);
} else {
  logger.capture(
    "[Payment] Card charge — Unable to fulfill card payment because stripe.handleCardPayment was unavailable"
  );
}

Note: This defensive style needn’t be bound to form submission (at the time of error), it can happen when a component first mounts (before the error) giving us and the UI more time to adapt.

Observability helps pinpoint weaknesses in code and areas that can be hardened. Once a weakness surfaces look at if/ how it can be hardened to prevent the same thing from happening again. Look at trends and risk areas such as third-party integrations to identify what could be wrapped in an operational feature flag (otherwise known as kill switches).

Users forewarned about something not working will be less frustrated than those without warning. Knowing about road works ahead of time helps manage expectations, allowing drivers to plan alternative routes. When dealing with an outage (hopefully discovered by monitoring and not reported by users) be transparent.

Retrospectives

It’s very tempting to gloss over errors.

However, they provide valuable learning opportunities for us and our current or future colleagues. Removing the stigma from the inevitability that things go wrong is crucial. In Black box thinking this is described as:

“In highly complex organizations, success can happen only when we confront our mistakes, learn from our own version of a black box, and create a climate where it’s safe to fail.”

Being analytical helps prevent or mitigate the same error from happening again. Much like black boxes in the aviation industry record incidents, we should document errors. At the very least documentation from prior incidents helps reduce the MTTR (mean time to repair) should the same error occur again.

Documentation often in the form of RCA (root cause analysis) reports should be honest, discoverable, and include: what the issue was, its impact, the technical details, how it was fixed, and actions that should follow the incident.

Closing Thoughts

Accepting the fragility of the web is a necessary step towards building resilient systems. A more reliable user experience is synonymous with happy customers. Being equipped for the worst (proactive) is better than putting out fires (reactive) from a business, customer, and developer standpoint (less bugs!).

Things to remember:

  • UIs should adapt to the functionality they can offer, whilst still providing value to users;
  • Always think what can wrong (never make assumptions);
  • Categorize errors based on their impact (not all errors are equal);
  • Preventing errors is better than responding to them (code defensively);
  • When facing an error, ask whether a recovery or fallback is available;
  • User facing error messages should provide actionable prompts;
  • Engineers must have visibility on errors (use error monitoring services);
  • Error messages for engineers/ colleagues should be meaningful and provide context;
  • Learn from errors to help our future selves and others.

How to Add Simple and Elegant Footnotes in Your WordPress Blog Posts

Do you want to add footnotes to your WordPress blog posts?

If you are writing an article that references research or contains a lot of complex information, then you may want to use footnotes in your content. These are little numbered marks in a text that provide additional context to a sentence or paragraph.

In this article, we will show you how to add simple and elegant footnotes to your WordPress blog posts, step by step.

Add footnotes in WordPress blog posts

Why Add Footnotes to Your WordPress Blog Posts?

If you run an educational blog, publish research, or cover news stories, then footnotes are a great way to give more context to your content. You can use them to add comments, highlight important facts, or insert citations to academic sources on your website.

A footnote typically appears as a small, superscript number within the main body of your text. The actual footnote content is then placed at the bottom of the page or appears as a tooltip to distinguish it from the main content.

Here is an example:

Example of a footnote in McKinsey's website

Besides providing clarity and transparency for your readers, footnotes can make your WordPress website look more professional and trustworthy. They show that you have done your research and have the sources to support your claims.

The WordPress.org editor now has a built-in footnote feature that you can easily use to insert additional context.

This guide will show you how to add WordPress footnotes to your blog posts or pages using two methods. One is with using the Footnotes block in the Gutenberg editor, and the other is with a plugin.

You can use the links below to jump to a specific method:

Method 1: Add WordPress Footnotes With the Gutenberg Editor

This method is best for people who want to use simple footnotes and don’t want to install a plugin for this purpose.

To use the WordPress Footnotes block, you will need to open the Gutenberg block editor for a new or existing post or page.

After that, just highlight a word in your content that you want to add the footnote to. In the block toolbar, click the dropdown arrow and select ‘Footnote.’

Adding a footnote to a text in the WordPress block editor

You will now be redirected to the bottom of the page, where the Footnotes block has been added automatically. Here, you can type in your extra information.

Additionally, you can customize the block’s color, typography, dimensions, and border using the settings in the right-hand panel.

Customizing the footnotes block in the WordPress block editor

Feel free to repeat this step to include as many footnotes as needed.

When you preview your WordPress site, there should be a footnote link to the sentence you highlighted earlier.

Example of the footnote made in WordPress

If you click on the hyperlink, it will bring you to the bottom of the page with the footnote.

Here, you can also click the hyperlinked arrow to go back to the section where the footnote is assigned.

An example of the footnote content at the bottom of the page, made using WordPress

While this method is fairly simple for beginners, it doesn’t offer tons of customization options. If you are looking for more ways to change the footnote appearance, then just continue to the next method.

Method 2: Add WordPress Footnotes With a Plugin

Another method of creating footnotes is to use the free Modern Footnotes plugin. Unlike the Footnotes block, it offers a lot more options to modify the footnote appearance.

For example, you can make the footnote appear as a tooltip, as well as extra information at the bottom of the page.

The first thing you will do is install the Modern Footnotes plugin. For more information about plugin installation, check out our guide on how to install a WordPress plugin.

Configuring the Modern Footnotes Plugin Settings

With the plugin installed, you can now go to Settings » Modern Footnotes. This is where you can configure the footnote settings to your preferences.

Let’s go through each setting one by one.

‘Desktop footnote behavior’ lets you select how the footnote should behave when the website is being viewed on a desktop computer.

You can make the footnote appear when a cursor hovers over the tooltip or when the user clicks on the tooltip. Alternatively, the footnote can expand below the footnoted text.

Selecting a Desktop footnote behavior using the Modern Footnotes plugin

Which one you choose is up to your preferences. That said, the footnote will expand below the text by default on mobile screens.

Besides that, you can also check the ‘Make footnote content appear in web browser’s native tooltip when hovering over footnote number’ box if needed. This means the footnote will appear in the browser’s tooltip rather than in the plugin’s when the cursor hovers over the text.

We recommend switching this setting off if you choose the tooltip option for the desktop footnote behavior. Otherwise, you will have two tooltips for the same footnote, which readers may find annoying.

Below, you can also choose to display the footnote list at the bottom of the posts. This way, the reader can see all of the additional information in one place.

You may also want to enable this feature when the blog post is syndicated through RSS feeds.

Modern Footnote plugin's footnote display settings

Scrolling down, you can opt to insert a heading for your footnote list and choose a heading tag for it. This helps separate the actual content of your blog post from the footnotes. You can write something like References, Footnotes, Citations, or Additional Information.

If you want to add some custom CSS to modify the footnote text, feel free to insert it in the ‘Modern Footnote Custom CSS’ box.

Last but not least, you can customize the Modern Footnotes shortcode if you don’t want to use the built-in version. Make sure to enter the shortcode without the brackets.

Once you are happy with the settings, just click ‘Save Changes.’

Saving changes in the Modern Footnotes plugin

Adding Footnotes Using the Modern Footnotes Plugin

Now that you’ve configured the Modern Footnotes settings, let’s insert some footnotes into your content. Go ahead and open the block editor for a new or existing post or page.

There are two ways to add a footnote. One is with a shortcode, which is what we recommend.

First, find the sentence you want to insert a footnote. Then, right next to that sentence, type in the following shortcode:

[mfn]Insert your footnote here[/mfn]

Make sure to replace the text between the brackets with your information.

We also suggest putting the shortcode within the same block as the sentence, right next to the text, without any space in between, just like in the example below. Otherwise, the footnote may look disconnected from the text.

An example of how to add a footnote shortcode using the Modern Footnotes plugin

The other method is to type your footnote text next to the sentence you want to add the footnote to. Make sure there’s no space between the footnote text and the sentence.

In the example below, we want to add a footnote containing an academic citation for the sentence that begins with ‘Studies suggest…’

Next, highlight the footnote and click the down-arrow button in the toolbar. After that, select ‘Add a Footnote.’

Clicking the Add a Footnote button from the Modern Footnotes plugin

The drawback with the second method is it can be hard to track which lines of text have been given a footnote and which ones haven’t when you are editing the content. That’s why we recommend the shortcode method.

When you preview the blog post, you will see that there is now a number next to the sentence. If you use the tooltip option, this is what the footnote will look like:

What the Modern Footnotes tooltip looks like

On the other hand, the footnote will appear below the text if you use the expandable formatting.

Here’s what it looks like when you click on the number:

What the expandable footnote formatting looks like using the Modern Footnotes plugin

Finally, if you choose to display all of the footnote content at the bottom of the post, you can scroll down to find everything there.

They should be somewhere above the comment section.

The footnote content at the bottom of the page, made with the Modern Footnotes plugin

Bonus Tip: Use WordPress Custom Fields to Add More Information to Your Content

Besides footnotes, another way to provide extra information in your WordPress posts and pages is by using custom fields.

WordPress custom fields are metadata used to insert additional information into a post or page. For example, if you run a blog with multiple authors, then you may want to display your contributors’ names on the blog post, not just your own.

If you are interested in custom fields, just check out our WordPress custom fields 101 guide.

We will show you how to add custom fields using the block editor and some plugins, including WPCode. This plugin offers a safe and easy way to add code snippets to your WordPress website, even if you are a beginner.

WPCode - Best WordPress Code Snippets Plugin

We hope this article has helped you learn how to add footnotes to your WordPress website. You may also want to take a look at our expert picks for the best WordPress typography plugins and our guide on how to show and hide text in WordPress posts with the toggle effect.

If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.

The post How to Add Simple and Elegant Footnotes in Your WordPress Blog Posts first appeared on WPBeginner.

Accounting Services Perth

Based in Australia, Accounting Services Perth is an organisation that provides accounting and tax-related services to boost the business scale of clients and make them financially independent. For further guidance, contact one of the best Accounting Services Perth or visit us online.

Glovo clone script

Launch your delivery business application with the Glovo clone setup model. Serve your customers on time with a well-designed Glovo clone script. The best way to boost your delivery business processes. Glovo clones design for the business by Trioangle

Website: https://www.trioangle.com/glovo-clone/
Mail:sales@trioangle.com
WhatsApp: 6379630152
Skype: Trioangle