Service — Custom plugins & integrations
Custom functionality, done the WordPress way.
When an off-the-shelf plugin doesn’t fit: purpose-built plugins, extensions to plugins that almost fit, and connections to CRMs, email platforms and third-party APIs.
What you can hand us
Code that belongs in a plugin.
- Custom plugins, post types, taxonomies and admin screens
- Extensions to WooCommerce and other plugins through their hooks, never by editing their files
- CRM and email platform integrations: HubSpot, Klaviyo, Mailchimp, MailerLite
- REST API connections and scheduled data syncs
- Memberships and gated content, including Memberful
- Troubleshooting conflicts, fatal errors and slow queries in existing code
From the code running this site
How we write it.
These excerpts are read live from the UpHive Core plugin that powers this website, so what you see is what runs.
Guard the form before you trust it
Every enquiry is checked for a valid nonce, a honeypot and a per-address rate limit before it is stored. Failed checks redirect quietly; a bot never learns which test it failed.
// Reject anything that didn't come from our own form.
if ( ! isset( $_POST['uphive_enquiry_nonce'] )
|| ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['uphive_enquiry_nonce'] ) ), 'uphive_enquiry' ) ) {
uhc_enquiry_redirect( 'expired' );
}
// Bots fill the hidden field; people never see it.
if ( ! empty( $_POST['uh_company_url'] ) ) {
uhc_enquiry_redirect( 'sent' );
}
// At most five accepted enquiries per hour from one address.
$ip_key = 'uphive_rl_' . md5( (string) ( $_SERVER['REMOTE_ADDR'] ?? '' ) );
$count = (int) get_transient( $ip_key );
if ( $count >= 5 ) {
uhc_enquiry_redirect( 'limit' );
}Change the query, not the template
The Work page shows every project in the editor’s chosen order by adjusting WordPress’s own query through pre_get_posts, with no second query and no effect on admin screens or the REST API.
// Front-end main query only: never touch admin lists, widgets or REST.
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_post_type_archive( 'uphive_project' ) || $query->is_tax( array( 'uphive_scope', 'uphive_platform' ) ) ) {
$query->set( 'posts_per_page', 60 );
$query->set( 'orderby', array( 'menu_order' => 'ASC', 'date' => 'DESC' ) );
}Principles
Three rules we don’t bend.
In a plugin, not the theme
Functionality survives the next redesign. The theme handles presentation; the plugin handles behaviour.
Core APIs first
Settings, REST, cron, metadata and capabilities all have WordPress APIs. We use them rather than reinventing them, so the code behaves the way the next developer expects.
Written for the next developer
WordPress coding standards, escaped output, nonces and capability checks, and documentation for whoever maintains it after us.
Related work
Projects with custom functionality.
Agency partnerships
Good projects deserve a dependable development partner.
Whether you need an extra pair of hands for a WordPress build, specialist WooCommerce support, or someone to look after the technical side of your client work, let’s find a way to work together.
- WordPress builds
- WooCommerce
- Extra development capacity
- Custom functionality
- Maintenance & support
- GoHighLevel implementation


