JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 9
  • Score
    100M100P100Q57837F
  • License MIT

Thin drizzle orm layer for wordpress.

Package Exports

    Readme

    @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, {
        
    });
    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