/wp

TypeScript WordPress wpdb orm

Primary LanguageTypeScript

@public-function/wp

A thin drizzle based orm layer for the WordPress database.

Why?

Because sometimes performance matters!

Most of the time it is totally fine to use the wp-rest api. But when performance matters you do not want to spin up a WordPress stack just to query some data in the database. Especially if you have direct access to the database in your node setup.

0.x !

Things will eventually change on the way to 1.0.

Breaking Changes:

  • 0.4.0 single argument constructor

Getting started

Install packages.

npm i @public-function/wp drizzle-orm mysql2 

Initialize the database connection.

import mysql from 'mysql2/promise';
import connect from '@public-function/wp';

const pool = mysql.createPool({
    host: process.env.HOST,
    user: process.env.DB_USER,
    database: process.env.DB_NAME,
    password: process.env.DB_PASSWORD,
});

const wp = connect({ 
    db:{ 
        client: pool, 
        prefix: "wp_" 
    }
});

Get typesafe results via drizzle schema objects.

const siteUrl = (
    await db
        .select()
        .from(wp.options)
        .where(eq(wp.options.name, "siteurl"))
)[0];

or even simpler with the wrapper function.

import {getOption} from '@public-function/wp';
const siteUrl = await getOption(wp, "siteurl");

All default wordpress tables are defined:

  • wp.options
  • wp.posts
  • wp.postMeta
  • wp.comments
  • wp.commentMeta
  • wp.users
  • wp.userMeta
  • wp.terms
  • wp.termMeta
  • wp.termTaxonomy
  • wp.termRelationships

Hydration

Use hydration functions to easily collect meta or term data.

Posts

import {
    hydratePostsWithMeta,
    hydratePostWithTerms,
    hydratePosts,
} from "@pubic-function/wp";
const posts = await wp.db.select().from(wp.posts);
const postsWithTerms = await hydratePostWithTerms(wp, posts);
const postsWithMeta = await hydratePostsWithMeta(wp, posts);
const postsWithTermsAndMeta = await hydratePosts(wp, posts);

Comments

import {hydrateCommentsWithMeta} from "@pubic-function/wp";
const comments = await wp.db.select().from(wp.comments);
const commentsWithMeta = await hydrateCommentsWithMeta(wp, comments);

Users

import {hydrateUsersWithMeta} from "@pubic-function/wp";
const users = await wp.db.select().from(wp.users);
const usersWithMeta = await hydrateUsersWithMeta(wp, users);

Terms

import {hydrateTermsWithMeta} from "@pubic-function/wp";
const terms = await wp.db.select().from(wp.terms);
const termsWithMeta = await hydrateTermsWithMeta(wp, terms);

Wrapper functions

There are some query functions for typical use cases like loading posts in a WP_Query like manner. All results are automatically hydrated with meta and term data.

WP_Query

import {queryPosts} from "@pubic-function/wp";

const posts = await queryPosts(wp, {
    
});

WP_Comment_Query

import {queryComments} from "@pubic-function/wp";

const comments = await queryComments(wp, {
    
});

WP_User_Query

import {queryUsers} from "@pubic-function/wp";

const users = await queryUsers(wp, {
    
});

WP_Taxonomy_Query

import {queryTerms} from "@pubic-function/wp";

const terms = await queryTerms(wp, {
    
});

Menu

import {getMenu} from "@pubic-function/wp";

const menu = await getMenu(wp, "menu-1");

Option

import {getOption} from '@public-function/wp';

const siteUrl = await getOption(wp, "siteurl");

Tests

Start the WordPress docker container:

docker compose up -d

Run tests:

npm run test