Enhance the power of your WordPress Custom Post Types Custom API endpoints, oEmbed customization & flush rewrite rules

I’ve been working on extending the WP Dispensary plugin and wanted to share some of the ways I’ve found to help boost the power of the Custom Post Types you create.

Custom Post Types are a great building block for turning WordPress into more than a piece of blogging software.

Going beyond the original Posts and Pages, you can now segment your content as much as you need, with relative ease.

I personally feel that WordPress wouldn’t be where it is today without the inclusion of Post Type’s in version 3.0.

This is my attempt to show how a few simple code snippets can push the boundaries of what’s possible with WordPress and Custom Post Types.

Plus, it’s a good way for me to keep the codes together in one place to reference in the futureĀ šŸ˜Ž

If you’re new to CPT’s and/or haven’t built a Custom Post Type yet, you can check out this article from TorqueĀ that breaks CPT’s down and gives you a variety of ways to create your own.

Read it?

Got your own already built?


Let’s look at what we can do now that we have our CPT built.

Note: This article assumes you have a basic understanding of developing for WordPress. Please leave a comment or reach out on Twitter if you need further clarification on any of the tips below.

1. Custom API endpoints

Since this plugin seems like a likely candidate for future app integration, I want to add in some custom API endpoints to allow for content handling in something like AngularJS or vue.js.

Giving your featured image an API endpoint

You can add a function like the one below, adding a filter to rest_prepare_$CPTNAME which will grab the url for the Custom Post Type’s post featured image.

In the example below, I want to add the featured image endpoint to my Flowers CPT, so it’sĀ rest_prepare_flowers.

 * Adding featured image URL's to Flowers Custom Post Type
 * @access public
 * @param object  $data
 * @param WP_Post $post    The WordPress post object.
 * @param null    $request Unused.
 * @return object The featured image data.
function flowers_featuredimage( $data, $post, $request ) {
    $_data = $data->data;
    $thumbnail_id = get_post_thumbnail_id( $post->ID );
    $thumbnail = wp_get_attachment_image_src( $thumbnail_id, 'full' );
    $_data['featured_image_url'] = $thumbnail[0];
    $data->data = $_data;
    return $data;
add_filter( 'rest_prepare_flowers', 'flowers_featuredimage', 10, 3 );

Adding API endpoints for custom post_tag taxonomies

With WPD I have a variety of custom taxonomies for the CPT’s I created, so I wanted to make sure that data is available via API endpoints too.

The code I use to accomplish this is below.

 * Add Flavor taxonomy for the Flowers Custom Post Type
function flowers_flavor( $data, $post, $request ) {
    $_data = $data->data;
    $_data['flavors'] = get_the_term_list( $post->ID, 'flavor', '', ' ', '' );
    $data->data = $_data;
    return $data;
add_filter( 'rest_prepare_flowers', 'flowers_flavor', 10, 3 );

Adding API endpoints for custom category taxonomies

The same set up can work for your custom category taxonomies too.

 * Add Category taxonomy for the Concentrates Custom Post Type
function concentrates_category( $data, $post, $request ) {
    $_data = $data->data;
    $_data['concentrates_category'] = get_the_term_list( $post->ID, 'concentrates_category', '', ' ', '' );
    $data->data = $_data;
    return $data;
add_filter( 'rest_prepare_concentrates', 'concentrates_category', 10, 3 );

Adding custom API endpoints for your metabox data

When you create custom post types, a lot of times you find yourself adding in custom metaboxes to suppor the data you need users to control through your Custom Post Type.

This data can have a custom API endpoint created by using the following code snippet.

The $productsizes array are the metabox information I needed for pricing in the WPD plugin so your set up may vary based on your metaboxes.

 * This adds the wpdispensary_prices metafields to the
 * API callback for flowers
 * @since    1.1.0
add_action( 'rest_api_init', 'slug_register_prices' );
 * Registering Prices
function slug_register_prices() {
    $productsizes = array( '_halfgram', '_gram', '_eighth', '_quarter', '_halfounce', '_ounce' );
    foreach ( $productsizes as $size ) {
            array( 'flowers' ),
                'get_callback'    => 'slug_get_prices',
                'update_callback' => null,
                'schema'          => null,
    } /** /foreach */
 * Get Prices
function slug_get_prices( $object, $field_name, $request ) {
    return get_post_meta( $object['id'], $field_name, true );

Once you have your custom post types, taxonomies and metaboxes API endpoints added, you can now allow developers to consume your API data and have more control over how the data gets displayed.

Custom API endpoints in action

You can look at an example of each of these endpoints being added into a live API by checking out the CannaBiz demo here.

2. oEmbed improvements

With WP Dispensary I wanted to customize the output of information through the Embeds so that the custom data I display within WPD’s single item view gets embedded as well.

The filter below will filter out the_excerpt and replace it with the_content, making sure any content you added into the output of the_content get’s displayed properly.

 * Returns the custom excerpt for oEmbeds.
 * @since 1.0
 * @param  string $output Default embed output.
 * @return string         Customize embed output.
add_filter( 'the_excerpt_embed', 'get_excerpt_embed' );
function get_excerpt_embed( $output ) {
    return the_content();
    return $output;
add_filter('embed_oembed_html', 'my_embed_oembed_html', 99, 4);
function my_embed_oembed_html($html, $url, $attr, $post_id) {
  return '<div id="wpd-oembed-wrap">' . $html . '</div>';

Note that on line 15 there is the wpd-oembed-wrap ID, which you can change to anything you’d like and then add custom CSS to the public output of your plugin.

 + * Register WP Dispensary's oEmbed stylesheet
 + */
 +function wpd_oembed_styles() {
 +    wp_register_style( 'wpd-oembed', plugin_dir_url( __FILE__ ) . 'css/wp-dispensary-oembed.css', false, $this-version );
 +    wp_enqueue_style( 'wpd-oembed' );
 +add_action( 'enqueue_embed_scripts', 'wpd_oembed_styles' );

See how I handle adding this in with WP Dispensary here.

Below is an example of how the WP Dispensary items get displayed through oEmbed now.


3. Flush rewrite rules during your plugin’s activation

One thing that I looked over when building the earlier versions of the WPD plugin was flush_rewrite_rules.

If I’m being completely honest, at the time I didn’t even know it existed, so I was telling people in a FAQ page how to manually go in and resave their permalinks settings.

We live and learn, right?Ā šŸ˜‚

Thankfully, WordPress does have a page in the codex on flush rewrite rules to look through.

With the code below, I am able to take the Custom Post Type function and add it to the activation hook within the WPD plugin.

I also do the same for the custom tag and category taxonomies for each menu type.

class WP_Dispensary_Activator {
     * Short Description. (use period)
     * Long Description.
     * @since  1.0.0
     * @access public
     * @global $wp_rewrite
     * @return void
    public static function activate() {
         * Custom Post Types
         * Taxonomies
         * Custom Categories
         * Flush Rewrite Rules
         global $wp_rewrite;

Now any time someone activates your plugin, your custom post types and taxonomies will flush and work with your current permalink settings.

Additional resources

Now that we’ve gone over a few ways to enhance your CPT’s, it’s time to dig even further and see what else you can do to make your plugins better.

Here’s some links to other content that you can check out, written by people much smarter than I amĀ šŸ‘

Top Dispensary WordPress Plugins 2017 The WordPress plugins that cannabis businesses should get familiar with

Within the last few months we’ve seen medical and recreational marijuana laws pass in 8 out of 9Ā states.

This means there is going to be an influx of websites being built for new businesses with WordPress in the upcoming years. Continue readingTop Dispensary WordPress Plugins 2017 The WordPress plugins that cannabis businesses should get familiar with

CannaBiz WP Dispensary's commercial WordPress theme for dispensary & delivery services

After building the WP Dispensary plugin and and add-on’s like MMJMenu Sync, WooCommerce Connect, Inventory Management, & LocationsĀ it was time to work on a top shelf theme that brings the entire package together.

Last Friday over at WP Dispensary, I released CannaBiz, a commercial WordPress theme for businesses in the cannabis industry. Continue readingCannaBiz WP Dispensary’s commercial WordPress theme for dispensary & delivery services

Recent project updates Breaking down the projects I've been actively working on these last few months

Since late last year I’ve been hard at work on various development projects. While I’ve spent time blogging about each of them here, I haven’t updated the posts with new details about each of the projects.

This post is aiming to do that.

WP Dispensary

This has been my biggest focus the last couple of months. What started in November of last year has quickly turned into a pet project with the potential of growing into a full fledged business.

Since I first blogged about WP Dispensary here, I’ve released two new versions (1.2 and 1.3 respectively).

I’ve also open sourced the Dispensary Display theme that was built and originally for sale through the WP Dispensary website. Updates are coming to this theme in the next week or two, enhancing it further. Continue readingRecent project updates Breaking down the projects I’ve been actively working on these last few months