Upload
giwoolee
View
52
Download
0
Tags:
Embed Size (px)
Citation preview
WordPress Plugin 3May 21st 2015
changwoo
Recap
Hooks in Nutshell Hook is an event Plugin is hook-driven Task separation
o Changing cores workflow actiono Modifying contents filtero In fact action and filter are the same
Recap
Hooks in Nutshell Callback function utility You can define your own hooks There are many predefined hooks
Recap
Datbase Nutshell Parent-meta strategy
o Flexiblilityo Extendibleo But can experience some defects
Meta key meta valueo Hash-like storage
Recap
Database Nutshell Term taxonomy
o Term a wordo Taxonomy a classification of words
There are some pre-defined terms and taxonomieso category (hierarchical) post_tag (flat)
Recap
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Recap
Hooks in Nutshell Hook is an event Plugin is hook-driven Task separation
o Changing cores workflow actiono Modifying contents filtero In fact action and filter are the same
Recap
Hooks in Nutshell Callback function utility You can define your own hooks There are many predefined hooks
Recap
Datbase Nutshell Parent-meta strategy
o Flexiblilityo Extendibleo But can experience some defects
Meta key meta valueo Hash-like storage
Recap
Database Nutshell Term taxonomy
o Term a wordo Taxonomy a classification of words
There are some pre-defined terms and taxonomieso category (hierarchical) post_tag (flat)
Recap
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Recap
Hooks in Nutshell Callback function utility You can define your own hooks There are many predefined hooks
Recap
Datbase Nutshell Parent-meta strategy
o Flexiblilityo Extendibleo But can experience some defects
Meta key meta valueo Hash-like storage
Recap
Database Nutshell Term taxonomy
o Term a wordo Taxonomy a classification of words
There are some pre-defined terms and taxonomieso category (hierarchical) post_tag (flat)
Recap
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Recap
Datbase Nutshell Parent-meta strategy
o Flexiblilityo Extendibleo But can experience some defects
Meta key meta valueo Hash-like storage
Recap
Database Nutshell Term taxonomy
o Term a wordo Taxonomy a classification of words
There are some pre-defined terms and taxonomieso category (hierarchical) post_tag (flat)
Recap
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Recap
Database Nutshell Term taxonomy
o Term a wordo Taxonomy a classification of words
There are some pre-defined terms and taxonomieso category (hierarchical) post_tag (flat)
Recap
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Recap
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Todays Topics
1Entry Points in Plugina Menub Shortcodesc Admin Postd Ajaxe Redirectf activation deactivation uninstall
2Managing Your Own Contentsa All About Custom Posts
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Entry Points in Plugin
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Entry Points
Plugins run on the server sideServer only responds when it is requested
Requested moment rarr entry point
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Entry Points
Q When the server is requestedA It is when client access via a URL
Q Why a URL is usedA To define a resource output to clientA To receive data input from client
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Entry Points
Q Output FormA Whatever
Images audio video html documents
Q Input formA Generally submitting forms
via GETPOST method
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Entry Points
There are some special entry points left for plugins
Menu items Shortcodes Admin post AJAX Redirecting Activation deactivation uninstall
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Menu Items
Callback from admin menu clicking
add_menu_page()add_submenu_page()
remove_menu_page()remove_submenu_page()
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Where is default menu
wp-adminmenu-headerphp
ltul id=adminmenugtltphp_wp_menu_output( $menu $submenu )
function _wp_menu_output( $menu $submenu $submenu_as_parent = true )
here menus are printed in html
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Where is default menu
wp-adminmenuphp (adminphp includes it)wp-amdinincludesmenuphp
builds administrative menus
global $menu $submenu stores menu information
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Our custom menus
wp-adminincludesmenuphp
do_action( admin_menu )
Menu API are defined in wp-adminincludespluginphp
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
add_menu_page
function add_menu_page( $page_title $menu_title $capability $menu_slug $function = $icon_url = $position = null )
$new_menu = array( $menu_title $capability $menu_slug $page_title menu-top $icon_class $hookname $hookname $icon_url )
if ( null === $position ) $menu[] = $new_menuelse $menu[$position] = $new_menu
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
add_submenu_page
function add_submenu_page( $parent_slug $page_title $menu_title $capability $menu_slug $function = ) $submenu[$parent_slug][] = array ( $menu_title $capability $menu_slug $page_title )
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
derivatives
add_dashboard_page() add_posts_page() add_media_page() add_pages_page() add_comments_page() add_theme_page() add_plugins_page() add_users_page() add_management_page() add_options_page()
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Shortcodes
What is shortcodeA magic word in post content that is replaced by some process defined in plugin or themes in runtime
Good for displaying complex dynamic contents
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Shortcodes
Sample[gallery id=123 size=medium][gallery]
or
[caption]My Caption[caption] enclosed form
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Shortcodes
add_shortcode()
$shortcode_tags = array()function add_shortcode($tag $func) global $shortcode_tags
if ( is_callable($func) ) $shortcode_tags[$tag] = $func
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Shortcodes
function do_shortcode($content) global $shortcode_tags
if ( false === strpos( $content [ ) ) return $content
if (empty($shortcode_tags) || is_array($shortcode_tags)) return $content
$pattern = get_shortcode_regex() return preg_replace_callback( $patterns do_shortcode_tag $content )
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Shortcodes
function do_shortcode_tag( $m )
if ( isset( $m[5] ) ) enclosing tag - extra parameter return $m[1] call_user_func( $shortcode_tags[$tag] $attr $m[5] $tag ) $m[6] else self-closing tag return $m[1] call_user_func( $shortcode_tags[$tag] $attr null $tag ) $m[6]
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Shortcodes
callback params $attrs attributes $content enclosed tags text $tag shortcode tag itself
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Admin-post
Data from clientsProcessing requests
You can just process requests in your own page because $_REQUEST $_GET $_POST is global
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Admin-post
But in your own handlerYou cannot use WP core functionsYou cannot authenticate
Do not reinvent the wheelSo there is admin-postphp
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Admin-post
wp-adminadmin-postphpdefine amp include minimal settingsand do_action
$action = empty( $_REQUEST[action] ) $_REQUEST[action]
admin_post_nopriv admin_post_nopriv_$actionadmin_post admin_post_$action
finish using die() in callback function
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
AJAX
Very similar to admin-post but DOING_AJAX is defineddefine( DOING_AJAX true )
also use die() in callback function
if ( is_user_logged_in() ) do_action( wp_ajax_ $_REQUEST[action] ) else do_action( wp_ajax_nopriv_ $_REQUEST[action] ) Default statusdie( 0 )
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Redirect
You can generate custom page in plugin by using template_redirect action
function my_page_template_redirect() if( is_page( goodies ) ampamp is_user_logged_in() )
wp_redirect( home_url( signup ) ) exit()
add_action( template_redirect my_page_template_redirect )
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Redirect
You can generate web pages on-the-fly by utilizing these 3 hooks rewrite rule query parsing redirect
Detailed instructions later
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
(de)activation uninstall
register_activation_hook($file $cb)register_deactivation_hook($file $cb)register_uninstall_hook($file $cb)
$file full path of plugin file$cb callback function
callbacks should be SILENT No echo please
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Summary
menu items shortcodes admin post ajax template redirects and (de)activation- uninstall hooks are good initial entry pointso It is a good strategy to find these
hooks in plugins first and dissect their codes from those points
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
I know you want to do something
You understand hook conceptYou know database detail
Now you know entry points
Definitely you wanna make something
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Visit http[ip]practice and download entry-pointsphp
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
소스코드 http[ip]source-codes1 어드민 화면에 메뉴 추가2 쇼트코드 추가3 메뉴에서 admin post 전송4 메뉴에서 ajax 전송5redirect 테스트
ltauthorgt 부분은 자신의 이름으로 일괄변경하고 적절히 콜백 함수를 정의해 주세요
Source code explained
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
10 minutes break
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Managing Your Own Contents
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Wow there are too many things about posts
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
For today just focuse oncustom post type
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Arguments are too complex
Just use Types or Pods pluginThats all problem solved
Yeah
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
of course you might not want this I was just kidding
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Custom Post
You want to manage your own contentsThats why custom post is
Music collections Online store Event calendar Book data Photo portfolio
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Custom Post Motivation
Well with just one type post and you may define many categories and use them to organize all contents
JUST ONE TYPE POSTMANY CATEGORIES
portfolio calendar music db
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Custom Post Motivation
But you might feel that some post types should be hidden from some users even might be excluded from search may be only for private use may have very complex taxonomies
so that it should have its own territory
can be accessible from their own URL rules
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Custom Post Motivation
Why re-invent wheel again
By extending built-in post type systemyou can REUSE whole facilities related to posts easily
UI and all thing about managing
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Built-in Custom Post Types
wp-includespostphp (included in wp-settingsphp)function create_initial_post_types()
register_post_type( post array( register_post_type( page array( register_post_type( attachment array( register_post_type( revision array( register_post_type( nav_menu_item array( register_post_status( publish array(
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type
ltphp register_post_type( $post_type $args ) gt
$arg is very complex
But I think it should be explained in detail Actually you cannot avoid it because eventuall all post type plugins will use that function too
Those plugins also have diffcult UIs too
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type
Lets take a look how Types and Pods create their custom posts
They have easy (really) UI and provide better functionaliy but you can see horribly many options there
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $post_type
Up to 20 characters Only lowercase and numbers
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
publicvisible to authors
true impliesexclude_from_search falsepublicly_queryable show_in_nav_manues show_ui
false impliesexclude_from_search true publicly_queryable falseshow_in_nav_manues false show_ui false
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
labelplural descriptive name
egMusic CollectionsMostly localized text
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
labels more specific text labelsnamesigular_namemenu_namename_admin_barall_itemsadd_newadd_new_itemedit_itemview_itemsearch_items
search_itemsnot_foundnot_found in trashparent_item_colon
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
descriptionsummary of this post type
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
exclude_from_searchdo not search this post typetry S=beatbles
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
publicly_queryablecan use query
eg) post_type=music_collection
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
show_uidisplay default UI
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
show_in_nav_menusshow in navigation menus
be careful publicly_queryablemust be true
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
show_in_menushow admin_menu show_ui must be trueJust showing menutrue false else some strings
(toolsphp editphp)
altough it is falseyou can access URLS likewp-admineditphppost_type=music_collection(show_ui must be true)
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
show_in_admin_baravailable in admin bar
menu_postiondefault below comments
menu_iconsee dashicons
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
capability_typestring or array to build capabilites
in our exampeedit_music_collectionsedit_others_music_collections
publish_music_collectionsread_private_music_collections
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
capabilitiesto give specific names to each capability
map_meta_capif true default meta capability will be added
and then your role or account need capabilities
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
hierarchicalpost type can be hierarchicalthis is for page-styles
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
query_varto query posts query_var=slug
rewriteto use pretty permalinks
has_archiveEnables post type archive
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
register_post_type $args
permalink_epmaskrewrite endpoint bitmask
can_exporttrue makes the post can be exported
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Too exhaustive but worth it
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Practice Custom Post
Create custom-plugin-ltauthorgtphpCreate a simple custom post
Display admin menuHide admin_barWrite your post Any content is OK Include at least one meta field
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB
Next Week
Customizing Visual Components List Table Screen Widgets
WordPress System Undercover Constants and Globals WPDB