Presentation begins today at 3 PM PT

Download sample plugins referenced during the presentation.

<?php
/**
 * Plugin Name: Portfolio Custom Post Type
 * Description: A custom post type for an additional portfolio blog
 * Author: Joseph Dickson
 * Author URI: https://joseph-dickson.com
 * Version: 1.0
 * License: GPL2
 */

// Prevent direct access to this file
if ( ! defined( 'ABSPATH' ) ) exit;

// defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

/**
 * Create a custom post type  
 * https://codex.wordpress.org/Function_Reference/register_post_type#Arguments
 */
function jd_portfolio_custom_post_type() {

$labels = array(
	'name'			=> 'Portfolio',
	'singular_name'		=> 'Portfolio',
	'menu_name'		=> 'Portfolio',
	'name_admin_bar'	=> 'Portfolio',
	'add_new'		=> 'Add a Portfolio Post',
	'add_new_item' 		=> 'Portfolio Post',
	'new_item'		=> 'Portfolio Post',
	'edit_item'		=> 'Edit Portfolio Post',
	'view_item'		=> 'View Portfolio Post',
	'all_items'		=> 'All Portfolio Posts',
	'search_items' 		=> 'Search Portfolio Posts',
	'parent_item_colon'	=> 'Parent Portfolio Posts:',
	'not_found'		=> 'No Portfolio Posts found.',
	'not_found_in_trash' 	=> 'No Portfolio Posts found in Trash.',
);

$args = array(
	'labels'	     	=> $labels,
	'public'		=> true,
	'publicly_queryable'	=> true,
	'show_ui'		=> true,
	'show_in_menu'		=> true,
	'menu_icon'		=> 'dashicons-format-gallery',
	'query_var'		=> true,
	'rewrite'		=> array( 'slug' => 'portfolio' ),
	'capability_type'	=> 'post',
	'has_archive'		=> true,
	'hierarchical'		=> false,
	'menu_position'		=> 21,
	'show_in_rest'		=> true,
	'supports'		=> array( 'title', 'editor', 'thumbnail' ),
);

register_post_type( 'portfolio', $args );
}

add_action( 'init', 'jd_portfolio_custom_post_type' );

// Flush rewrite rules when plugin is activated
function jd_portfolio_rewrite_flush() {
	jd_portfolio_custom_post_type();
	flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'jd_rewrite_flush' );
<?php
/**
 * Plugin Name: Services Custom Post Type
 * Description: A custom post type Services Pages 
 * Version: 1.0
 * License: GPL2
 */

// Prevent direct access to this file
if ( ! defined( 'ABSPATH' ) ) exit;

/**
 * Create a custom post type  
 * https://codex.wordpress.org/Function_Reference/register_post_type#Arguments
 */
function jd_services_custom_post_type() {

$labels = array(
	'name'			=> 'Services',
	'singular_name'		=> 'Services',
	'menu_name'		=> 'Services',
	'name_admin_bar'	=> 'Services',
	'add_new'		=> 'Add a Services Page',
	'add_new_item'		=> 'Services Page',
	'new_item'		=> 'Services Page',
	'edit_item'		=> 'Edit Services Page',
	'view_item'		=> 'View Services Page',
	'all_items'		=> 'All Services Pages',
	'search_items'		=> 'Search Services Pages',
	'parent_item_colon'	=> 'Parent Services Pages:',
	'not_found'		=> 'No Services Pages found.',
	'not_found_in_trash'	=> 'No Services Pages found in Trash.',
);

$args = array(
	'labels'		=> $labels,
	'public'		=> true,
	'publicly_queryable'	=> true,
	'show_ui'		=> true,
	'show_in_menu'		=> true,
	'menu_icon'		=> 'dashicons-media-document',
	'query_var'		=> true,
	'rewrite'		=> array( 'slug' => 'services' ),
	'capability_type'	=> 'page',
	'has_archive'		=> false,
	'hierarchical'		=> true,
	'menu_position'		=> 22,
	'show_in_rest'		=> true,
	'supports'		=> array( 'title', 'editor', 'thumbnail' ),
);

register_post_type( 'services', $args );
}

add_action( 'init', 'jd_services_custom_post_type' );

// Flush rewrite rules when plugin is activated
function jd_services_rewrite_flush() {
	jd_services_custom_post_type();
	flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'jd_rewrite_flush' );