Thứ Ba, 22 tháng 3, 2011

WordPress – Custom Post Type

WordPress – Custom Post Type

* January 14, 2011
* 10 comments

Phiên bản 3.0 của wordpress đã ra đời khá lâu rồi. Nhưng một trong những tính năng mạnh mẽ của phiên bản này không phải ai cũng biết, đó là Custom Post Type. Với tính năng này, bạn có thể thoái mái sáng tạo những cách quản lý bài viết trên WP. Ví dụ đơn giản như tôi muốn quản lý 1 shop buôn bán thời trang nhỏ, hay 1 trang web môi giới nhà đất… Nhưng bằng những bài Post bình thường thì có thể làm được rồi. Tại sao phải dùng Custom Post Type?

Câu trả lời đơn giản là ai cũng muốn phân loại những bài viết 1 cách sạch sẽ nhất, không muốn 1 bài viết về cái áo hiệu ABC lại đi nằm chung chỗ với 1 bài viết thuộc blog, nó khó quản lý, và tìm 1 bài viết nào đó để sửa cũng hơi lâu. Thay vì đó ta có thể tạo ra những “cái chuồng” :| , để nhốt chúng lại.
1. Khai báo một Custom Post Type

Để đăng ký với WP 1 post type mới ta nên khai báo trong file functions.php với cấu trúc tương tự như sau:

/*Custom post type*/
add_action('init', 'create_product_post_type');
function create_product_post_type(){
register_post_type('product',
array(
'labels' => array(
'name' => __('Product'),
'singular_name' => __('Product'),
'add_new' => __('Add New'),
'add_new_item' => __('Add New Product'),
'edit' => __('Edit'),
'edit_item' => __('Edit Product'),
'new_item' => __('New Product'),
'view' => __('View Product'),
'view_item' => __('View Product'),
'search_items' => __('Search Products'),
'not_found' => __('No Products found'),
'not_found_in_trash' => __('No Products found in Trash')
),
'public' => true,
'show_ui' => true,
'publicy_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'menu_icon' => get_stylesheet_directory_uri(). '/images/product.png',
'hierarchical' => false,
'query_var' => true,
'supports' => array(
'title', 'editor', 'comments', 'author', 'excerpt', 'thumbnail',
'custom-fields'
),
'rewrite' => array('slug' => 'product', 'with_front' => false),
//'taxonomies' => array('post_tag', 'category'),
'can_export' => true,
//'register_meta_box_cb' => 'call_to_function_do_something',
'description' => __('Product description here.')
)
);
}

Dòng 2: Thông báo cho WP biết khi tạo trang admin thì sẽ chạy nội dung trong hàm ‘create_product_post_type’.

Dòng 4: Hàm ‘register_post_type’ nằm trong file wp-includes/post.php, tham số đầu là tên của post type, vd: product, tham số thứ 2 là một array. 1 điều lưu ý là tên của post type và custom taxonomy chúng ta nên viết ký tự thường.

Dòng 7-18 : Định nghĩa lại các label xuất hiện trong trang quản lý Products

Dòng 22: Cho phép query các Product bằng hàm query_posts().

Dòng 24: Chọn vị trí xuất hiện của mục quản lý Products. Vị trí 20 là vị trí sau mục quản lý Pages

Dòng 25: Địa chỉ icon(16×16)

Dòng 26: Có được phân cấp cha con hay không.

Dòng 27: Biến để dùng trong phương thức GET, vd: mặc nhiên là ?product=…

Dòng 28: Khai báo các meta box cho trang add new hay edit 1 product như: comments, author, custom-field, thumbnail …

Dòng 32: Rewrite lại url khi query.

Dòng 34: Có thể xuất nội dung ra file xml.

Dòng 36: Diễn giải
2. Thêm custom taxonomy vào Products

Tôi đã có 1 bài viết giới thiệu về Custom taxonomy ở địa chỉ http://www.izwebz.com/wordpress/wordprescustom-taxonomies/.Để đăng ký các custom taxonomy cho post type product, code có cấu trúc tương tự như sau:

add_action('init', 'create_product_taxonomies');
function create_product_taxonomies(){
register_taxonomy('brand', 'product', array(
'hierarchical' => true,
'labels' => array(
'name' => __('Brand'),
'singular_name' => __('Brand'),
'add_new' => __('Add New'),
'add_new_item' => __('Add New Brand'),
'new_item' => __('New Brand'),
'search_items' => __('Search Brands'),
),
));
register_taxonomy('size', 'product', array(
'hierarchical' => false,
'labels' => array(
'name' => __('Size'),
'singular_name' => __('Size'),
'add_new' => __('Add New'),
'add_new_item' => __('Add New Size'),
'new_item' => __('New Size'),
'search_items' => __('Search Sizes'),
),
));

register_taxonomy('price', 'product', array(
'hierarchical' => false,
'labels' => array(
'name' => __('Price'),
'singular_name' => __('Price'),
'add_new' => __('Add New'),
'add_new_item' => __('Add New Price'),
'new_item' => __('New Price'),
'search_items' => __('Search Prices'),
),
));
}

Dòng 3: Đăng ký 1 custom taxonomy tên là brand, và post type là product và có phân cấp.

Tương tự đăng ký thêm 2 taxonomy size và brand. Về cơ bản với 2 code ở trên ta đã có một custom post type theo ý mình. Hãy thử tạo product, query_posts(), hiển thị lên trang xem như thế nào? :D .
3. Hiển thị bài post

Với bài post mặc định thì khi được load WP sẽ dùng template file là single.php để hiển thị nội dung. Nhưng với custom post type thì ta phải khai báo một file có định dạng single-tên-custom-post-pype.php (vd: single-product.php với product là tên custom post type). Trong file này ta có thể xài vòng loop bình thường mà ai xài WP cũng thuộc lòng :D

if (have_posts()){
while (have_posts()){
the_post();
//xuất nội dung của post ở đây.
}
}else{
echo "No posts found";
}

Từ dòng 4 trở đi thì ta có thể xài các template tag mặc định của WP để kéo nội dung của custom post type ra.
4. Trình bày danh sách dạng archive.php

Phiên bản hiện tại của WP là 3.0.3, với phiên bản này thì WP không hỗ trợ archive cho custom post type. Theo lời giới thiệu của một số developer đang làm core của WP thì phiên bản 3.1 mới có hỗ trợ chức năng này. Tuy nhiên hiện tại thì có 2 plugins hỗ trợ ta làm việc này. Một trong số chúng mà tôi thấy dễ xài là Simple Custom Post Type Archives, sau khi kích hoạt plugin này thì ta phải tạo file dạng: type-tên-custom-post-type.php (vd: type-product.php) và lưu ở thư mục theme.

Nội dung file ta có thể sử dụng vòng loop để hiển thị danh sách các bài post bình thường như file archive.php
5. query_posts với custom post type

Đoạn code sau sẽ thực hiện truy vấn những bài post thuộc post type là product, có title hoặc content chứa chữ izwebz, và số post hiển thị là 10

//function dùng để filter
function filter_where($where = '') {
//post_title, post_content like '%izwebz%'
$text = 'izwebz';
$where .= " AND (post_title like '%$text%' OR post_content like '%$text%')";
return $where;
}
// đăng ký filter với WP
add_filter('posts_where', 'filter_where');
$paged = (get_query_var('paged')) ? get_query_var('paged') : 0;
$args = array('post_type' => 'product', 'paged' => $paged,'showposts' => 10 );
query_posts($args);
if(have_posts()){
while(have_posts()){
the_post();
//xuất nội dung ở đây
}
}else{
echo "No products found";
}
//nhớ reset query sau khi xai query_posts()
wp_reset_query();

Dòng 9: Đăng ký filter với WP. Đây là 1 kỹ thuật hook cực hay của WP. Nếu sau bài viết này chưa có ai giới thiệu về hook thì tôi xin tình nguyện giới thiệu chúng trong bài tiếp theo \:D/.
5. Lời kết

Custom post type đã mở ra cho người lập trình hướng WP một lối xây dựng cách quản lý bài viết rất riêng, không phụ thuộc quá vào cách quản lý Posts bình thường. Nếu có thắc mắc về bài viết thì mọi người hãy để lại comment để cộng đồng izwebz giúp đỡ. Hy vọng bài viết mang lại chút kiến thức mới cho mọi người. Cảm ơn đã đọc bài viết :|

Các bác có thể tham khảo API WP ở đây:

http://codex.wordpress.org/Function_Reference/register_post_type

http://codex.wordpress.org/images/1/18/Template_Hierarchy.png
post image

Không có nhận xét nào:

Đăng nhận xét