Hướng dẫn thêm Custom Meta Field cho Taxonomy

Custom meta field có thể được thêm vào các post, page và custom post type. Không những thế, bạn còn có thể thêm custom meta field vào các post tag, category và custom taxonomy. Cách thực hiện cũng khá đơn giản và trong bài này mình sẽ hướng dẫn cho các bạn cách thêm custom meta field cho taxonomy. Các meta field được sử dụng cho nhiều mục đích khác nhau, một trong số đó là plugin Taxonomy Images của Michael Fields.

Để thêm custom meta field cho taxonomy cần phải có 3 function riêng biệt: một function dùng để thêm field cho trang Add New, một function dùng để thêm field cho trang Edit Term và một function dùng để lưu các giá trị của custom field từ cả hai trang Add NewEdit Term.

Function đầu tiên sẽ thêm một custom field vào trang Add New cho taxonomy Category mặc định:

<?php
// thêm trang term
function pippin_taxonomy_add_new_meta_field()
{
     // thêm custom meta field vào trang add new term
     ?>
     <div>
          <label for="term_meta[custom_term_meta]"><?php _e( 'Example meta field', 'pippin' ); ?></label>
          <input type="text" name="term_meta[custom_term_meta]" id="term_meta[custom_term_meta]" value="">
          <p><?php _e( 'Enter a value for this field','pippin' ); ?></p>
     </div>
     <?php
}
add_action( 'category_add_form_fields', 'pippin_taxonomy_add_new_meta_field', 10, 2 );

Đây chỉ là một form HTML có sử dụng layout giống như field trang add new term mặc định của WordPress. Lưu ý quan trọng trong function này là bạn phải thiết lập tên của input là một mảng vì nếu tên field không phải là một mảng thì bạn sẽ phải lưu từng field riêng lẻ nhưng khi lưu tên field dưới dạng mảng thì bạn chỉ đơn giản lặp qua các field và lưu từng field một cách tự động.

Lưu ý ở add_action():

add_action( 'category_add_form_fields', 'pippin_taxonomy_add_new_meta_field', 10, 2 );

Tham số đầu tiên sẽ xác định taxonomy mà field này thêm vào, có định dạng là {$taxonomy_name}_add_form_fields. Ví dụ nếu muốn thêm field vào taxonomy “genres” thì sử dụng code sau:

add_action( 'genres_add_form_fields', 'pippin_taxonomy_add_new_meta_field', 10, 2 );

Bây giờ, bạn đã có một field như thế này trên trang Add New term:

taxonomy-meta

Function thứ hai sẽ thêm HTML vào taxonomy trang  Edit Term. Layout HTML ở đây có một chút khác biệt so với mặc định và chúng ta phải làm một kiểm tra xem meta field có lưu bất cứ dữ liệu nào chưa để tải về điền vào field.

<?php
// chỉnh sửa trang term
function pippin_taxonomy_edit_meta_field($term)
{
     // gán term ID vào một biến
     $t_id = $term->term_id;

     // truy xuất giá trị hiện tại cho meta field này, trả về một mảng
     $term_meta = get_option( "taxonomy_$t_id" ); ?>
     <tr>
          <th scope="row" valign="top"><label for="term_meta[custom_term_meta]"><?php _e( 'Example meta field', 'pippin' ); ?></label></th>
          <td>
               <input type="text" name="term_meta[custom_term_meta]" id="term_meta[custom_term_meta]" value="<?php echo esc_attr( $term_meta['custom_term_meta'] ) ? esc_attr( $term_meta['custom_term_meta'] ) : ''; ?>">
               <p><?php _e( 'Enter a value for this field','pippin' ); ?></p>
          </td>
     </tr>
<?php
}
add_action( 'category_edit_form_fields', 'pippin_taxonomy_edit_meta_field', 10, 2 );

Đầu tiên, chúng ta xem xét tham số $term trong function. Chúng ta cần một biến để chứa các đối tượng cơ sở dữ liệu của term. Thông tin duy nhất mà chúng ta cần cho function này là term ID, vì vậy chúng ta gán term ID vào biến, sau đó sử dụng function get_option() để truy xuất giá trị của meta term. Lưu ý, tất cả meta term được lưu trữ vào một mảng trong tùy chọn tên là “taxonomy_{$term_id}” nên để có được giá trị của meta field cụ thể, chúng ta sẽ sử dụng $term_meta[‘custom_term_meta’];

Kết quả của function này:

taxonomy-meta-edit

Tiếp theo là function lưu trữ, function này lấy giá trị nhập vào field và lưu nó trong tùy chọn taxonomy.

// function lưu field extra taxonomy
function save_taxonomy_custom_meta( $term_id )
{
     if ( isset( $_POST['term_meta'] ) )
     {
          $t_id = $term_id;
          $term_meta = get_option( "taxonomy_$t_id" );
          $cat_keys = array_keys( $_POST['term_meta'] );
          foreach ( $cat_keys as $key )
          {
               if ( isset ( $_POST['term_meta'][$key] ) )
               {
                    $term_meta[$key] = $_POST['term_meta'][$key];
               }
          }

          // lưu mảng tùy chọn
          update_option( "taxonomy_$t_id", $term_meta );
     }
}
add_action( 'edited_category', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_category', 'save_taxonomy_custom_meta', 10, 2 );

Function lấy ID của term như một tham số và kiểm tra để đảm bảo dữ liệu đang được gửi từ custom field và kiểm tra giá trị hiện tại của field được truy xuất từ cơ sở dữ liệu rồi mới thực hiện. Tiếp theo, mỗi custom field (chúng ta có thể thiết lập nhiều hơn một mảng) được duyệt qua. Trong vòng lặp, mỗi giá trị của field được đưa vào mảng $term_meta. Sau khi hoàn tất vòng lặp, tùy chọn taxonomy sẽ được cập nhật, lưu trữ các giá trị của field vào cơ sở dữ liệu.

Cũng giống như hai function trên, function lưu trữ gắn với taxonomy cụ thể bằng hook add_action(). Với ví dụ “genres”, nếu bạn gắn field vào taxonomy “genres” thì phải sử dụng các hook như sau:

add_action( 'edited_genres', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_genres', 'save_taxonomy_custom_meta', 10, 2 );

Chúc bạn thành công.


Leave a Reply

Your email address will not be published. Required fields are marked *

×