• fans
  • 1036 reader
  • followers

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

https://codex.wordpress.org/images/1/18/Template_Hierarchy.png

tanlevis Website facebook twitter user_email

  • http://demowp.net23.net/ Quốc Việt Lê

    bạn cho hỏi sao mình không thấy cái form search trong custom post type của admin vậy

  • Minh Sang

    Chào các bạn, các bạn cho mình hỏi mặc định là nó lưu vào bảng wp_post, bây giờ mình muốn nó lưu vào bảng khác do mình tạo ra thì phải làm sao? vd: cho nó lưu vào bảng wp_test chẳng hạn..

  • cau28x

    Có ai hướng dẫn mình tạo cái Metabox trong Custom Post Type với

  • nh0cs0cksmile

    cho mình hỏi, nếu muốn thêm một category cho bài viết hay gom các bài viết của product thành đa cấp category thì phải làm sao?

  • Hiếu

    Bạn ơi mình muốn lặp tất cả các danh mục sản phẩm(trong mỗi danh mục sản phẩm có 4 sản phẩm) trong taxanomies như nào vậy

  • long

    muốn lấy cat=5 thí thực hiện câu WP_Query(‘cat=5′)
    vậy muốn lấy post hay page=5 thì truyền vào wp_query như thế nào vậy ban.

  • nguyễn thị lan beo

    sao mình làm phần single-product với archive mà nó báo link bị lỗi ko hiển thị dc nhỉ
    Pro nào biết chỉ em với

  • Cường

    Theo mình nghĩ thì bạn nên tạo một dạng riêng và áp dụng cho tin tức. Bởi vì trình bày tin tức khác với trình bày sản phẩm. Tin tức thì luôn cần tiêu đề,mô tả và ảnh. Còn về sản phẩm thì đương nhiên người dùng sẽ muốn nhìn thấy đầu tiên là ảnh sản phẩm, tên sản phẩm và giá của sản phẩm. Ngay cả cách bố trí những chi tiết đó cũng hoàn toàn khác nhau. Thân .

  • http://hinhnendienthoai.com.vn Phùng Văn Thỏa

    Admin giúp em làm bài này với, em đang muốn tạo 1 trang bán hàng và em đã show hết được sản phẩm ra rồi nhưng phần tin tức khi em thêm 1 tin tức và và click vào tin đó thì nó vẫn hiển thị theo định dạng trang sản phẩm của em, giúp em với. thank admin

Newbie

Các series nên xem trên izwebz cho newbie

Khi vào izwebz chắc nhiều bạn cho rằng các bài viết trên izwebz đều không có hệ thống gì cả? Thực chất, các bài biết đều đi theo một series của riêng nó, ví dụ như PHP, HTML & CSS, PSD2HTML, Photoshop, illustrator,… Trong bài viết này, mình sẽ tổng hợp lại các series bài viết cần thiết cho một newbie.

Izwebz facebook group

Social connect

Recent Comments

Archives