Custom Posts and Meta Boxes
About Me
Md. Liton Arefin
Senior Developer
JoomShaper
What is Post Type?
WordPress can hold and display many different types of content. A
single item of such a content is generally called a post, post is also
a specific post type.
Custom Post Types
• Post
• Page
• Attachment
• Revision
• Navigation
Custom Post Types and Meta Fields
Where Post Type Locates?
• Post type stored in “wp_posts” database table
When Custom Post Type Needs?
• If you need to Develop websites like:
• www.youtube.com
• www.bbc.co.uk
Etc
• Most Used Custom Post Type and Meta
Fields
• Geo Theme (http://www.geotheme.com)
When Custom Post Type Needs?
When Websites Contains:
• Homepage Slider
• Callout Boxes
• Portfolio
• Gallery (Image, Video etc)
• Team/People/Staff
• Job Posting
• Products
• Pricing Table
• etc
Example
Example
What we need to create a Portfolio?
What we need to create a Portfolio?
• Title
• Custom Field (Website Address)
• Content
• Thumbnail Image
• Taxonomy Category/Tags
Register Custom Post Type
 register_post_type is called when you need to create or modify
a post_type. register_post_type should only be invoked
through the ‘init’ action.
Reference
http://codex.wordpress.org/Function_Reference/register_post_type
Reserved Post Types
• post
• page
• attactment
• revision
• nav_menu_item
<?php register_post_type( $post_type, $args ) ?>
Practical Example
function sp_portfolio() {
$labels = array( 'name' => _x( 'Portfolio', 'post type general name' ),
'singular_name' => _x( 'Portfolio', 'post type singular name' ),
'add_new' => _x( 'Add New', 'book' ),
'add_new_item' => __( 'Add New Portfolio' ),
'edit_item' => __( 'Edit Portfolio' ),
'new_item' => __( 'New Portfolio Items' ),
'all_items' => __( 'All Portfolio' ),
'view_item' => __( 'View Portfolio' ),
'search_items' => __( 'Search Portfolio' ),
'not_found' => __( 'No Portfolio Items found' ),
'not_found_in_trash' => __( 'No Portfolio Items found in the Trash' ),
'parent_item_colon' => '',
'menu_name' => 'SP Portfolio' );
);
$args = array( 'labels' => $labels,
'description' => 'Holds Portfolio specific data',
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'portfolio/%year%',
'with_front' => true),
'capability_type'=> 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail'),
'menu_icon' => plugins_url( 'images/icon1.png', __FILE__ ) // Icon Path
);
register_post_type( 'portfolio', $args );
Output Of register_post_type()
Register Taxonomy
Reference:
http://codex.wordpress.org/Function_Reference/register_taxonomy
<?php register_taxonomy( $taxonomy, $object_type, $args ); ?>
// Custom Portfolio Categories
$labels = array('name' => _x( 'Categories', 'taxonomy general name' ),
'singular_name' => _x( 'SP Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Types' ),
'all_items' => __( 'All Categories' ),
'parent_item' => __( 'Parent Category' ),
'parent_item_colon' => __( 'Parent Category:' ),
'edit_item' => __( 'Edit Category' ),
'update_item' => __( 'Update Category' ),
'add_new_item' => __( 'Add New Category' ),
'new_item_name' => __( 'New Category Name' ),
); // Custom taxonomy for Project Tags
register_taxonomy('sptag', array('portfolio'),
array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' =>true,
));
}
add_action( 'init', 'sp_portfolio' );
Custom Post Types and Meta Fields
Meta Box field for Custom Post Type
Reference:
http://codex.wordpress.org/Function_Reference/add_meta_box
<?php   add_meta_box( $id, $title, $callback, $post_type, $context, $priority, $callback_args ); ?>
add_action('admin_init','sp_portfolio_meta');
function sp_portfolio_meta() {
// add a meta box for WordPress 'project' type
add_meta_box('sp_portfolio', 'Portfolio URL', 'sp_portfolio_meta_setup', 'portfolio', 'side', 'low');         
// add a callback function to save any data a user enters in
add_action('save_post','sp_portfolio_meta_save');  
}
function sp_portfolio_meta_setup() {
global $post;
?>
<div class="portfolio_meta_control">
<p>
<input type="text" name="_url" value="<?php echo get_post_meta($post->ID,'_url',TRUE); ?>" style="width: 100%;" />
</p>
</div>
<?php
// create for validation
echo '<input type="hidden" name="sp_meta_nonce" value="' . wp_create_nonce(__FILE__) . '" />';
}
function sp_portfolio_meta_save($post_id) {
// check nonce
if (!isset($_POST['sp_meta_nonce']) || !wp_verify_nonce($_POST['sp_meta_nonce'], __FILE__))
{ return $post_id;
}
// check capabilities
if (portfolio' == $_POST[post_type']) {
if (!current_user_can('edit_post', $post_id)) {
return $post_id; } } elseif (!current_user_can('edit_page', $post_id)) {
return $post_id;
}
// exit on autosave
if (defined('DOING_AUTOSAVE') == DOING_AUTOSAVE) {
return $post_id;
}
if(isset($_POST['_url'])) {
update_post_meta($post_id, '_url', $_POST['_url']); } else {
delete_post_meta($post_id, '_url');
}
About Nonces:
http://codex.wordpress.org/Function_Reference/wp_create_nonce
Custom Post Types and Meta Fields
Manage Custom Post Columns
function sp_add_columns($cols) {
$cols['title'] = __('Portfolio Title');
$cols['thumbnail'] = __('Thumbnail');
$cols['description'] =__('Description');
$cols['_url'] =__('Portfolio URL');
$cols['sptag'] = __('Categories');
//Unset Default Date, Author etc
unset  ($cols['date'],
$cols['author']);
return $cols;
}
function sp_add_column_values($column_name, $post_id) {
$width = (int) 100; $height = (int) 100;
if ( 'thumbnail' == $column_name ) {
$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
// image from gallery
$attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'portfolio',
'post_mime_type' => 'image') );
if ($thumbnail_id)
$thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true ); elseif
($attachments) {
foreach ( $attachments as $attachment_id => $attachment ) {
$thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
}
} if ( isset($thumb) && $thumb ) {
echo $thumb;
} else {
echo __('None');
}}
elseif ('description' == $column_name) {
echo the_content();
} elseif ('_url' == $column_name) {
echo get_post_meta($post_id, '_url', true);
} elseif ('sptag' == $column_name) {
$terms = wp_get_post_terms(get_the_ID(), 'sptag' );
$t = array();
foreach($terms as $term) $t[] = $term->slug;
echo implode(', ', $t);
$t = array();
}
}
// For Portfolio Items
add_filter( 'manage_portfolio_posts_columns', 'sp_add_columns' );
add_action( 'manage_portfolio_posts_custom_column', 'sp_add_column_values', 10, 2 );
Reference:
http://codex.wordpress.org/Plugin_API/Filter_Reference/manage_$post_type_posts_columns
http://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column
http://codex.wordpress.org/Plugin_API/Filter_Reference/manage_edit-post_type_columns
http://justintadlock.com/archives/2011/06/27/custom-columns-for-custom-post-types
How to show Contents?
There are few options to retrieve custom posts
query_posts()
WP_Query()
get_posts()
Refefences:
http://codex.wordpress.org/Function_Reference/query_posts
http://codex.wordpress.org/Class_Reference/WP_Query
http://codex.wordpress.org/Template_Tags/get_posts
Query_posts()
<?php
/*
* Template Name: SP Portfolio
*/
get_header();
query_posts(array('post_type' => 'portfolio', 'posts_per_page' => -1));
?>
<div class=“container”>
<?php if(have_posts()){ while(have_posts()){ the_post(); ?>
<article class=“post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><?php the_title();?></h2>
<p><?php the_content();?></p>
<a href=“<?php echo get_post_meta($post->ID, '_url', true); ?>”></a>
</article>
<?php } }
// Reset Query
wp_reset_query();
?>
</div>
<?php get_footer();?>
WP_Query()
<?php
/*
* Template Name: SP Portfolio
*/
get_header();
$args = array('post_type' => 'portfolio', 'posts_per_page' => -1);
$query = new WP_Query( $args );
?>
<div class=“container”>
<?php if($query->have_posts()){ while($query->have_posts()){$query->the_post(); ?>
<article class=“post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><?php echo get_the_title();?></h2>
<p><?php echo get_the_content();?></p>
<a href=“<?php echo get_post_meta($post->ID, '_url', true); ?>”></a>
</article>
<?php } }
// Restore original Post Data
wp_reset_postdata();
?>
</div>
<?php get_footer();?>
get_posts()
<?php
/*
* Template Name: SP Portfolio
*/
get_header();
$args = array( 'posts_per_page' => 5, 'offset'=> 1, 'category' => 1 );
$query = get_posts( $args );
foreach ( $query as $post ) { setup_postdata( $post );
?>
<div class=“container”>
<article class=“post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </h2>
<p><?php the_content();?></p>
<a href=“<?php echo get_post_meta($post->ID, '_url', true); ?>”></a>
</article>
<?php
}
// Restore original Post Data
wp_reset_postdata();
?>
</div>
<?php get_footer();?>
Which one is best?
query_posts() : alter of main query. Post-related
global variables and template tags will be altered.
 WP_Query() : defined in wp-includes/query.php.
wp-blog-header.php gives $wp_query object
information. $is_* holds the informations.
get_posts() : returns array of posts. Direct access
to database using WP_Query()
get_posts() is best to use.
Page Template
function sp_template_redirect($template_path ) {
if ('portfolio' == $_POST['post_type']) {
$template_path = plugin_dir_path( __FILE__ ) . '/theme/page-portfolio.php';
}
return $template_path;
}
add_action(‘template_redirect’,’ sp_template_redirect’);
You should use
For secondary query like sidebar widget posts
use WP_Query or get_posts()
References
• http://generatewp.com/
• http://www.joomshaper.com/blog/wordpress/create-a-custom-post-type-in-wordpress
• http://www.joomshaper.com/blog/wordpress/add-meta-boxes-in-custom-post-type
• http://wp.smashingmagazine.com/2012/11/08/complete-guide-custom-post-types/
• http://wp.tutsplus.com/tutorials/plugins/a-guide-to-wordpress-custom-post-types-creation-
display-and-meta-boxes/
• http://wp.tutsplus.com/tutorials/creative-coding/custom-page-template-page-based-on-url-
rewrite/
• http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/
• http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-post-types-taxonomies/
Thanks
Question ???

More Related Content

PDF
Gail villanueva add muscle to your wordpress site
PPT
Propel sfugmd
PDF
Assetic (Zendcon)
PPTX
The Way to Theme Enlightenment 2017
PPTX
Quality code by design
PDF
Disregard Inputs, Acquire Zend_Form
KEY
Fields in Core: How to create a custom field
PDF
Apostrophe
Gail villanueva add muscle to your wordpress site
Propel sfugmd
Assetic (Zendcon)
The Way to Theme Enlightenment 2017
Quality code by design
Disregard Inputs, Acquire Zend_Form
Fields in Core: How to create a custom field
Apostrophe

What's hot (20)

PPT
Introduction to Zend_Pdf
DOCX
logic321
PDF
Custom content types &amp; custom taxonomies in wordpress
PPT
Introduction to ZendX jQuery
PDF
Building a Portfolio With Custom Post Types
PDF
Shortcodes In-Depth
PPTX
Wp meetup custom post types
PPTX
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
PPTX
Twitter bootstrap
PPT
JQuery Basics
PDF
You're Doing it Wrong - WordCamp Atlanta
PDF
Mobile themes, QR codes, and shortURLs
PDF
Make your own wp cli command in 10min
PPTX
Сергей Иващенко - Meet Magento Ukraine - Цены в Magento 2
PPTX
Let's write secure Drupal code! - Drupal Camp Poland 2019
PPTX
WordPress for developers - phpday 2011
TXT
Daily notes
PPTX
Let's write secure drupal code! - Drupal Camp Pannonia 2019
PPTX
Let's write secure Drupal code! DUG Belgium - 08/08/2019
PPT
Clever Joomla! Templating Tips and Tricks
Introduction to Zend_Pdf
logic321
Custom content types &amp; custom taxonomies in wordpress
Introduction to ZendX jQuery
Building a Portfolio With Custom Post Types
Shortcodes In-Depth
Wp meetup custom post types
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
Twitter bootstrap
JQuery Basics
You're Doing it Wrong - WordCamp Atlanta
Mobile themes, QR codes, and shortURLs
Make your own wp cli command in 10min
Сергей Иващенко - Meet Magento Ukraine - Цены в Magento 2
Let's write secure Drupal code! - Drupal Camp Poland 2019
WordPress for developers - phpday 2011
Daily notes
Let's write secure drupal code! - Drupal Camp Pannonia 2019
Let's write secure Drupal code! DUG Belgium - 08/08/2019
Clever Joomla! Templating Tips and Tricks
Ad

Viewers also liked (7)

PDF
WordPress and E-Commerce
PDF
WordPress Freelancing
DOCX
Computerand mother board parts and fungations
PPT
Custom Post Types and Taxonomies in WordPress
PDF
Categories, Tags, Custom Post Types! Oh My!
PDF
Entry-level PHP for WordPress
PDF
The Outcome Economy
WordPress and E-Commerce
WordPress Freelancing
Computerand mother board parts and fungations
Custom Post Types and Taxonomies in WordPress
Categories, Tags, Custom Post Types! Oh My!
Entry-level PHP for WordPress
The Outcome Economy
Ad

Similar to Custom Post Types and Meta Fields (20)

PDF
WordPress Custom Post Types
PDF
Custom Post Type - Create and Display
PPT
An Introduction to Custom Post Types
PDF
Stepping Into Custom Post Types
PDF
WordPress custom posts types for structured content
PPTX
Custom WordPress theme development
PPTX
Taming your content with custom post types and fields
KEY
WordPress 3 Custom Post Types
KEY
Custom post types - WordPress
PDF
Dig Deeper into WordPress - WD Meetup Cairo
PPTX
Wordpress custom-posttype
PPTX
WordCamp Kent 2019 - WP 101: Custom Post Type & Custom Fields
PPTX
WP 101 - Custom Fields & Post Types
PPTX
Beyond Posts & Pages - Structured Content in WordPress
PPTX
The Flexibility of WordPress
PDF
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
PPTX
The 3Cs of WordPress
PPTX
Understanding the ins and outs of word press metadata
PDF
Intro to Custom Post Types WPAZ July 2015
PPTX
Custom Post Types and Taxonomies
WordPress Custom Post Types
Custom Post Type - Create and Display
An Introduction to Custom Post Types
Stepping Into Custom Post Types
WordPress custom posts types for structured content
Custom WordPress theme development
Taming your content with custom post types and fields
WordPress 3 Custom Post Types
Custom post types - WordPress
Dig Deeper into WordPress - WD Meetup Cairo
Wordpress custom-posttype
WordCamp Kent 2019 - WP 101: Custom Post Type & Custom Fields
WP 101 - Custom Fields & Post Types
Beyond Posts & Pages - Structured Content in WordPress
The Flexibility of WordPress
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
The 3Cs of WordPress
Understanding the ins and outs of word press metadata
Intro to Custom Post Types WPAZ July 2015
Custom Post Types and Taxonomies

Recently uploaded (20)

PDF
Multiverse AI Review 2025: Access All TOP AI Model-Versions!
PDF
How Tridens DevSecOps Ensures Compliance, Security, and Agility
PPTX
WiFi Honeypot Detecscfddssdffsedfseztor.pptx
PDF
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
PDF
Visual explanation of Dijkstra's Algorithm using Python
PDF
Autodesk AutoCAD Crack Free Download 2025
PDF
Top 10 Software Development Trends to Watch in 2025 🚀.pdf
PPTX
assetexplorer- product-overview - presentation
PDF
CCleaner 6.39.11548 Crack 2025 License Key
PDF
MCP Security Tutorial - Beginner to Advanced
PDF
DuckDuckGo Private Browser Premium APK for Android Crack Latest 2025
PDF
The Dynamic Duo Transforming Financial Accounting Systems Through Modern Expe...
PDF
Types of Token_ From Utility to Security.pdf
PDF
Ableton Live Suite for MacOS Crack Full Download (Latest 2025)
PDF
DNT Brochure 2025 – ISV Solutions @ D365
PDF
Time Tracking Features That Teams and Organizations Actually Need
PPTX
Advanced SystemCare Ultimate Crack + Portable (2025)
PDF
Designing Intelligence for the Shop Floor.pdf
PPTX
Why Generative AI is the Future of Content, Code & Creativity?
PPTX
Trending Python Topics for Data Visualization in 2025
Multiverse AI Review 2025: Access All TOP AI Model-Versions!
How Tridens DevSecOps Ensures Compliance, Security, and Agility
WiFi Honeypot Detecscfddssdffsedfseztor.pptx
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
Visual explanation of Dijkstra's Algorithm using Python
Autodesk AutoCAD Crack Free Download 2025
Top 10 Software Development Trends to Watch in 2025 🚀.pdf
assetexplorer- product-overview - presentation
CCleaner 6.39.11548 Crack 2025 License Key
MCP Security Tutorial - Beginner to Advanced
DuckDuckGo Private Browser Premium APK for Android Crack Latest 2025
The Dynamic Duo Transforming Financial Accounting Systems Through Modern Expe...
Types of Token_ From Utility to Security.pdf
Ableton Live Suite for MacOS Crack Full Download (Latest 2025)
DNT Brochure 2025 – ISV Solutions @ D365
Time Tracking Features That Teams and Organizations Actually Need
Advanced SystemCare Ultimate Crack + Portable (2025)
Designing Intelligence for the Shop Floor.pdf
Why Generative AI is the Future of Content, Code & Creativity?
Trending Python Topics for Data Visualization in 2025

Custom Post Types and Meta Fields

  • 1. Custom Posts and Meta Boxes
  • 2. About Me Md. Liton Arefin Senior Developer JoomShaper
  • 3. What is Post Type? WordPress can hold and display many different types of content. A single item of such a content is generally called a post, post is also a specific post type.
  • 4. Custom Post Types • Post • Page • Attachment • Revision • Navigation
  • 6. Where Post Type Locates? • Post type stored in “wp_posts” database table
  • 7. When Custom Post Type Needs? • If you need to Develop websites like: • www.youtube.com • www.bbc.co.uk Etc • Most Used Custom Post Type and Meta Fields • Geo Theme (http://www.geotheme.com)
  • 8. When Custom Post Type Needs? When Websites Contains: • Homepage Slider • Callout Boxes • Portfolio • Gallery (Image, Video etc) • Team/People/Staff • Job Posting • Products • Pricing Table • etc
  • 11. What we need to create a Portfolio?
  • 12. What we need to create a Portfolio? • Title • Custom Field (Website Address) • Content • Thumbnail Image • Taxonomy Category/Tags
  • 13. Register Custom Post Type  register_post_type is called when you need to create or modify a post_type. register_post_type should only be invoked through the ‘init’ action. Reference http://codex.wordpress.org/Function_Reference/register_post_type Reserved Post Types • post • page • attactment • revision • nav_menu_item <?php register_post_type( $post_type, $args ) ?>
  • 14. Practical Example function sp_portfolio() { $labels = array( 'name' => _x( 'Portfolio', 'post type general name' ), 'singular_name' => _x( 'Portfolio', 'post type singular name' ), 'add_new' => _x( 'Add New', 'book' ), 'add_new_item' => __( 'Add New Portfolio' ), 'edit_item' => __( 'Edit Portfolio' ), 'new_item' => __( 'New Portfolio Items' ), 'all_items' => __( 'All Portfolio' ), 'view_item' => __( 'View Portfolio' ), 'search_items' => __( 'Search Portfolio' ), 'not_found' => __( 'No Portfolio Items found' ), 'not_found_in_trash' => __( 'No Portfolio Items found in the Trash' ), 'parent_item_colon' => '', 'menu_name' => 'SP Portfolio' ); );
  • 15. $args = array( 'labels' => $labels, 'description' => 'Holds Portfolio specific data', 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'portfolio/%year%', 'with_front' => true), 'capability_type'=> 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => 5, 'supports' => array( 'title', 'editor', 'thumbnail'), 'menu_icon' => plugins_url( 'images/icon1.png', __FILE__ ) // Icon Path ); register_post_type( 'portfolio', $args );
  • 17. Register Taxonomy Reference: http://codex.wordpress.org/Function_Reference/register_taxonomy <?php register_taxonomy( $taxonomy, $object_type, $args ); ?> // Custom Portfolio Categories $labels = array('name' => _x( 'Categories', 'taxonomy general name' ), 'singular_name' => _x( 'SP Category', 'taxonomy singular name' ), 'search_items' => __( 'Search Types' ), 'all_items' => __( 'All Categories' ), 'parent_item' => __( 'Parent Category' ), 'parent_item_colon' => __( 'Parent Category:' ), 'edit_item' => __( 'Edit Category' ), 'update_item' => __( 'Update Category' ), 'add_new_item' => __( 'Add New Category' ), 'new_item_name' => __( 'New Category Name' ), ); // Custom taxonomy for Project Tags register_taxonomy('sptag', array('portfolio'), array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'query_var' => true, 'rewrite' =>true, )); } add_action( 'init', 'sp_portfolio' );
  • 19. Meta Box field for Custom Post Type Reference: http://codex.wordpress.org/Function_Reference/add_meta_box <?php   add_meta_box( $id, $title, $callback, $post_type, $context, $priority, $callback_args ); ?> add_action('admin_init','sp_portfolio_meta'); function sp_portfolio_meta() { // add a meta box for WordPress 'project' type add_meta_box('sp_portfolio', 'Portfolio URL', 'sp_portfolio_meta_setup', 'portfolio', 'side', 'low');          // add a callback function to save any data a user enters in add_action('save_post','sp_portfolio_meta_save');   } function sp_portfolio_meta_setup() { global $post; ?> <div class="portfolio_meta_control"> <p> <input type="text" name="_url" value="<?php echo get_post_meta($post->ID,'_url',TRUE); ?>" style="width: 100%;" /> </p> </div> <?php // create for validation echo '<input type="hidden" name="sp_meta_nonce" value="' . wp_create_nonce(__FILE__) . '" />'; }
  • 20. function sp_portfolio_meta_save($post_id) { // check nonce if (!isset($_POST['sp_meta_nonce']) || !wp_verify_nonce($_POST['sp_meta_nonce'], __FILE__)) { return $post_id; } // check capabilities if (portfolio' == $_POST[post_type']) { if (!current_user_can('edit_post', $post_id)) { return $post_id; } } elseif (!current_user_can('edit_page', $post_id)) { return $post_id; } // exit on autosave if (defined('DOING_AUTOSAVE') == DOING_AUTOSAVE) { return $post_id; } if(isset($_POST['_url'])) { update_post_meta($post_id, '_url', $_POST['_url']); } else { delete_post_meta($post_id, '_url'); } About Nonces: http://codex.wordpress.org/Function_Reference/wp_create_nonce
  • 23. function sp_add_columns($cols) { $cols['title'] = __('Portfolio Title'); $cols['thumbnail'] = __('Thumbnail'); $cols['description'] =__('Description'); $cols['_url'] =__('Portfolio URL'); $cols['sptag'] = __('Categories'); //Unset Default Date, Author etc unset  ($cols['date'], $cols['author']); return $cols; } function sp_add_column_values($column_name, $post_id) { $width = (int) 100; $height = (int) 100; if ( 'thumbnail' == $column_name ) { $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true ); // image from gallery $attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'portfolio', 'post_mime_type' => 'image') ); if ($thumbnail_id) $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true ); elseif ($attachments) { foreach ( $attachments as $attachment_id => $attachment ) { $thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true ); } } if ( isset($thumb) && $thumb ) { echo $thumb; } else { echo __('None'); }}
  • 24. elseif ('description' == $column_name) { echo the_content(); } elseif ('_url' == $column_name) { echo get_post_meta($post_id, '_url', true); } elseif ('sptag' == $column_name) { $terms = wp_get_post_terms(get_the_ID(), 'sptag' ); $t = array(); foreach($terms as $term) $t[] = $term->slug; echo implode(', ', $t); $t = array(); } } // For Portfolio Items add_filter( 'manage_portfolio_posts_columns', 'sp_add_columns' ); add_action( 'manage_portfolio_posts_custom_column', 'sp_add_column_values', 10, 2 ); Reference: http://codex.wordpress.org/Plugin_API/Filter_Reference/manage_$post_type_posts_columns http://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column http://codex.wordpress.org/Plugin_API/Filter_Reference/manage_edit-post_type_columns http://justintadlock.com/archives/2011/06/27/custom-columns-for-custom-post-types
  • 25. How to show Contents? There are few options to retrieve custom posts query_posts() WP_Query() get_posts() Refefences: http://codex.wordpress.org/Function_Reference/query_posts http://codex.wordpress.org/Class_Reference/WP_Query http://codex.wordpress.org/Template_Tags/get_posts
  • 26. Query_posts() <?php /* * Template Name: SP Portfolio */ get_header(); query_posts(array('post_type' => 'portfolio', 'posts_per_page' => -1)); ?> <div class=“container”> <?php if(have_posts()){ while(have_posts()){ the_post(); ?> <article class=“post-<?php the_ID(); ?>" <?php post_class(); ?>> <h2><?php the_title();?></h2> <p><?php the_content();?></p> <a href=“<?php echo get_post_meta($post->ID, '_url', true); ?>”></a> </article> <?php } } // Reset Query wp_reset_query(); ?> </div> <?php get_footer();?>
  • 27. WP_Query() <?php /* * Template Name: SP Portfolio */ get_header(); $args = array('post_type' => 'portfolio', 'posts_per_page' => -1); $query = new WP_Query( $args ); ?> <div class=“container”> <?php if($query->have_posts()){ while($query->have_posts()){$query->the_post(); ?> <article class=“post-<?php the_ID(); ?>" <?php post_class(); ?>> <h2><?php echo get_the_title();?></h2> <p><?php echo get_the_content();?></p> <a href=“<?php echo get_post_meta($post->ID, '_url', true); ?>”></a> </article> <?php } } // Restore original Post Data wp_reset_postdata(); ?> </div> <?php get_footer();?>
  • 28. get_posts() <?php /* * Template Name: SP Portfolio */ get_header(); $args = array( 'posts_per_page' => 5, 'offset'=> 1, 'category' => 1 ); $query = get_posts( $args ); foreach ( $query as $post ) { setup_postdata( $post ); ?> <div class=“container”> <article class=“post-<?php the_ID(); ?>" <?php post_class(); ?>> <h2> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </h2> <p><?php the_content();?></p> <a href=“<?php echo get_post_meta($post->ID, '_url', true); ?>”></a> </article> <?php } // Restore original Post Data wp_reset_postdata(); ?> </div> <?php get_footer();?>
  • 29. Which one is best? query_posts() : alter of main query. Post-related global variables and template tags will be altered.  WP_Query() : defined in wp-includes/query.php. wp-blog-header.php gives $wp_query object information. $is_* holds the informations. get_posts() : returns array of posts. Direct access to database using WP_Query() get_posts() is best to use.
  • 30. Page Template function sp_template_redirect($template_path ) { if ('portfolio' == $_POST['post_type']) { $template_path = plugin_dir_path( __FILE__ ) . '/theme/page-portfolio.php'; } return $template_path; } add_action(‘template_redirect’,’ sp_template_redirect’);
  • 31. You should use For secondary query like sidebar widget posts use WP_Query or get_posts()
  • 32. References • http://generatewp.com/ • http://www.joomshaper.com/blog/wordpress/create-a-custom-post-type-in-wordpress • http://www.joomshaper.com/blog/wordpress/add-meta-boxes-in-custom-post-type • http://wp.smashingmagazine.com/2012/11/08/complete-guide-custom-post-types/ • http://wp.tutsplus.com/tutorials/plugins/a-guide-to-wordpress-custom-post-types-creation- display-and-meta-boxes/ • http://wp.tutsplus.com/tutorials/creative-coding/custom-page-template-page-based-on-url- rewrite/ • http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ • http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-post-types-taxonomies/