Th5
10
2013

Tạo thêm “POST TYPE” trong WordPress

Chào các bạn, thành thật cáo lỗi vì lâu lắm rồi blog không có bài viết nào mới, vì bí đề tài chẳng biết viết về cái gì :D .

Thời gian qua có rất nhiều bạn gửi mail và cả comment hỏi về series bài viết Hướng dẫn làm theme WordPress. Xin chân thành cảm ơn các bạn đã quan tâm và mình hi vọng có thể giúp được các bạn phần nào.

Và theo các câu hỏi của bạn và mình cũng thấy là trong series đó, vấn đề về “POST TYPE” khá là quan trọng mà mình viết khá sơ sài nên hơi khó khăn cho các bạn. Nay bài viết này mình sẽ giới thiệu chi tiết hơn về chức năng làm nên sức mạnh cho wordpress này.

Như  trong các bài viết hướng dẫn làm theme các bạn đã đọc qua thì post type chức năng chính của nó là cho phép chúng ta tạo ra nhiều loại “post” khác nhau để chúng ta chủ động hơn trong việc thiết kế và sắp xếp nội dung.

Ví dụ: Tin tức, sản phẩm, hình ảnh,… Mỗi loại chúng ta sẽ cần 1 cách hiển thị khác nhau.

Mặc định WordPress chúng ta đã có 2 dạng post đó chính là “POST” và “PAGE”.

Và bây giờ chúng ta sẽ bắt đầu bằng việc tạo ra các post type khác, ở đây mình sẽ ví dụ tạo 1 post type riêng cho sản phẩm, dạng post này sẽ có thêm các thông tin đặc trưng đi kèm theo nó như: nhà sản xuất, chủng loại, giá, các hình ảnh minh họa, khuyến mãi, size, màu sắc,… được gọi là “CUSTOM FIELD”.

Để tạo 1 post type ta dùng hàm sau và tất nhiên hàm này đặt trong file functions.php.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
add_action( 'init', 'register_product_post' );// Call function register_product_post when start
function register_product_post() {
register_post_type(
'san-pham',
array(
'public' => true,
'label'  => 'Sản phẩm',
'labels' => array(
'name' => 'Sản phẩm',
'singular_name' => 'Sản phẩm',
'add_new' => _x( 'Đăng sản phẩm', 'add' ),
'add_new_item' => __( 'Đăng sản phẩm' ),
'edit_item' => __( 'Sửa thông tin' ),
'new_item' => __( 'Đăng mới' ),
'view_item' => __( 'Xem' ),
'search_items' => __( 'Tìm sản phẩm' ),
'not_found' =>  __( 'Không tìm thấy sản phẩm' ),
'not_found_in_trash' => __( 'Không tìm thấy trong thùng rác' )
 
),
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array('slug' => 'san-pham'),
'query_var' => true,
'supports' => array('title','editor','thumbnail'),
'menu_position' =>5,
'taxonomies' =>array('nhom-hang')
) );
}

Ở hàm trên bạn cần chú ý thông tin là “san-pham”, đây chính là tên của post type này dùng để select vào hiển thị trên website.

Giờ bạn vào trang admin, nhìn vào menu nếu bạn thấy 1 tab là “Sản phẩm”. Xin chúc mừng, bạn đã thành công ^^.

Nhưng khoan vội mừng, post type mới này cũng như là post type “post” mặc định, nó cần 1 categories để phân loại. Đối với sản phẩm bạn có thể tạo 2 categories là “nhóm hàng” và “nhà sản xuất”, ở đây ta sẽ gọi chúng là taxonomies (chức năng giống như categories thôi).

Để tạo taxonomy ta dùng hàm sau.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
add_action('init', 'build_Manufacturer_taxonomies',false);
add_action('init', 'build_Categories_taxonomies',false);
function build_Categories_taxonomies()
{
$labels = array(
'name' => 'Nhóm hàng',
'singular_name' => 'Nhóm hàng',
'search_items' =>  __( 'Tìm nhóm hàng' ),
'all_items' => __( 'Tất cả' ),
'parent_item' => __( 'Sản phẩm cha' ),
'parent_item_colon' => __( 'Sản phẩm cha:' ),
'edit_item' => __( 'Cập nhật' ),
'update_item' => __( 'Cập nhật' ),
'add_new_item' => __( 'Thêm mới' ),
'new_item_name' => __( 'Tạo nhóm hàng mới' ),
'menu_name' => __( 'Nhóm hàng' ),
);
register_taxonomy
(
'nhom-hang', 'san-pham',
array(
'hierarchical' => true,
'labels' => $labels,
'query_var' => true,
'rewrite' => true,
'show_ui' => true
));
}
function build_Manufacturer_taxonomies()
{
$labels = array(
'name' => 'Nhà sản xuất',
'singular_name' => 'Nhà sản xuất',
'search_items' =>  __( 'Tìm nhà sản xuất' ),
'all_items' => __( 'Tất cả' ),
'parent_item' => __( 'Sản phẩm cha' ),
'parent_item_colon' => __( 'Sản phẩm cha:' ),
'edit_item' => __( 'Cập nhật' ),
'update_item' => __( 'Cập nhật' ),
'add_new_item' => __( 'Thêm mới' ),
'new_item_name' => __( 'Tạo nhà sản xuất mới' ),
'menu_name' => __( 'Nhà sản xuất' ),
);
register_taxonomy
(
'manufacturers', 'san-pham',
array(
'hierarchical' => true,
'labels' => $labels,
'query_var' => true,
'rewrite' => true,
'show_ui' => true
));
}
?>

Bạn vào trang admin F5 1 phát, nếu thấy trong tab sản phẩm có thêm 2 cái link là “Nhóm hàng” và “Nhà sản xuất”. 1 lần nữa chúc mừng bạn ^^. Nếu chưa thấy thì F5 2 3 phát nữa, nếu vẫn chưa thấy thì để comment dưới bài viết này nhen. :D

Tới đây cơ bản đã xong các thành phần thiết yếu cho 1 post type rồi. Giờ chúng ta sẽ tạo các thông tin riêng (CUSTOM FIELD) cho post type này. Ví dụ như: giá, hình ảnh minh họa, ..

Vì nội dung code khá dài nên mình không show ở đây, các bạn chịu khó download file sau về coi nhen Custom_fields.php.

Bạn đọc là hiểu thôi, cũng đơn giản lắm. ^^

vậy là coi như xong xuôi hết việc tạo post type.

Giờ chúng ta sẽ tìm hiểu làm sao để hiển thị chúng ra.

Việc đầu tiên để hiển thị là hiển thị danh sách các taxonomies của post type mới này, tương tự như hiển thị list categories của post vậy, bạn đặt hàm sau vào chỗ muốn hiển thị.

?
1
2
3
<ul>
<?php wp_list_categories( 'hide_empty=0&amp;amp;show_option_none=Chưa có danh mục&amp;amp;taxonomy=nhom-hang&amp;amp;title_li=' ); ?>
</ul>

Bạn có thấy thông số taxonomy=nhom-hang, tại đây bạn để tên của taxonomy mà bạn muốn hiển thị, tương tự cho nhà sản xuất.

Khi click vào 1 danh mục nào đó bạn sẽ được chuyển đến trang taxonomy.php.

Tại trang này bạn sẽ hiển thị tất cả các sản phẩm có trong taxonomy này.

bạn copy đoạn code sau để vào file taxonomy.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
 global $query_string;
 parse_str( $query_string, $args );
 $args[posts_per_page] =16;
 query_posts($args );
 
if(have_posts() ){
 ?&amp;gt;
 &amp;lt;h1&amp;gt;sản phẩm&amp;lt;/h1&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;ul&amp;gt;
 &amp;lt;?php
 // The Loop
 while ( have_posts() ) : the_post();
 //Infomation of this product
 
$pro_desc = get_post_meta(get_the_id(), 'pro_desc',true);
 $image =  get_post_meta(get_the_id(), 'image',true);
 $slide =  get_post_meta(get_the_id(), 'slide',true);
 $discount = get_post_meta(get_the_id(), 'discount',true);
 $price = get_post_meta(get_the_id(), 'price',true);
 $discount_price $price - (($price * $discount)/100);
 ?>
 <li>
 <div>
<a href=&amp;quot;<?php the_permalink();?>&amp;quot;>
<img src=&amp;quot;<?php echo $image; ?>&amp;quot; alt=&amp;quot;<?php the_title();?>&amp;quot; />
</a>
<div><a href=&amp;quot;<?php the_permalink();?>&amp;quot;><?php the_title();?></a></div>
<?php if(is_int($discount_price) &amp;amp;&amp;amp; $discount_price >0) {
echo '<div><span>Giá: ' . $price;?></span>&amp;amp;nbsp;&amp;amp;nbsp;gi?m <?php echo $discount . '%</div>';
}?>
<div>Giá: <span><?php echo $discount_price; ?>k</span></div>
</div>
</li>
<?php
endwhile;
 
?>
<li></li>
<div>
<?php   bt_paginate(); ?>
</div>
<?php
}
else{
?>
<h1>Chua có sản phẩm!</h1>
</div>
<ul>
<?php
}
?>

Vậy là xong file taxonomy.php, bạn test lại thử xem sao. ^^

Nếu lúc này bạn click 1 sản phẩm thì sẽ được chuyển đến file single.php. Vậy là sai quẻ rồi ^^, file single.php của chúng ta là dùng để hiển thị nội dung của post và nó có cách hiển thị khác với sản phẩm của chúng ta. Giờ làm sao đây???

Đơn giản thôi, bạn tạo file với tên theo dạng sau  single-<post type>.php, ở bài viết này chúng ta sẽ có file tên là single-san-pham.php. Bạn click lại 1 sản phẩm thì kỳ lạ thay bây giờ lại chuyển đến file này rồi … WordPress hay quá!!! :P

Giờ thì đơn giản thôi, bạn thiết kế file này sao cho phù hợp với sản phẩm rồi get các thông tin truyền vào.

Bạn sẽ có dạng code cơ bản sau cho file single-san-pham.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php the_post();
$pro_desc = get_post_meta(get_the_id(), 'pro_desc',true);
$image =  get_post_meta(get_the_id(), 'image',true);
$slide =  get_post_meta(get_the_id(), 'slide',true);
$discount = get_post_meta(get_the_id(), 'discount',true);
$price = get_post_meta(get_the_id(), 'price',true);
$discount_price $price - (($price * $discount)/100);
?>
<h1><?php the_title();?></h1>
 
<img src=&amp;quot;<?php echo $image; ?>&amp;quot; alt=&amp;quot;<?php the_title();?>&amp;quot; />
<h2><?php the_title();?></h2>
<p>
Giá bán: <span><?php echo $price ; ?>k</span><br/>
<?php if(is_int($discount_price) &amp;amp;&amp;amp; $discount_price >0) {
echo 'Sale: <span>' . $discount_price . 'k (' .$discount. '% OFF)</span>' ;
}?>
</p>
<p>
<strong>Mô tả:</strong><br />
<?php echo '<pre>'. $pro_desc . '</pre>'; ?>
</p>
<?php the_content();?>

Vậy là xong rồi.

Bài viết của mình đến đây là hết. Hi vọng bài viết này giúp bạn có cái nhìn rõ nét hơn về post type, nếu các bạn có thắc mắc hay góp ý gì để lại comment dưới bài viết này hoặc gửi mail cho mình nhé. Một lần nữa cảm ơn các bạn đã ghé thăm và ủng hộ tdkhoa.net nhé.

Chúc các bạn thành công và có 1 cuối tuần vui vẻ, ăn chơi xả láng nhé.

À quên, đây là source của bài hướng dẫn này, các bạn xem tham khảo nhé.

POST TYPE

Đăng ký nhận bài viết mới qua email.

Tác giả:

Tạo thêm “POST TYPE” trong WordPress Tạo thêm “POST TYPE” trong WordPress
8 10 1909

Leave a comment