Custom post type and meta fields

3,539 views

Published on

Published in: Technology
4 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
3,539
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
80
Comments
4
Likes
3
Embeds 0
No embeds

No notes for slide

Custom post type and meta fields

  1. 1. Custom Posts and Meta Boxes
  2. 2. About Me Md. Liton Arefin Senior Developer JoomShaper
  3. 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. 4. Custom Post Types • Post • Page • Attachment • Revision • Navigation
  5. 5. Where Post Type Locates? • Post type stored in “wp_posts” database table
  6. 6. 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)
  7. 7. 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
  8. 8. Example
  9. 9. Example
  10. 10. What we need to create a Portfolio?
  11. 11. What we need to create a Portfolio? • Title • Custom Field (Website Address) • Content • Thumbnail Image • Taxonomy Category/Tags
  12. 12. 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 ) ?>
  13. 13. 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' ); );
  14. 14. $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 );
  15. 15. Output Of register_post_type()
  16. 16. 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' );
  17. 17. 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__) . '" />'; }
  18. 18. 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
  19. 19. Manage Custom Post Columns
  20. 20. 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'); }}
  21. 21. 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
  22. 22. 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
  23. 23. 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();?>
  24. 24. 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();?>
  25. 25. 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();?>
  26. 26. 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.
  27. 27. 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’);
  28. 28. You should use For secondary query like sidebar widget posts use WP_Query or get_posts()
  29. 29. 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/
  30. 30. Thanks
  31. 31. Question ???

×