Làm thế nào để tạo Custom Post Type WordPress

Rate this post

Giới thiệu

Trong bài hướng dẫn này, chúng tôi sẽ tạo plugin để thêm 2 custom post type vào WordPress. Sau đó chúng tôi sẽ tạo layout mới cho cả 2 bằng cách dùng templates. Nếu bạn cần biết cách làm thế nào để tạo WordPress plugin, hãy tham khảo thêm bài viết này.

Chúng tôi cũng sẽ kích hoạt tính năng Custom Field của post editor cho mỗi bài viết, và hiển thị trường này trong template mới.

Custom Post Type WordPress sẽ giúp bạn kiểm soát cách nội dung hiển thị. Nếu bạn viết một bài blog post cá nhân, bạn có thể tạo layout cho chỉ những bài này. Nếu bạn viết về bình luận phim hoặc nhạc, bạn cũng có thể thêm khu vực nội dung mới cho các bài post đó để nó không xuất hiện trên blog post của bạn.

Nhưng trước khi bắt đầu, hãy cùng tìm hiểu xem custom post types trong WordPress là gì.

Custom Post Type WordPress là gì?

Nói ngắn gọn thì custom post type WordPress sẽ cho phép bạn tạo bài viết theo nội dung khác với Page và Post để tiện phân loại. Trong WordPress, mặc định các post types là Post, Page, Attachment, vâng vâng.

Thông thường bạn phải viết tất cả bài viết trong mục Posts trong Admin Control Panel wordpress, rồi phân loại chúng bằng Category. Bài viết trong mọi loại sẽ hiển thị trong cùng một danh sách, vì vậy rất khó để phân biệt giữa chúng.

Custom post type có link riêng trong admin control panel, giúp tạo ra danh sách của các bài viết cùng một loại. Posts được tạo bằng cách này cũng có thể được gắn vào category phù hợp, vì vậy bạn có toàn quyền chỉnh sửa loại category nó đang được gắn và sắp xếp theo cách bạn thích. Hãy xem qua về việc chúng tôi tạo ra 2 Custom Post Type WordPress là Movies và Movie Reviews bên dưới:danh sách post type

Movies là các bài post về Phim, còn Movie Reviews là các bài post về Bình Luận Phim.

Ở ví dụ trên, nếu người dùng tới phần Movie, cái bài viết về bình luận sẽ không nằm trong này. Nhưng nếu tạo một categories để phân loại như ‘Action’ và ‘Romance’, người dùng có thể di chuyển tới trang category để tìm tất cả phim Action và xem tất cả bài viết bình luận phim trong category đó.

Khi tạo một post type mới, bạn có nhiều cách như là link của post type nên hiện ở đâu, loại post type đó hiện trong search result, hỗ trợ đoạn trích hoặc comments hay không, vâng vâng.

Bạn có thể đổi nhiều loại text (định nghĩa trong array $labels), như là đổi Add New Post thành Add New Movie.  Ví dụ, bạn có thể đổi tên Featured Image thành Add Poster.

Bạn cũng có thể kích hoạt custom fields feature trong post editor bằng Screen Option trên cùng của editor, nó bị ẩn đi mặc định.

Tiếp tục quay lại với ví dụ về Movies và Movie Reviews, một Movie post có thể được thêm các trường như là ngày phát hành, đạo diễn, IMDB rating,… với một trích đoạn ngắn nội dung trong bài viết.custom post field wordpress

Thông thường, bất kỳ custom field nào bạn tạo ra đều có thể được chọn trong mọi loại post, vì vậy, bạn cần dùng plugin để hạn chế việc các trường này hiện lên.

Cách tạo Custom Post Type WordPress

Khi tạo thay đổi lớn trong WordPress, bạn nên tạo một plugin. Bạn cũng có thể tạo custom post types WordPress trong file functions.php của theme. Trong bài hướng dẫn này, chúng tôi sẽ tạo một plugin và sử dụng nó để tạo ra WordPress custom post type cho ví dụ về Movie Database/ Review bên trên.

Để tạo WordPress custom post type, bạn phải viết một function gọi hàm WordPress có tên register_post_type() với 2 tham số. Function phải bị hook vào init action hook, nếu không, custom post type sẽ không được đăng ký đúng.

// The custom function MUST be hooked to the init action hook add_action( 'init', 'lc_register_movie_post_type' );  // A custom function that calls register_post_type function lc_register_movie_post_type() {    // Set various pieces of text, $labels is used inside the $args array   $labels = array(      'name' => _x( 'Movies', 'post type general name' ),      'singular_name' => _x( 'Movie', 'post type singular name' ),      ...   );    // Set various pieces of information about the post type   $args = array(     'labels' => $labels,     'description' => 'My custom post type',     'public' => true,     ...   );    // Register the movie post type with all the information contained in the $arguments array   register_post_type( 'movie', $args ); }

Tất cả các custom function nên có prefixed để tránh xung đột với các plugins hoặc themes functions khác. Chúng tôi sẽ dùng prefix này cho bài hướng dẫn – LC.

2 tham số cho register_post_type() là:

  1. Tên của post type, tối đa 2o ký tự và không chứa khoảng trắng hoặc chữ in hoa
  2. Một associative array có tên $args chứa thông tin về post type trong cặp ‘key’ => ‘value’

Vì cả arguments và labels đều là arrays, sẽ tốt hơn nếu đặt biến riêng cho label, rồi biến cho $args, rồi gọi hàm này.

Array $args

Các keys thông dụng nhất của array $args ở bên dưới, không có khóa nào là bắt buộc:

Toàn bộ danh sách có thể tìm thấy tại đây WordPress Codex page for register_post_type().

Labels array

Khóa đầu tiên trong $args có tên là labels và phải là array. Nó định nghĩa nhiều loại văn bản liên quan đến custom post type WordPress. Vì chứa nhiều thông tin, tốt nhất là ta nên tạo biến $labels để chứa nó. Ví dụ code sau sẽ giúp bạn dễ hình hơn.

Bên dưới là một số khóa quan trọng của labels array này, tất cả đều không bắt buộc:

Toàn bộ danh sách có thể tìm thấy tại đây WordPress Codex page for register_post_type().

‘supports’ Array

// Enable specific features in the post editor for my post type $supports = array ( 'title', 'editor', 'author', 'thumbnail' );  // Disable ALL features of the post editor for my post type $supports = FALSE;

Một trong các khóa của $args array được đặt tên là supports. Đây là một array đơn giản nơi bạn viết ra danh sách của post editor nào bạn muốn kích hoạt cho custom post type. Mặc định, chỉ có title và editors được kích hoạt.

Bạn cũng có thể đổi thành FALSE thay cho một array, để vô hiệu toàn bộ tính năng biên tập như là title và phần nội dung. Có nghĩa là bài viết không thể được chỉnh sửa, nhưng vẫn có thể hiển thị.

Danh sách tính năng của post editor bạn có thể kích hoạt trong array $supports:

Tạo Custom Post Type trong WordPress bằng Plugin

Giờ bạn đã biết thông tin nào cần cho hàm này, bạn có thể dựng plugin, viết hàm, và hook chúng vào action hook init.

<?php /* Plugin Name: My Custom Post Types Description: Add post types for movies and movie reviews Author: Liam Carberry */   // Hook <strong>lc_custom_post_movie()</strong> to the init action hook add_action( 'init', 'lc_custom_post_movie' );   // The custom function to register a movie post type function lc_custom_post_movie() {     // Set the labels, this variable is used in the $args array   $labels = array(     'name'               => __( 'Movies' ),     'singular_name'      => __( 'Movie' ),     'add_new'            => __( 'Add New Movie' ),     'add_new_item'       => __( 'Add New Movie' ),     'edit_item'          => __( 'Edit Movie' ),     'new_item'           => __( 'New Movie' ),     'all_items'          => __( 'All Movies' ),     'view_item'          => __( 'View Movie' ),     'search_items'       => __( 'Search Movies' ),     'featured_image'     => 'Poster',     'set_featured_image' => 'Add Poster'   );     // The arguments for our post type, to be entered as parameter 2 of register_post_type()   $args = array(     'labels'            => $labels,     'description'       => 'Holds our movies and movie specific data',     'public'            => true,     'menu_position'     => 5,     'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),     'has_archive'       => true,     'show_in_admin_bar' => true,     'show_in_nav_menus' => true,     'has_archive'       => true,     'query_var'         => 'film'   );     // Call the actual WordPress function   // Parameter 1 is a name for the post type   // Parameter 2 is the $args array   register_post_type( 'movie', $args); }   // Hook <strong>lc_custom_post_movie_reviews()</strong> to the init action hook add_action( 'init', 'lc_custom_post_movie_reviews' );   // The custom function to register a movie review post type function lc_custom_post_movie_reviews() {     // Set the labels, this variable is used in the $args array   $labels = array(     'name'               => __( 'Movie Reviews' ),     'singular_name'      => __( 'Movie Review' ),     'add_new'            => __( 'Add New Movie Review' ),     'add_new_item'       => __( 'Add New Movie Review' ),     'edit_item'          => __( 'Edit Movie Review' ),     'new_item'           => __( 'New Movie Review' ),     'all_items'          => __( 'All Movie Reviews' ),     'view_item'          => __( 'View Movie Reviews' ),     'search_items'       => __( 'Search Movie Reviews' )   );     // The arguments for our post type, to be entered as parameter 2 of register_post_type()   $args = array(     'labels'            => $labels,     'description'       => 'Holds our movie reviews',     'public'            => true,     'menu_position'     => 6,     'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),     'has_archive'       => true,     'show_in_admin_bar' => true,     'show_in_nav_menus' => true,     'has_archive'       => true   );     // Call the actual WordPress function   // Parameter 1 is a name for the post type   // $args array goes in parameter 2.   register_post_type( 'review', $args); }

Nếu bạn kích hoạt plugin này, bạn sẽ thấy 2 link mới trong Admin Control Panel, ngay bên dưới Posts link.

Di chuột vào bạn sẽ thấy sub-link là “View All’ và ‘Add New’, chữ này được định nghĩa trong array $labels. Hãy xem qua thử editor xem những labels đã được thay đổi như thế nào.

Hạn chế Custom Fields cho một post type nhất định

Khi thêm custom field vào một bài post, field được lưu lại để bạn có thể nhanh chóng thêm nó vào bất kỳ bài viết mới nào. Custom field bạn vừa thêm sẽ hiện trong danh sách drop down trên mỗi bài viết. Việc này khiến bạn gặp khó khăn trong việc tìm đúng trường. Nếu bạn muốn giới hạn custom fields để chỉ có thể chọn trong một danh sách nhất định, cách dễ nhất là sử dụng plugin.

Advanced custom fields plugin thêm một editor đơn giản vào WordPress để giúp bạn tạo custom fields và cài đặt sao cho nó chỉ hiện lên trong post của bạn.

Bạn có thể thiết lập loại input nào của trường, như là text box, text area, email address, vâng vâng, hoặc cao cấp hơn nữa là Google Maps embed, nơi bạn có thể chọn một vị trí rồi làm nổi bật lên để post bài của bạn.acf dropdown trong custom post type

Bạn cũng có thể thiết lập nơi nào màn hình chỉnh sửa sẽ hiện lên.

Vì những field này được tạo bởi plugin, bạn phải sử dụng function của plugin để hiển thị chúng. Cách thức thế nào sẽ được tiếp tục trình bày ở phần tiếp theo.

Styling WordPress Custom Post Type

Để tạo theme template cho post types mới của bạn, bạn phải tạo files trong thư mục gốc của theme với đúng tên. Nếu bạn không tạo template, WordPress sẽ dùng single.phparchive.php thay thế.

Phần {post-type} của tên file phải là tên trong parameter 1 của register_post_type().

Cách tốt nhất để tạo ra 2 file trên là nhân bản single.php archive.php rồi đổi tên cho đúng. Như vậy cấu trúc sẽ tương đồng nhau trong theme của bạn, và tất cả template tags cũng đã có sẵn.

Hiển thị Custom Fields trong Posts

Để hiển thị custom fields được tạo trong trình WordPress editor, bạn có thể dùng 2 functions sau.

// Generates all custom fields attached to the post in a <ul> list the_meta();  // Get a specific piece of information echo get_post_meta( $post->ID, 'Budget', TRUE );

Những functions này phải khớp với template files được dùng để hiển thị bài viết.

the_meta()

Hiển thị tất cả custom fields đi chung với bài viết trong một <ul> list. Kết quả của tag <ul> sẽ tương tự như sau:

<ul class='post-meta'>   <li>     <span class='post-meta-key'>{your_key}</span> {your_value}   </li> </ul>

Nó hoạt động ở mọi nơi trong một single post template, nhưng nếu bạn muốn hiển thị nó ở nơi khác, nó phải đặt trong WordPress loop.

get_post_meta()

GHI CHÚ: Bạn có thể tạo nhiều custom fields với cùng tên nhưng khác giá trị. nếu có nhiều trường trùng tên, đặt FALSE sẽ trả về một array chứa tất cả chúng.

<?php   $movie_box_art = get_post_meta( $post->ID, 'Box Art', TRUE );  if (!empty($movie_box_art)) { ?>   <div class="movie-poster-box">     <img src="<?php echo $movie_poster ?>" alt="<?php single_post_title(); ?> ">   </div> <? } ?>

get_post_meta() function trả về một giá trị, bạn có thể dùng giá trị này trong điều kiện để thay đổi layout cho phù hợp.

Trong hướng dẫn trên, chúng tôi kiểm tra xem nếu phim có một box art được gắn vào nó qua custom field chưa. Nếu $movie_box_art bị trống, echo div và ảnh.

Hiển thị Advanced Custom Fields

// Display field value the_field( 'FIELD NAME' );  // Return field value get_field( 'FIELD NAME' );

Advanced Custom Fields plugin có functions của riêng nó và shortcode để hiển thị các trường.acf-ten-field

the_field(  ‘ FIELD NAME’  );

Hiển thị giá trị của một field xác định, bạn phải dùng Field Name bạn đã điền trong khi đặt field group.

get_field( ‘FIELD NAME’ );

Trả về kết quả của một trường nhất định, hữu ích khi đặt những câu truy vấn có điều kiện.

Đây là những funcitons bạn có thể sẽ phải dùng nhiều. Cũng có nhiều functions cao cấp khác, bạn có thể tham khảo trong bộ tài liệu chính thức ở đây.

Shortcode

Bạn hiển thị trường trực tiếp trong bài viết bằng shotcode ở trên.

Hiển thị Custom Post Types trên Front page

/ Hook our custom function to the pre_get_posts action hook add_action( 'pre_get_posts', 'add_reviews_to_frontpage' );   // Alter the main query function add_reviews_to_frontpage( $query ) {     if ( is_home() && $query->is_main_query() ) {         $query->set( 'post_type', array( 'post', 'movie', 'review' ) );     }     return $query; }

Custom post types không hiển thị trên trang chính mặc định, vì vậy bạn phải viết hàm mới để gọi phương pháp set của WordPress’ WP_Query object.

Function này kiểm xem nếu khách truy cập có trên trang chủ không và query active có phải là query chính được tạo bởi WordPress không.

$query->set() lấy 2 tham số:

Trong đoạn code ở trên, array bắt đầu bằng ‘post’ – vì mỗi bài viết WordPress đều có post type của “post”, vì vậy nó cần được tích hợp trong frontpage.

Nếu bạn chỉ muốn custom posts của một số loại nhất định hiện trên frontpage, bạn có thể bỏ ‘post’ và sử dụng custom post type của riêng bạn.

Chúng tôi thêm ‘movie’ và ‘review’ vào array, để trang chủ hiển thị tất post thông thường, tất cả movie post, tất cả review post.

Giá trị bạn điền phải khớp với parameter 1 trong function register_post_type().

Lời kết

Trong bài hướng dẫn bạn đã biết cách làm thế nào để tạo custom post type WordPress và thông tin nào cần để gửi lên cho chúng. Tính linh hoạt của custom post type WordPress đã là thành phần quan trọng của bất kỳ WordPress website nào. Khi kết hợp cả categories và taxonomies, bạn có toàn quyền kiểm soát cách người xem thấy bài post của bạn.

0973.393.165